2009-03-23 13 views
14

Während meines letzten Projekts ist mir aufgefallen, dass es sehr praktisch ist, Designmuster-Namen in Klassennamen aufzunehmen. Zum Beispiel:Wann soll ein Designmuster in den Klassennamen aufgenommen werden?

  • ContextLazyFactory
  • RunOnceMediator
  • ThirdPartyMediator
  • MyProjectCliFacade
  • BinaryGate

Es ist das Projekt leicht zu lesen macht. Zusätzlicher Vorteil ist, dass Sie keine eigenen Namen wie "RunOnceManager", "ContextDelayedConstruction", "ThirdPartyInterface" usw. verwenden, die nur für den Autor eine scharfe Bedeutung haben können. Auf der anderen Seite möchte ich keine Klassen wie vector_container in der STL sehen. Wie denkst du?

Meine aktuelle Ansicht zu diesem Thema ist: Klassen, die wichtige Knoten in der Klassenhierarchie sind, sollten ihr Entwurfsmuster in ihrem Namen haben, um die Hierarchiestruktur zu betonen und das Projekt viel einfacher zu lesen.

Antwort

20

Es scheint mir in vielen Fällen natürlich:

  • Entwurfsmuster zu erklären benannt sind, was sie tun
  • Klassen zu erklären benannt sind, was sie

tun, wenn die einfachste Art der Erklären Sie den Zweck einer Klasse ist in Design-Muster Begriffe, warum nicht verwenden?

Auf der anderen Seite, wenn das Design-Muster ist meistens zufällig dann ausschließen. Zum Beispiel kann eine Klasse ein Singleton sein, aber das ist nicht der Hauptzweck im Leben, also würde ich nicht erwarten, "Singleton" im Namen zu sehen. Vergleichen Sie das mit einer Fabrik, deren Hauptzweck es ist, eine Fabrik für andere Objekte zu sein - "FooFactory" macht durchaus Sinn.

+1

Downwoters: Bitte geben Sie einen Kommentar an, um zu erklären, warum Sie mit einer Antwort nicht einverstanden sind, wenn Sie den Newsletter ablehnen. –

+0

+1 vollständig zustimmen. – eglasius

+0

@Jon in diesem Fall denke ich, es ist fair anzunehmen, dass Downvoter sich stark fühlen, entweder in den Namen zu schreiben oder gar nicht, in beiden Fällen glaube ich nicht, dass man viel mit dieser Information machen kann (außer hereinzukommen eine lange Diskussion darüber). – eglasius

0

Ich stimme dir zu. Das einzige, was ich hinzufügen würde (was wirklich selbstverständlich ist), ist sicherzustellen, dass der Mustername innerhalb des Klassennamens das tatsächlich verwendete Muster verwendet.

Ich sah einmal eine Klasse namens XxxxFactory (oder so ähnlich) und es hatte keine Ähnlichkeit zu einem Fabrikmuster überhaupt!

0

Ich verwende auch den Design-Muster-Namen in den Klassennamen, um die Lesbarkeit zu erhöhen und für andere Menschen leicht zu verstehen.

Vektoren bedeutet für mich schon eine Sammlung also keine Notwendigkeit für _collection. Btw-Container ist kein Designmuster.

0

Wenn der resultierende Name klar genug ist, gehen Sie vor und verwenden Sie ihn.

Aber es kann Umstände geben, dass der resultierende Name entweder ungeschickt oder vage ist. Verwenden Sie in diesem Fall den richtigen Namen.

1

Ich denke, mit Design-Mustern in Namen ist eine große Idee.Zum Beispiel in einem meiner Spiele habe ich:

GameLevelAbstract 
InGameArea 
MainMenu 

die beiden zweiten Klassen (InGameArea und MainMenu) Unterklasse GameLevelAbstract und implementieren es rein virtuelle Methoden ist. Ich kann in meiner Quellansicht sehen, dass diese Klasse abstrakt ist und sofort weiß, dass es das ist oder nicht, wonach ich suche.

Ein weiteres Beispiel ist meine Grafik Fassade:

GraphicsFacade 
OpenGLGraphics 
DirectXGraphics 

Genau das gleiche Setup wie ich oben war, außer dass es mit Grafiken beschäftigt.

Ich finde das Verwenden des Entwurfsmusters im Namen, um nützlich und informativ zu sein, wenn ich nach einer Klasse suche. Ich glaube, dass einige Dinge nicht im Namen wie Singleton verwendet werden sollten, aber Flyweight, Factory oder Facade sind Beispiele für Designnamen, die meiner Meinung nach gut in den Namen einer Klasse passen, die diese Muster implementiert.

Ich denke, wenn Sie gute Klassennamen verwenden, die dem Programmierer helfen, einen guten Überblick darüber zu bekommen, was Ihre Klasse auf einen Blick macht, ist das eine gute Sache.

Ich glaube nicht, dass die Aussage etwas ist eine Datenstruktur oder ein Algorithmus ist in den meisten Fällen eine gute Sache. "LinkedListDataStructure" oder "BubbleSortAlgorithm" fügen dem Verständnis des Programmierers der Klasse nichts hinzu, da "LinkedList" in seiner Funktion offensichtlich ist.

+0

+1 Ich mag auch "abstrakt" in den Klassennamen für abstrakte Klassen setzen. Die standardmäßige .NET-Namenskonvention wäre "MyClassBase", aber ich würde "AbstractMyClass" bevorzugen. – MattDavey

+0

* "LinkedListDataStructure" oder "BubbleSortAlgorithm" fügen dem Verständnis des Programmierers nichts hinzu. * Stimmen Sie dem auch vollkommen zu. Der Name der Klasse ist Teil ihrer Schnittstelle, und die Schnittstelle sollte keine Implementierungsdetails wie diese ankündigen. Schande, ich kann nicht +2 Sie;) – MattDavey

+1

Ich mag 'Abstract' nicht in Basisklassennamen, denn wenn ich siehe, dass "X" von "Y" abgeleitet ist, ich denke, dass "X" ein _Typ von "Y" ist (z. B. ist ein "Hund" eine Art von "Tier", kein "Abstraktes Tier"). Obwohl eine Variable vom Typ 'AbstractY' eine abstrakte Referenz ist, zeigt sie nicht auf etwas Abstraktes. –

0

Es gibt mindestens einen Nachteil: Wenn aus irgendeinem Grund die Klasse das Muster nach einem Refactoring nicht verwendet, müssen Sie es entweder umbenennen oder eine Klasse mit einem falschen Namen haben.

+1

Stimmen Sie zu, aber ein Designmuster würde das Verhalten eines Objekts anzeigen. Wenn sich das Objekt nach dem Refactoring nicht auf die gleiche Weise verhält, sollte es vielleicht stattdessen eine neue Klasse sein ... – MattDavey

0

Es ist wirklich gut, Designmusternamen als Klassennamen hinzuzufügen. Das macht den Code leichter verständlich. Klassennamen sollten sinnvoll sein und die Funktionalität der Klasse widerspiegeln. Wenn man dem Klassennamen einen Musternamen hinzufügt, wird die Lesbarkeit verbessert, da sie auch die Technik widerspiegelt, die zum Entwerfen der Klasse verwendet wurde. Ich bevorzuge diese Art von Klassennamen.

Verwandte Themen