Frage

Diese Situation ist für einige von Ihnen wahrscheinlich nicht ganz ungewöhnlich:Sie müssen einige Funktionen in eine Klasse einfügen, aber der perfekte Name (*) für diese Klasse wird von einer der Klassen in übernommen System Namespace oder ein anderer Namespace/eine andere Klasse, die nicht Ihnen, aber Ihnen gehört using/importing.

(*) Mit perfekt meine ich kleine, prägnante und klare Namen.

Ich habe zum Beispiel eine Utils Klasse, die eine hat Diagnostics (hauptsächlich Debug-Utilities) Klasse und a Drawing Klasse.Ich könnte:

  1. habe einen DrawingUtils Klasse und a DiagnosticsUtils Klasse, aber das riecht einfach nach schlechter Struktur.
  2. Wählen Sie einen Thesaurus und haben Sie Schluss mit einem schlechteren, längeren oder umständlicheren Namen, der gelegentlich immer noch nicht verwendet wird.
  3. Schreiben Sie Klassennamen in meiner Muttersprache statt in Englisch.
  4. Fragen Sie die klugen Köpfe von StackOverflow.

Ich denke, die Optionen 1-3 sind nicht erfolgversprechend :(

BEARBEITEN:

Da meine gewählte Antwort das Problem nicht endgültig angeht (ich auch nicht), Was ich Menschen, die sich in der gleichen Situation befinden, empfehlen würde, ist, sich zu fragen:Werden Sie häufig die widersprüchliche BCL-Klasse/den widersprüchlichen BCL-Namespace verwenden?Wenn nein, lassen Sie Ihren Namen in Konflikt geraten (wie ich es bei Diagnostics getan habe).Wenn ja, fügen Sie ein Wort hinzu Grenzen die Möglichkeiten Ihrer Klasse/Ihres Namensraums.

In der Praxis bedeutet das:
"Drawing":Etwas, das anzieht.
"MyCustomControlDrawing":Etwas, das anzieht nur An MyCustomControl.z.B.: "WidgetDrawing".

EDIT2:

Eine weitere Lösung, die Sie beim nächsten Mal ausprobieren sollten: Erweiterungsmethoden (mit freundlicher Genehmigung von Rasenmäher).

War es hilfreich?

Lösung

Verwenden Sie Namespaces, um Ihre Klassen in anderen Namespaces aus den Klassen zu disambiguieren. Verwenden Sie entweder vollständig qualifizierte Namen oder eine Verwendung anhand von Anweisungen, die dem kompilieren, was Sie benötigen:

using Type = MyReallyCoolCustomReflector.Type;

Wenn Sie nun die Typ -Klasse noch aus dem Systemnamenspace verwenden möchten:

System.Type sysType = anObject.GetType();

Im Allgemeinen versuche ich, Namen Duplikate zu vermeiden, aber das funktioniert nicht immer so. Ich mag auch einen einfachen, lesbaren und wartbaren Code. So oft ist es eine Kompromissentscheidung.

Andere Tipps

Ich sehe kein Problem damit, die Namen zu behalten Drawing, Diagnostics usw. Das ist einer der Zwecke der Namespaces, um Namenskonflikte zu lösen.

Das Schöne an Namespaces ist, dass Sie damit Klassen mit identischen Namen erstellen können.Sie können einem Namespace einen Alias ​​zuweisen, wenn Sie ihn mit a in Ihre Datei importieren using Stellungnahme.

using MyAlias = My.Custom.Namespace;

Dadurch bleiben Ihre Kurse von denen von Microsoft getrennt.

Sie können Ihre Klassen dann als referenzieren

MyAlias.Diagnostics

Alternativ könnten Sie dem Namespace von Microsoft einen Alias ​​zuweisen. Ich würde dies jedoch nicht empfehlen, da es andere Entwickler verwirren würde.

Für mich ist es wirklich nicht den Aufwand wert, widersprüchliche Klassennamen absichtlich zu schreiben. Sie werden andere Entwickler verwirren, die mit Ihrer Codebasis nicht vertraut sind, da sie erwarten, BCL -Klassen zu verwenden, aber stattdessen mit Ihrer (oder umgekehrt). Dann verschwenden Sie nur ihre Zeit, wenn sie spezifische schreiben müssen using Aliase.

Ehrlich gesagt ist es eine nützliche Fähigkeit, aussagekräftige Kennungsnamen zu finden, aber es lohnt sich nicht, Ihre Entwicklung zu verzögern. Wenn Sie sich nicht schnell etwas Gutes einfallen lassen, zufrieden mit etwas mittelmäßig und weitermachen. Es ist wenig Wert, über die Namen zu muhen. Ich wage zu sagen, dass es produktivere Dinge gibt, die Sie tun könnten.

BEARBEITEN: Ich glaube auch nicht, dass "klein" ein Bestandteil einer "perfekten" Kennung ist. Sicher und klar, sicher, aber wenn es einen längeren Namen braucht, um den Zweck eines bestimmten Konstrukts zu vermitteln, dann sei es so. Immerhin haben wir IntelliSense.

Wenn Sie eine Namensraumkollision vermeiden möchten, können Sie Folgendes tun:


  • Kollidieren Sie nicht, wählen Sie stattdessen einen eindeutigen Namen.

Beispiel:

Wenn Sie einen Mathematikkurs erstellen, können Sie Ihren benennen CamiloMartin.MathHelper


  • Verwenden Sie den langen Namespace, um zwischen Kollisionen zu unterscheiden.

Beispiel:

public class MyClass
{
    public int SomeCalculation(int a, int b)
    {
        return MyNamespace.Math.SomeFunc(a, b);
    }
}

  • Verwendung eines Alias ​​zur Unterscheidung.

Beispiel:

using System.Math;
using SuperMath = MyNamespace.Math;

namespace MyNamespace
{
    public class MyClass
    {
        public int SomeCalc(int a, int b)
        {
             int result = Math.abs(a);
             result = SuperMath::SomeFunc(a, b);

             return result;
        }
    }
}

Nur für den Datensatz: .NET Framework hat nicht weder Utils Noch Diagnostics Klasse. (Hat aber hat System.Diagnostics Namespace.)

Persönlich mag ich keine allgemeinen Klassen wie Klassen wie Utils Da ihre Methoden nicht sehr auffindbar sind (und normalerweise entweder zu allgemein oder zu spezifisch), würde ich ihre Verwendung nur für interne Klassen rechtfertigen.

Was den Rest betrifft - ich stimme anderen in diesen Namespaces zu. (Obwohl ich zweimal darüber nachgedacht hätte, die Klasse zu nennen, wenn es bereits eine Klasse in gibt System Mit dem gleichen Namen, nicht wegen Namenskonflikte, sondern weil der Grund, warum ich nicht "Original" -Klasse verwenden kann, bedeuten könnte, dass die Klasse, die ich erstellen möchte, semantisch anders ist.)

Oft ist es möglich, einen spezifischeren Namen zu wählen. Nehmen Utils zum Beispiel. Absolut alles kann als Utilitiy bezeichnet werden. Für den Leser Ihres Code ist dieser Klassenname wertlos.

Oft sind Utility -Kurse eine Sammlung von Methoden, die nirgendwo anders passen. Versuchen Sie, sie dort zu platzieren, wo sie gehören, oder gruppieren sie nach einigen Kriterien und verwenden Sie die Gruppe als Klassenname. Eine solche Gruppierung ist meiner Erfahrung nach immer möglich.

Im Algemeinen:

  1. Das tun wir (hey, wir können es später neu refaktor)

  2. Benutzte es ein- oder zweimal, aber nur in wichtigen Klassen. Besonders nützlich, wenn Sie den "perfekten" Namen noch nicht kennen.

  3. Denken Sie nicht einmal darüber nach ...

Die Verwendung von Namespace -Aliase macht keinen Spaß. Also vermeide ich es, wenn ich kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top