Es gibt einige Namen, bei denen Sie wissen, dass Sie bereits etwas durcheinander gebracht haben, wenn Sie nach diesen Namen greifen.
Beispielsweise:
XxxManager
Das ist schlecht, weil eine Klasse beschreiben sollte, was die Klasse tut. Wenn das spezifischste Wort, das Sie für das, was die Klasse tut, finden können, "verwalten" ist, dann ist die Klasse zu groß.
Welche anderen Benennungsmuster gibt es?
Zur Klarstellung: Ich frage nicht, "welche Namen schlecht sind" - diese Frage ist völlig subjektiv und es gibt keine Möglichkeit, sie zu beantworten. Ich frage: "Welche Namen deuten auf allgemeine Entwurfsprobleme mit dem System hin?" Das heißt, wenn Sie feststellen, dass Sie eine Komponente Xyz aufrufen möchten, weist dies wahrscheinlich darauf hin, dass die Komponente nicht richtig verstanden wurde. Beachten Sie auch hier, dass es zu jeder Regel Ausnahmen gibt - ich suche nur nach Warnflags, wenn ich wirklich anhalten und ein Design überdenken muss.
quelle
Antworten:
Die folgenden Namens-Anti-Patterns beziehen sich auf .NET und insbesondere auf C #:
cxtCtrlMngr
. Sie können kaum erraten, wofür das stehen soll.ILoginAttemptRepository
ist gut und beschreibend -ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMapping
ist beschreibend, aber definitiv nicht gut.quelle
I
gemeint bedeutetinterface
hier,implementer
oder die erste Person Singular? Da die meisten Klassen eine Schnittstelle implementieren,I
ist es ärgerlich , wenn zu viele Klassen / Interafes mit einem Großbuchstaben beginnen, was die Lesbarkeit und den Code-Geruch behindert.Eines, auf das ich oft stoße, ist einfach, überhaupt kein Namensmuster zu verwenden. Dies weist in der Regel auf Unwissenheit der Entwickler hin (dass Benennungsmuster eine gute Sache sind ), und dieses Anti-Pattern verstößt in der Regel grob gegen SRP, indem alle Arten von Methoden, die sich auf eine Klasse beziehen, in diese Klasse selbst eingefügt werden, z. B. ein Kunde Klasse hat Eigenschaften, CRUD-Methoden und alles, was mit einem Kunden in Verbindung steht und ein Teil der Anwendung benötigt.
Ich werde auch hinzufügen, dass die Verwendung von "Engine" als Suffix in etwa der Verwendung von "Manager" entspricht. Es ist sehr vage und eine Klasse namens entspricht
XxxEngine
in der Regel einem Modul im VB-Stil, das eine Reihe von Methoden enthält, sodass es sich an einem "benutzerfreundlichen" Ort befindet, ohne Kenntnisse oder Vorstellung von objektorientierter Programmierung.quelle
Nun, einfache Antworten zuerst: Typ ungarisch ( http://mindprod.com/jgloss/unmainnaming.html , hat auch einige große andere Ideen eine ausgewogenere Sicht auf , wenn ungarisch ist nicht böse. Http://www.joelonsoftware.com /articles/Wrong.html )
quelle
Stellen Sie dem Namen einer Schnittstelle ein 'I' voran oder dem Namen einer abstrakten Klasse ein 'Abstract'. Dies ist möglicherweise in Sprachen zu entschuldigen, die nicht über das Konzept abstrakter Klassen verfügen oder nicht zwischen Interfaces und abstrakten Klassen unterscheiden. In Java ist dies jedoch immer eine schlechte Idee.
Außerdem stimme ich Ihnen in der Manager-Sache nicht zu. Ich verwende dieses Muster manchmal und es bedeutet nur, dass der Name nicht aussagekräftiger ist als XxxxxManager, wenn ich ihn anders benennen wollte. Es gibt einige (nicht unbedingt komplexe) Aufgaben, die sich nicht einfach in ein oder zwei Worten zusammenfassen lassen.
quelle
XxxxManager
ist dies der schlechteste Name, den eine Klasse haben kann. Natürlich schafft es etwas! Das ist der Grund, warum es geschrieben wurde.Manager
ist ein bedeutungsloses Füllwort, das dem Verstehen, wofür eine Klasse verantwortlich ist, keinen Wert beimisst.TabManager
? Haben Sie einen besseren Namen für eine Klasse, die einen JSP-Registerkartenmechanismus steuert? Oder keuchenTabController
... WasAbstract
das Präfix angeht, ist es meiner Meinung nach überstrapaziert, aber häufig gültig (Beispiele finden Sie in den Java-Bibliotheken). Ich glaube, ich kann mit Sicherheit sagen, dass ich noch nieI
Schnittstellen an einem Ort gesehen habe, an dem nicht versucht wurde, gegen eine Schnittstelle zu programmieren, die nicht dort hätte sein dürfen. Wie implementiert nur eine Klasse die Schnittstelle.IXxx
oderXxxImpl
.Speeling:
Ich habe eine Lernschwäche und kann nicht buchstabieren. Ohne die Rechtschreibprüfung bin ich machtlos. Ich versuche, alle von mir erstellten Namen zur Überprüfung in ein Textverarbeitungsprogramm zu kopieren, aber ich vermisse immer einige. Bei meinem letzten Projekt habe ich einen großen Teil der API geschrieben und ich glaube, ich habe die Rechtschreibprüfung nicht durchgeführt, als ich das Wort "Responce" zum ersten Mal verwendet habe, und ich habe angenommen, dass es richtig war, weil mir niemand davon erzählt hat. Wir hatten mindestens 50 Funktionen mit Verantwortung darin. Eine neue Person kam in das Team und fragte, warum wir die Verantwortung übernehmen. Ich fühlte mich wirklich dumm.
quelle
affect
(anstelle von effect). Es machte mich verrückt und ich fand schnell ein anderes Plugin, um das Gleiche zu tun.Nun, ich fürchte, meine Meinungen sind ein bisschen umstritten. Aber lass es uns versuchen ...
Was mich betrifft, muss ich Mike Baranczak zustimmen, Namen wie XxxController, XxxHandler verwenden wir sehr oft. Für uns ist ein Controller so etwas wie ein Eintrittspunkt für etwas "Eingekapseltes", z. B. das Verwalten von Transaktionen, das Behandeln unerwarteter Fehler und das Aufrufen von XxxHandler, um die eigentliche Arbeit zu erledigen. Ich würde sagen, ein XxxManager ist ein Synonym für einen Controller. Ich denke, es ist wichtig, Manager in einem Fall und Controller in einem anderen nicht zu verwenden. Konsequent zu sein ist sehr wichtig, wenn Sie in einem Team arbeiten.
Es wäre wirklich schwer oder vielleicht gar nicht möglich, bessere Namen für solche Sachen zu finden. Xxx sollte gut gewählt sein, um die Situation klarer zu machen.
Was ich persönlich nicht mag, ist, wenn eine Methode namens get ... oder set ... mehr als nur ein einfacher Accessor ist. Ich mag det ... bestimmt.
Eine andere Sache, die mir einfällt: Laut Onkel Bob. Ein "Und" in einem Methodennamen ist ein Zeichen dafür, zu viel zu tun. Aber das Leben ist nicht immer nur schwarz und weiß - es gibt Situationen, in denen ich es für ok halte - z. Aufgrund von Leistungsproblemen (wenn Sie bereits über die Daten verfügen, um zu überprüfen, warum Sie sie nicht verarbeiten sollten) ...
Ich persönlich bin auch ein großer Fan der ungarischen Systemnotation - die meiste Zeit beschäftigen Sie sich mit Quellcode in einer IDE in Ordnung. Aber häufig verwenden Sie nur einen Editor oder durchsuchen das Repo in einem Browser. Ein Nachteil könnte die Unterstützung von Werkzeugen aufgrund von Typ-Präfixen sein ...
Ich denke, das Wichtigste ist, konsistent zu sein - eine suboptimale Konvention - ist für mich besser als keine Konvention zu haben ...
quelle
Vielleicht ist das schlechteste Namensmuster das folgende:
Wir haben eine Liste mit drei Elementen von [foo, bar] Paaren. Wenn wir eine vierte benötigen, müssen wir der Tabelle neue Spalten hinzufügen.
Das führt zu folgendem Code:
Eine separate Tabelle sollte mit den Spalten foo und bar erstellt und mit der Stofftabelle verknüpft werden:
Das zweitschlechteste ist das:
Hier haben wir sechs Felder anstelle von zwei Instanzen einer Adressklasse.
Dieses Anti-Pattern ist durch eine Reihe von zweiteiligen Namen gekennzeichnet, in denen jede Kombination von zwei Sätzen aufgeführt ist, z. B. [foo, bar] x [1,2,3] oder [home, perm] x [street, city, state].
quelle
==
benennen Antipattern? Ich bin verwirrt.Jede tautologische Benennung von Klassen oder Schnittstellen ist eine schlechte, nicht nur in Java, über die der Link spricht, sondern in jeder Sprache.
quelle
Ich stoße häufig auf Softwarebibliotheken mit generischen Namen wie
Library
oderCommon
. Sie weisen auf ein suboptimales Design hin: Die Entwickler bemühen sich, Code-Duplikationen zu vermeiden, ohne jedoch zu versuchen, ein Design zu erstellen, das auf der Grundlage der Funktionalität zerlegt wird.quelle
Bei der Namensgebung von Microsoft kann ich diese Liste für schlechte Namen bereitstellen:
quelle