2009-10-29 3 views
13

Gibt es festgelegte Benennungs- oder Kodierungskonventionen für die Definition von namespace or type aliases in C#?Typ-/Namespace-Aliaskonventionen in C#

Für diejenigen, die nicht wissen, hat die C# -Sprache eine Funktion, wo Aliase lokal für eine Datei für Namespaces und Typen definiert werden können. Dies kann nützlich sein, wenn Namenskonflikte mit Bibliotheken von Drittanbietern auftreten und Typnamen in Ihrem Code verkürzt werden. Unten ist ein Beispiel dafür, wie es aussieht.

using Forms = System.Windows.Forms; 

Die meisten Beispiele, die ich rund um die Web gesehen haben neigen dazu, über unabbreviated aktivierten Namen als Aliasnamen wie die Alias ​​Forms im Beispiel zu verwenden. An einigen Stellen einschließlich der official MSDN page, die Beispiel mit einem Alias ​​von colAlias ​​ für den Namespace System.Collections erklärt. Um es komplizierter zu machen, kann es eine Präferenz für einige geben, unterschiedliche Richtlinien zu wählen, abhängig davon, ob ein Namespace-Alias ​​oder ein Typ-Alias ​​definiert wird.

Um einige Hintergrundinformationen zu geben, warum ich mich für irgendwelche Richtlinien mit Alias-Namen interessiere, werde ich erklären, was ich mache. In einem kürzlichen Projekt habe ich begonnen, ein Muster zu vereinfachen, bei dem ich mehrere Klassen habe, die von einer generischen Basisklasse erben, die komplexe Typargumente akzeptiert, indem ich Typaliasnamen verwende.

Mit dieser Technik wird das untenstehende komplexe Beispiel viel lesbarer, sobald Aliase verwendet werden.

public class MyClass: MyGenericBaseClass<TripleLindyFancyAlgorithm<List<SomeValueType>>, List<SomeValueType>> 
{ 
    public override List<SomeValueType> DoSomething(TripleLindyFancyAlgorithm<List<SomeValueType>> operation) 
    { 
     // ... 
    } 
} 

Und unter der MUST-Cleaner-Version mit Typ Aliase.

using Result = List<SomeValueType>; 
using Algorithm = TripleLindyFancyAlgorithm<List<SomeValueType>>; // Note: cannot reference an alias within an alias definition! 

public class MyClass: MyGenericBaseClass<Algorithm, Result> 
{ 
    public override Result DoSomething(Algorithm operation) 
    { 
     // ... 
    } 
} 

Obwohl dies viel mehr simpel aussieht, ist es leicht zu vergessen, dass ein Alias ​​wie Ergebnis eigentlich nur ein Alias ​​für Liste ist und dass es kein tatsächlicher Typ Ergebnis genannt. Um die Konzepte visuell zu trennen, beachte ich, dass man einigen Präfix-Konventionen folgen muss, die der Verwendung von Unterstrichen "_" vor privaten Mitgliedern ähnlich sind, um Typ-Aliase von tatsächlichen Typen zu unterscheiden. Bevor ich das mache, möchte ich jedoch sicherstellen, dass ich das Rad nicht neu erfinde, da es dort vielleicht schon etabliertere Konventionen gibt.

Antwort

9

Namespace-Aliase sind kein häufiges Merkmal der meisten Codebasen - der letzte Ort, an dem ich es benutzt habe, war dem Seniorentwickler nicht vertraut, obwohl er viele Jahre mit C# gearbeitet hat.

Da es selten ist, wurden Konventionen dafür nicht entwickelt.

Ich würde sagen, wenn Sie Aliase verwenden möchten, besprechen Sie dies mit Ihrem Team, um Ihre eigene Konvention zu erstellen.

Mehrere verschiedene Arten Ich habe Aliase gesehen verwendet:

  • Eine Abkürzung des Namespace. Normalerweise die Großbuchstaben im Namensraum.
  • Das Ende des Namensraums - wenn Plural de-pluralisiert.
  • Ein beschreibender Kurzname.
+1

Großartig das ist wirklich der erste Beitrag, der über Konventionen diskutiert, was ich ursprünglich mit dieser Frage getan habe. – jpierson

+0

Ausgezeichnet mit dem Kopfgeld. Vielen Dank, dass Sie sich mit der gestellten Frage befasst haben (d. H. Nicht nur Ihre eigenen Präferenzen angegeben haben) und diese mit realen Erfahrungen unterstützt haben. –

+0

@MatthewStrawbridge - Danke dafür. Wie Sie sagen, scheinen die anderen Antworten die Frage überhaupt nicht anzusprechen, sondern persönliche Präferenzen zu enthalten. Die Ungleichheit in der Antwort zeigt auch, dass es tatsächlich keinen Konsens über Konventionen für Namespace-Aliase gibt ... – Oded

6

Persönlich würde ich es nur verwenden, um intelli-sense sauber zu halten.

Wenn Sie Typen umbenennen, öffnen Sie die Pandora-Box für Wartungsprogrammierer.

+0

Während ich zustimme, dass die Verwendung dieser Technik in Fällen, in denen es nicht gerechtfertigt ist, sehr schlecht für die Wartung wäre, denke ich, dass das ursprüngliche komplexe Beispiel ohne Verbesserungen wahrscheinlich noch mehr eine Sorge ist. – jpierson

+1

