Welche Benennungsmuster gibt es? [geschlossen]

35

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.

Billy ONeal
quelle
1
Wie wäre es mit der Smurf Naming Convention ?
back2dos
4
Um diejenigen, die abstimmen, als "nicht konstruktiv" zu schließen - wären Sie bereit, den Grund zu erklären, warum? Der einzige
Nachteil
2
@Aaronaught: Irgendwelche Vorschläge? Ich habe das so gut artikuliert, wie ich es kann.
Billy ONeal
1
@jhocking - Ich stimme einigen dieser Links zu - insbesondere der Tatsache, dass "Manager" und "Handler" zu wertvoll sind, um loszulassen. Und ich bin nicht so begeistert von den Design-Pattern-basierten und anderen Alternativen, die in vielen Fällen mindestens genauso vage erscheinen. Manchmal ist "Warteschlange" oder was auch immer angemessen, aber oft ist die Tatsache, dass ein Manager Elemente in einer Warteschlange hält (oder darauf verweist), nur ein Aspekt der Verwaltung dieser Elemente. So wie "Manager" als Berufsbezeichnung etwas Nützliches ausdrückt, gilt dies auch für OOP.
Steve314

Antworten:

22

Die folgenden Namens-Anti-Patterns beziehen sich auf .NET und insbesondere auf C #:

  • Inkonsistenzen . Wenn Sie sich dafür entschieden haben, jeden Feldnamen mit einem führenden Unterstrich zu beginnen, bleiben Sie dabei .
  • Ambiguos-Abkürzungen mit fehlenden Vokalen . Ich habe ernsthaft Flurnamen wie gesehen cxtCtrlMngr. Sie können kaum erraten, wofür das stehen soll.
  • Zu lange und ausführliche Variablennamen . ILoginAttemptRepositoryist gut und beschreibend - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingist beschreibend, aber definitiv nicht gut.
Marius Schulz
quelle
7
Ist Igemeint bedeutet interfacehier, implementeroder die erste Person Singular? Da die meisten Klassen eine Schnittstelle implementieren, Iist es ärgerlich , wenn zu viele Klassen / Interafes mit einem Großbuchstaben beginnen, was die Lesbarkeit und den Code-Geruch behindert.
Benutzer unbekannt
3
+1 für "Ambiguos Abkürzungen mit fehlenden Vokalen", die mich verrückt machen!
FrustratedWithFormsDesigner
6
@ Billy ONeal: C ++ hat Schnittstellen; Sie sind einfach nicht künstlich von Klassen getrennt. ;)
Jon Purdy
4
@ Billy ONeal: Das war mein Punkt.
Jon Purdy
2
@MariusSchulz: Oh ja, ich stimme dir zu :) Ich dachte nur, es wäre keine so schrecklich undurchsichtige Abkürzung.
Amara
9

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 XxxEnginein 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.

Wayne Molina
quelle
7

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 )

Inca
quelle
7
Ungarische Notation ist IMMER böse :)
Wayne Molina
12
@ Wayne: Eigentlich ist es nicht immer böse. Ich habe in den späten 70ern für Charles bei Xerox gearbeitet und das ursprüngliche Benennungssystem war ein Lebensretter. Wir haben in BCPL gearbeitet, das 1 Typ hat: Integer. Alles andere über Typ wurde durch Gebrauchs- und Namenskonventionen vermittelt. Wir hatten 7 Programmierer + Charles und jeder von uns konnte in den Code eines anderen hineingehen und sofort produktiv sein. Das soll nicht heißen, dass es nicht furchtbar verdreht / falsch angewendet werden kann (auch nicht von Charles), nur dass es im richtigen Kontext die richtige Lösung war.
Peter Rowell
3
@Marius: Lies Joels Artikel. Das Typsystem kann nicht immer alle semantischen Unterschiede zwischen Variablen erzwingen. Intellisense hilft auch in solchen Fällen nicht.
Billy ONeal
4
Typ lässt sich leichter ableiten als verwenden, insb. mit modernen Redakteuren. Es erfordert jedoch Disziplin. Sie müssen nicht alles voranstellen . Ich arbeite in Java und meistens sind Apps auf Ungarisch nicht erforderlich, aber wenn ich in Koordinatensystemen mehrere Variablen desselben Typs (wie fromX und toX) benötige, ist dies ein Lebensretter.
Michael K
3
Was wäre schön, ist eine allgemeine Fähigkeit, neue Typen leicht zu machen. "Dieser ist wie ein Int, nur dass er für Zeilennummern gilt."
David Thornley
6

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.

Mike Baranczak
quelle
@ Mike: Ich stimme Ihrer Aussage überhaupt nicht zu, sorry. Meiner Meinung nach XxxxManagerist dies der schlechteste Name, den eine Klasse haben kann. Natürlich schafft es etwas! Das ist der Grund, warum es geschrieben wurde. Managerist ein bedeutungsloses Füllwort, das dem Verstehen, wofür eine Klasse verantwortlich ist, keinen Wert beimisst.
Marius Schulz
1
Was ist mit sagen TabManager? Haben Sie einen besseren Namen für eine Klasse, die einen JSP-Registerkartenmechanismus steuert? Oder keuchen TabController ... Was Abstractdas 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 nie ISchnittstellen 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.
Michael K
1
@ Darien (und andere): Egal wie - es spielt keine Rolle. Keiner dieser Namen ist gegen Muster gerichtet (und daher für diese Frage nicht relevant). Ich glaube nicht , dass Sie von etwas über ein System Design sagen können , ob sie verwenden IXxxoder XxxImpl.
Billy ONeal
2
Das ist einfach total falsch. Es gibt sehr gute Gründe, um Schnittstellen visuell von Klassen zu unterscheiden: (a) Sie können nicht instanziiert werden, (b) Sie können nicht freigegeben / entsorgt werden, (c) Sie können nicht serialisiert werden, (d) Sie können es sein Proxied / Intercepted usw. usw. usw. Sie haben gerade etwas, das Sie persönlich nicht mögen (aus irgendeinem bizarren und ungeklärten Grund), als Beispiel für ein Anti-Pattern ohne jegliche Rechtfertigung verworfen.
Aaronaught
1
Nach Möglichkeit sollten Schnittstellen für Argumenttypen und Rückgabetypen konkreten Klassen vorgezogen werden. Daher ist es für Schnittstellen sinnvoll, die "sauberen" Namen und die konkreten Implementierungen (deren tatsächliche Art der Anrufer möglicherweise nicht einmal kennt oder nicht kennt) abzurufen, um die Warzen zu erhalten.
Kevin Krumwiede
6

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.

