Ist es jemals eine gute Idee, den Entwurfsmusternamen in den implementierenden Klassen zu verwenden? [geschlossen]


28

Vor kurzem stieß ich auf eine mäßig große Python Code - Basis mit vielen MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapterusw. Klassen.

Diese Namen haben mich einerseits dazu bewogen, die entsprechenden Muster zu erforschen und zu lernen, aber sie waren nicht sehr beschreibend für das, was die Klasse tut .

Auch scheinen sie innerhalb der verbotenen Liste der Wörter in der Programmierung fallen: variable, process_available_information, data, amount, compute: zu weit gefasste Namen, die nicht sagen uns nichts über die Funktion , wenn sie von sich selbst verwendet .

Sollte es also geben CommunicationManageroder eher PortListener? Oder verstehe ich das Problem vielleicht gar nicht ...?


wenn Sie vertraut sind mit dem, was das Muster tut dann das Muster Name ist eine anständige Beschreibung jedoch nur der Mustername ist eine schlechte Idee, es besser ist , eine MyClassFactory zu haben, eine FooAdapter usw.
Ratsche Freak

Die Frage wurde bearbeitet, um anzuzeigen, dass die Klassen nicht nur "AbstractFactory" genannt wurden, sondern auch einige beschreibende Wörter.
Vorac

1
... nannten sie es ernsthaft ein Fctorystatt ein Factory, oder ist das nur ein Tippfehler?
Izkata

@ Izkata, lol, meine schlechte. Es gab jedoch Adapter und Adapter!
Vorac

Antworten:


47
  • AbstractFactoryist in der Tat eine schlechte Wahl für einen Namen. Es gibt keine Möglichkeit zu wissen, was von dieser Factory erstellt wird , und wenn Sie nach einer Entität suchen, die Animals erstellt , werden Sie die entsprechende Factory niemals anhand des Namens finden.

  • AnimalAbstractFactoryist auch keine kluge Wahl, da es in den meisten Sprachen mit dem Schlüsselwort in der Signatur überflüssig wäre abstract.

    Abgesehen davon gibt es mehrere gute Gründe, die in den Kommentaren hervorgehoben werden, um tatsächlich Abstractin den Namen aufgenommen zu werden: Es gibt nicht nur mehrere Kontexte, in denen Sie nicht die vollständige Signatur haben, sondern nur den Namen, sondern auch die Beibehaltung AnimalFactoryeiner Schnittstelle kann eine kluge Wahl sein (es sei denn, die Konvention der Sprache / des Frameworks besteht leider darin, Schnittstellen mit einem Präfix zu versehen I).

  • AnimalCreationUtilityEine schlechte Wahl wäre auch: Wenn es sich um eine Fabrik handelt , machen Sie es den Leuten leichter, die Code lesen, und nennen Sie es eine Fabrik .

  • abstract AnimalFactoryist in Ordnung. Es muss nicht Redundanz und ist klar , dass es ist eine abstrakte Fabrik , die Delegierten die Schaffung von Tieren zu ihren Kindern.

Ja, es ist eine gute Idee, den Namen des Entwurfsmusters anzugeben, aber er sollte nur ein Teil des Namens sein und nicht mit den anderen Teilen der Signatur überflüssig sein.


2
Warum ist das besser, als einen Kommentar an prominenter Stelle zu schreiben? "In diesem Modul implementieren wir MVC. Gründe: ... Modelle: ... Aufrufe: ... Steuerungen: ... Strukturübersicht: ... API :. .. ".
Vorac

37
@Vorac: Einen klaren Namen zu haben ist immer besser als sich auf Kommentare zu verlassen.
Arseni Mourzenko

2
@Vorac Früher oder später fügt jemand eine neue Klasse hinzu, ohne diesen wichtigen Kommentar zu aktualisieren (oder sogar über seine Existenz Bescheid zu wissen). Es ist zwar viel schwieriger, eine Namenskonvention zu übersehen, die in der gesamten App einheitlich verwendet wird.
Konrad Morawski

2
Öffnen Sie beim Durchsuchen Ihrer Projektlösung die einzelnen Klassendateien, um herauszufinden, was sie bewirken. Nein. Deshalb ist es immer besser, beschreibende Namensklassen / -dateien zu haben.
Matrix

2
Ich bin mit dem zweiten Punkt nicht einverstanden: Ich denke, dass AnimalAbstractFactory eine gute Wahl ist, denn obwohl es in der Klassendeklaration überflüssig ist, wäre es in der Kinderklassendeklaration sehr hilfreich: LionFactory erweitert AnimalAbstractFactory, was ich denke, ist eine nette Information.
Igor

11

Kommt auf das konkrete Beispiel an. Das Builder-Muster eignet sich fast immer am besten für die Benennung Ihres Class * Builder, während ein Singleton normalerweise nicht als solches benannt werden muss.

Wenn Sie den Musternamen nicht in Ihren Klassennamen einfügen, und vielleicht auch, wenn Sie dies tun, sollten Sie in der Regel einen Kommentar in die Klasse einfügen, der erklärt, dass sie ein bestimmtes Muster implementiert.


3
Konsistenz ist hier von entscheidender Bedeutung, denn sobald nur einige Fabriken aufgerufen werden ...Factory, wird es zu einer geistigen Belastung, zu erkennen, dass eine Klasse eine Fabrik ist, wenn ihre Bezeichnung gegen diese Konvention verstößt.
Konrad Morawski

10

Der Sinn der Verwendung von Musternamen in Klassen besteht darin, die Funktionsweise der Klasse verständlich zu machen. Wenn Sie die Klasse AnimalFactory benennen, ist es offensichtlich, dass die Klasse Animal-Instanzen erstellt. Wenn der Name Ihrer Klasse einen Namen eines Musters enthält und nicht beschreibt, was es tut, haben Sie entweder ein falsches Muster ausgewählt oder es falsch implementiert.


1

Ich denke, es kann sehr gut funktionieren. Beispielsweise:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
Wie beantwortet dies die gestellte Frage? Nach meiner Lektüre zeigen Ihre "Beispiele" nur eine unbrauchbare Verdoppelung von Klassennamen und Codekommentaren
Gnat

Kommentare dienen dazu, den Zweck jeder Klasse zu begründen, falls der Klassenname für manche nicht ersichtlich ist. Wenn ich mir diese ansehe, weiß ich sofort, dass ich einen Befehl habe, der etwas tut, eine Abfrage, die Daten zurückgibt, einen Dekorator, der dem vorhandenen Mechanismus zur Protokollierung von Ausnahmen zusätzliches Verhalten hinzufügt, und eine Factory, die Kontofilter erstellt. Meiner Meinung nach ist es für andere umso einfacher, Ihren Code zu lesen, je aussagekräftiger Sie mit Ihren Klassennamen sind. Wenn Sie ein Entwurfsmuster verwenden, sagen Sie es - am Ende des Tages besteht der Zweck des Entwurfsmusters darin, anderen das Lesen Ihres Codes zu erleichtern
CodeART
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.