Frage

Ich bin oft in einer Situation, wo ich ein Konzept durch eine Schnittstelle oder Klasse dargestellt habe, und dann habe ich eine Reihe von Unterklassen / Subinterfaces, die sie verlängern.

Zum Beispiel: Ein generischer „DoiGraphNode“ A "DoiGraphNode" repräsentiert eine Ressource A "DoiGraphNode" repräsentiert eine Java-Ressource A "DoiGraphNode" mit einem zugehörigen Pfad, usw. usw.

kann ich denke an drei Namenskonventionen, und würde es begrüßen, Kommentare zu, wie zu wählen.


Option 1: immer mit dem Namen des Konzepts beginnen

.

So:. DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath, etc

Pro: Es ist sehr klar, was mit denen ich zu tun, es ist einfach, um alle Optionen zu sehen, ich habe

Con: Nicht sehr natürlich? Alles sieht gleich aus?


Option 2: Legen Sie die speziellen Sachen am Anfang

.

So: DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode, usw., usw.

Pro: Es ist ganz klar, wenn ich es im Code sehen

Con: Findet es schwierig sein könnte, vor allem, wenn ich mich nicht erinnern, den Namen, den Mangel an visueller Konsistenz


Option 3: Setzen Sie die spezielle Sachen und einige der redundanten Text entfernen

So: DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath

Pro: Nicht viel zu schreiben und lesen Con: Sieht aus wie cr * p, sehr inkonsequent, mit anderen Namen in Konflikt

War es hilfreich?

Lösung

Name für das, was sie sind.

Wenn sie zu benennen ist hart oder mehrdeutig, es ist oft ein Zeichen dafür, dass die Klasse zu viel tut (Single Responsibility Principle).

Um Konflikte zu vermeiden Benennen Sie Ihre Namensräumen wählen entsprechend.

personnally, würde ich 3

Andere Tipps

Verwenden Sie, was Sie mögen, es ist eine subjektive Sache. Das Wichtigste ist, klar zu machen, was jede Klasse repräsentiert, und die Namen sollten so beschaffen sein, dass die Vererbungsbeziehungen Sinn machen. Ich glaube nicht wirklich, es ist so wichtig, die Beziehungen in dem Namen zu codieren, obwohl; das ist, was Dokumentation ist für (und wenn Sie Ihre Namen angemessen für die Objekte sind, sollen Menschen in der Lage sein, gute Vermutungen darüber zu treffen, was erbt von dem, was).

Für das, was es wert ist, verwende ich in der Regel die Option 3, und aus meiner Erfahrung auf anderer Leute Code Option suchen 2 ist wahrscheinlich häufiger als Option 1.

Sie könnten einige Hinweise in einem Coding-Standards Dokument finden, zum Beispiel gibt es das IDesign Dokument für C # hier .

Ich persönlich ziehe Option 2. Dies ist im Allgemeinen die Art, wie die .NET Framework Namen seiner Objekte. Zum Beispiel bei Attributklassen suchen. Sie alle enden in Attribut (TestMethodAttribute). Das gleiche gilt für Eventhandler. OnClickEventHandler ist ein empfohlene Name für eine Ereignisbehandlungsroutine, die das Click-Ereignis behandelt

Ich versuche, dies in der Regel meinen eigenen Code und Schnittstellen in der Entwicklung zu folgen. So erzeugt ein IUnitWriter ein StringUnitWriter und DataTableUnitWriter. Auf diese Weise habe ich immer wissen, was ihre Basisklasse ist, und es liest mehr natürlich. Selbsterklärend Code ist das End-Ziel für alle agilen Entwickler so scheint es gut für mich zu arbeiten!

Ich nenne in der Regel ähnlich wie die Option 1, vor allem, wenn die Klassen polymophically verwendet werden. Meine Argumentation ist, dass das wichtigste Bit an Information zuerst aufgeführt ist. (Das ist die Tatsache, dass die Unterklasse ist im Grunde, was die Vorfahre ist, mit (meist) Erweiterungen ‚hinzugefügt‘). Ich mag diese Option auch, weil, wenn Listen von Klassennamen sortieren, die entsprechenden Klassen zusammen aufgeführt werden. D. h Ich nenne in der Regel die Übersetzungseinheit (Dateiname) die gleiche wie der Klassenname so verwandte Klassendateien werden natürlich zusammen aufgeführt werden. Ähnlich ist dies sinnvoll mit inkrementeller Suche.

Auch wenn ich die Option 2 früher in meiner Karriere als Programmierer verwenden neigten, vermeide ich es jetzt, weil, wie Sie sagen, es ist ‚inkonsistent‘ und scheinen nicht sehr orthogonal.

Ich verwende oft Option 3, wenn die Unterklasse wesentliche Erweiterung oder Spezifikation sieht, oder wenn die Namen seien ziemlich lang. Zum Beispiel sind meine Dateisystemnamen Klassen von String abgeleitet aber sie erheblich die String-Klasse erweitern und haben eine deutlich andere Verwendung / Bedeutung:

Directory_entry_name von String abgeleitet fügt umfangreiche Funktionalität. File_name von Directory_entry_name abgeleitet hat eher spezialisierte Funktionen. Directory_name von Directory_entry_name abgeleitet hat auch eher spezielle Funktionen.

Auch zusammen mit Option 1, verwende ich in der Regel einen unvollständigen Namen für eine Schnittstelle Klasse. Zum Beispiel könnte ich eine Klasse interence Kette haben:

  • Text (eine Schnittstelle)
  • Text_abstract (Abstract (Basis) Verallgemeinerung Klasse)
  • Text_ASCII (Betonklasse spezifisch für ASCII-Codierung)
  • Text_unicode (konkrete Klasse spezifisch für Unicode-Codierung)

Ich mag eher, dass die Schnittstelle und die abstrakte Basisklasse automatisch zuerst in der sortierten Liste angezeigt werden.

Option drei folgt logisch aus dem Konzept der Vererbung. Da Sie die Schnittstelle oder Klasse sind spezialisiert, soll der Name zeigt, dass es nicht mehr ist die Basisimplementierung (falls vorhanden).

Es gibt eine Vielzahl von Werkzeugen, um zu sehen, was eine Klasse erbt von, so ein kurzen Name, um die wirkliche Funktion der Klasse angibt, geht weiter als den Versuch, in den Namen zu viele Typinformationen zu packen.

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