Ich mag verrückt sein, aber ich denke, es ist lesbarer, wenn es so explizit ist. – ChaosPandion

+0

ChaosPandion, vielleicht dein Recht. Der Hauptpunkt ist jedoch, Namenskonventionen zu diskutieren, obwohl ich denke, dass es wichtig ist, Codierungsrichtlinien in Bezug auf die Verwendung von Aliasen in Betracht zu ziehen. – jpierson

14

Ich würde nur Aliase im Falle von Namespace-Konflikt verwenden (d. H. Nur wenn ich hatte zu).

Für mich zumindest jede andere Verwendung ist nur verwirrend und eine Ablenkung.

+2

Aber Sie müssen zugeben, dass in dem Beispiel, das ich gab, wenn Sie mehr als 100+ ähnliche Klassen schreiben mussten, die alle das gleiche Muster hatten, dass die Typ-Aliasing-Funktion dramatisch die Lesbarkeit verbessert. Obwohl ich zustimme, dass es verwirrend sein kann, denke ich, dass es in dieser Art von Beispiel tatsächlich genauso, wenn nicht verwirrender ist, das komplexe Beispiel so zu lassen, wie es ist. – jpierson

+0

über das Beispiel - Verschachtelung Generics, die tief wäre fast nie notwendig, und wenn ja, es ist ein Zeichen, dass die Klassen neu gestaltet werden sollte, anstatt ein Zeichen ein Alias ​​sollte verwendet werden. das ist einfach zu verwirrend für Sterbliche. –

+0

@Dave - Ein sehr gültiger Punkt, obwohl, um in die Details des Designs zu kommen, ich Details des tatsächlichen Codes preisgeben müsste, der mich veranlasste, diese Frage zu stellen.Um produktiv zu sein, werde ich versuchen, den Fokus weniger darauf zu lenken, wie sinnvoll das Beispiel ist und ob ein Typalias verwendet werden soll oder nicht, und mehr auf Konventionen für Typalias im C# -Code. – jpierson

4

Die beiden häufigsten Fälle für Namespace-Aliase sind:

  1. ich es sah und ich benutze es (als Trend)
  2. I Port-Code aus einer anderen Sprache

Für der erste Fall, kein Kommentar. Für die zweiten Code aus C und Verwendung Namespace-Aliase für Praktikabilität ein gutes Beispiel wie portiert:

using i64 = System.Int64; 
using u8 = System.Byte; 
using u32 = System.UInt32; 
using u64 = System.UInt64; 

Auch wenn Sie die oben genannte Aliase als faul Programmierung betrachten, sie helfen, Fehler zu vermeiden.

+3

Ihr Codebeispiel ist kein Alias-Aliasnamen, sondern Alias-Typ (beide mit einer 'using'-Direktive). – Oded

+1

Rechts. Genauso wie "StringBuilder = System.Text.StringBuilder;" von ChaosPandion. Meine bisherigen Erfahrungen besagen, dass die meisten Leute es als Namensraum-Aliasing betrachten. –

+0

Die meisten benutzen sie wahrscheinlich austauschbar, wenn sie sie überhaupt benutzen. – Oded

2

Ich denke, die Leute, die geneigt sind, sie überhaupt nicht zu verwenden sind geben die Antwort, die Sie gefragt haben. Das ist die Konvention. Das soll nicht heißen, dass es nicht nützlich sein kann, aber es nicht zu verwenden, bleibt die Norm.

+0

Faire Bewertung, bitte denken Sie daran, einen Kommentar zu jemandes Antwort oder meine ursprüngliche Frage zu machen. – jpierson

+1

Warum argumentieren einige der anderen gegen die Verwendung verwenden, sagt niemand, es ist die Antwort auf die Frage "Gibt es irgendwelche Benennungs- oder Kodierungskonventionen für die Definition von Namespace oder Typ Aliase in C#?" Ich mache :) –

+0

Also ich denke Ihre Antwort ist "Nein", wenn das eine einfache und akzeptable Antwort wäre. Obwohl aus anderen Kommentaren ersichtlich ist, dass es einige Konventionen gibt, obwohl diese vielleicht nicht sehr weit verbreitet oder konsistent sind. – jpierson

2

Sie könnten eine Konvention übernehmen, um sie für die Abstraktion zu verwenden.

using Id = System.Int32; 

Auf diese Weise können Sie einfach ersetzen Sie einfach die Zeile mit

using Id = System.Guid; 

an einem gewissen Punkt und kein anderer Code würde sich ändern müssen (vorausgesetzt, Sie nicht durch die Abstraktion hat spähte Abhängigkeiten von der erstellen tatsächlicher Typ ...)

+0

Dies funktioniert für einfache Typen, aber sobald Sie eine Klasse oder ein generisches haben, gibt es einige Schmerzen, da die Methoden selten über diese verteilt sind, außer für sehr allgemeine Fälle wie ToString(). Ich tendiere jedoch dazu, dies aus dem Grund zu tun, den Sie sowieso auflisten. Es verbessert tatsächlich die Lesbarkeit, um einen Typ anzugeben, der in dem Kontext, in dem er verwendet wird, sinnvoll ist. –

0

ich nur im allgemeinen sie verwenden, wenn ich zwei ähnlich benannte Klassen in unterschiedlichen Namensräumen verwenden muß, und will nicht vollständig den Typen im Code angeben:

using xItem = My.Project.NameSpace.Item; 
using yItem = Your.ThirdParty.Framework.Item;