Wiederholung
quelle
2
Ich habe kurz ein jQuery-Plugin verwendet, in dem sich einer der Parameter befand affect(anstelle von effect). Es machte mich verrückt und ich fand schnell ein anderes Plugin, um das Gleiche zu tun.
zzzzBov
4
Das schlimmste Problem, das ich damit habe, ist, dass es mir wirklich weh tut, wenn ich einen falsch geschriebenen Namen sehe, mich an die Namen zu erinnern.
David Thornley
1
Es wird schlimmer, wenn das Gleiche in verschiedenen Teilen des Codes unterschiedlich geschrieben wird. Wie wenn Sie eine Feldstärke der Klasse Srtength haben, auf die mit der Methode getStrenth () zugegriffen wird.
Eva
5

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 ...

Phalanx
quelle
1
"Controller" hat eine andere Semantik als "Manager". Persönlich mag ich auch nicht, aber "Controller" kommt zurecht, weil es eine gemeinsame Komponente vieler Muster ist, insbesondere von MVC. XxxHandler ist genauso schlecht. Wenn die Klasse nur etwas "handhabt" - dann ist entweder die Klasse zu groß oder sie sollte einfach als "Xxx" -Teil bezeichnet werden.
Billy ONeal
3
"Es wäre wirklich schwierig oder gar nicht möglich, bessere Namen für solche Dinge zu finden ." Wenn Sie "Controller" als Teil einer MVC oder eines "Handlers" für einen allgemeinen Ereignis- / Nachrichtenhandler verwenden, ist das natürlich anders - das sind Beispiele für Fachjargon -, aber wenn sie nur als allgemeine Namen für illusionäre Ereignisse verwendet werden. definierte Klassen, dann ist das eine große rote Fahne.
Aaronaught
5

Vielleicht ist das schlechteste Namensmuster das folgende:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

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:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Eine separate Tabelle sollte mit den Spalten foo und bar erstellt und mit der Stofftabelle verknüpft werden:

create table fubar(foo string, bar string, stuff_id long)

Das zweitschlechteste ist das:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

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].

Kevin Cline
quelle
-1 - hier wird die Benennung überhaupt nicht erwähnt.
Billy ONeal
Ein Namens-Anti-Pattern kann nur einen Namen enthalten.
Kevin Cline
Wie viele Argumente ==benennen Antipattern? Ich bin verwirrt.
Billy ONeal
1
Soweit ich ihn verstehe, erlaubt die Konvention Zahlen, bei denen ein tatsächlicher Name verwendet werden sollte. Diese Zahlen führen zu einem falschen Eindruck, dass die Elemente eine Art Liste oder Array sind
keppla
3
@ Billy ONeal: Ja, das tun sie. Das Entwurfsproblem ist das Fehlen einer Normalisierung, und die Zahlensuffixe sind das darauf hinweisende Benennungsmuster.
Reinierpost
3

Jede tautologische Benennung von Klassen oder Schnittstellen ist eine schlechte, nicht nur in Java, über die der Link spricht, sondern in jeder Sprache.

Tautologie (Rhetorik), wobei verschiedene Wörter verwendet werden, um dasselbe zu sagen, auch wenn die Wiederholung keine Klarheit schafft.

user7519
quelle
2
Interessant. Beispiele?
Mike Baranczak
2
Ich habe den Link gelesen, dort steht "Tautologie" ...;)
Benjol
10
Die erste Regel des Tautologie-Clubs ist die erste Regel des Tautologie-Clubs.
Cercerilla
Ich las den Link (okay, der Inhalt des Links) und fand keine Beispiele
Barjak
Okay, also laut diesem Link sollten wir aufhören, I <InterfaceName> zu verwenden ... richtig.
Dal
3

Ich stoße häufig auf Softwarebibliotheken mit generischen Namen wie Libraryoder Common. 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.

reinierpost
quelle
+1 - Ich sehe die ganze Zeit "Common".
Morgan Herlocker
1

Bei der Namensgebung von Microsoft kann ich diese Liste für schlechte Namen bereitstellen:

  1. Sie sind nicht semantisch, was bedeutet, dass sie Namen haben, die sich nicht darauf konzentrieren, was sie tun, sondern auf die Technologie oder das Muster, auf dem sie basieren .
  2. Sie folgen keiner syntaktischen Konsistenz. Ein Teil der Namen ist beispielsweise in Kamelschalen, der andere Teil in Pascalschalen.
  3. Es handelt sich um schwer verständliche Abkürzungen wie ScrollableX statt CanScrollHorizontally
  4. Sie werden so ausgewählt, dass sie sich mit den Schlüsselwörtern dieser Umgebung anlegen.
Saeed Neamati
quelle
2
Eigentlich mag ich "ScrollableX" mindestens so sehr wie "CanScrollHorizontally". "X" ist eigentlich keine Abkürzung.
user1172763