Vor langer Zeit habe ich einen Artikel gelesen (ich glaube ein Blogeintrag), der mich auf die "richtige" Spur beim Benennen von Objekten gebracht hat: Seien Sie sehr, sehr gewissenhaft beim Benennen von Dingen in Ihrem Programm.
Wenn meine Anwendung beispielsweise (als typische Geschäftsanwendung) Benutzer, Unternehmen und Adressen handhaben würde, hätte ich eine User
, eine Company
und eine Address
Domänenklasse - und wahrscheinlich würde irgendwo ein UserManager
, ein CompanyManager
und ein AddressManager
auftauchen, das diese Dinge behandelt.
So kann man sagen , was diejenigen UserManager
, CompanyManager
und AddressManager
tun? Nein, denn Manager ist ein sehr allgemeiner Begriff, der zu allem passt, was Sie mit Ihren Domänenobjekten tun können.
In dem Artikel, den ich gelesen habe, wurde empfohlen, sehr spezifische Namen zu verwenden. Wenn es sich um eine C ++ - Anwendung handelte und der UserManager
Job darin bestand, Benutzer zuzuweisen und vom Heap zu befreien, würde er die Benutzer nicht verwalten, sondern ihre Geburt und ihren Tod schützen. Hmm, vielleicht könnten wir das a nennen UserShepherd
.
Oder vielleicht besteht die UserManager
Aufgabe darin, die Daten jedes Benutzerobjekts zu untersuchen und die Daten kryptografisch zu signieren. Dann hätten wir eine UserRecordsClerk
.
Jetzt, wo diese Idee bei mir geblieben ist, versuche ich sie anzuwenden. Und finde diese einfache Idee erstaunlich schwer.
Ich kann beschreiben, was die Klassen tun, und (solange ich nicht in die schnelle und schmutzige Codierung schlüpfe) die Klassen, die ich schreibe, genau eines tun. Was ich vermisse, um von dieser Beschreibung zu den Namen zu gelangen, ist eine Art Katalog von Namen, ein Vokabular, das die Konzepte Namen zuordnet.
Letztendlich möchte ich so etwas wie einen Musterkatalog im Kopf haben (häufig liefern Entwurfsmuster leicht die Objektnamen, z. B. eine Fabrik ).
- Factory - Erstellt andere Objekte (Benennung aus dem Entwurfsmuster)
- Hirte - Ein Hirte kümmert sich um die Lebensdauer von Objekten, deren Entstehung und Abschaltung
- Synchronizer - Kopiert Daten zwischen zwei oder mehr Objekten (oder Objekthierarchien).
Kindermädchen - Hilft Objekten, nach der Erstellung den Status "verwendbar" zu erreichen - beispielsweise durch Verkabelung mit anderen Objekten
etc etc. etc.
Wie gehen Sie mit diesem Problem um? Haben Sie einen festen Wortschatz, erfinden Sie spontan neue Namen oder denken Sie darüber nach, Dinge zu benennen, die nicht so wichtig oder falsch sind?
PS: Ich interessiere mich auch für Links zu Artikeln und Blogs, die das Problem diskutieren. Hier ist zunächst der ursprüngliche Artikel, über den ich nachgedacht habe: Benennen von Java-Klassen ohne 'Manager'
Update: Zusammenfassung der Antworten
Hier ist eine kleine Zusammenfassung dessen, was ich in der Zwischenzeit aus dieser Frage gelernt habe.
- Versuche keine neuen Metaphern zu erstellen (Nanny)
- Schauen Sie sich an, was andere Frameworks tun
Weitere Artikel / Bücher zu diesem Thema:
- Welche Namen stellen Sie regelmäßig vor / an den Unterricht?
- Was ist der beste Ansatz, um Klassen zu benennen?
- Buch: Entwurfsmuster: Elemente wiederverwendbarer objektorientierter Software (Hardcover)
- Buch: Muster der Architektur von Unternehmensanwendungen (Hardcover)
- Buch: Implementierungsmuster (Taschenbuch)
Und eine aktuelle Liste von Namenspräfixen / -suffixen, die ich (subjektiv!) Aus den Antworten gesammelt habe:
- Koordinator
- Baumeister
- Schriftsteller
- Leser
- Handler
- Container
- Protokoll
- Ziel
- Konverter
- Regler
- Aussicht
- Fabrik
- Entität
- Eimer
Und ein guter Tipp für die Straße:
Keine Namenslähmung. Ja, Namen sind sehr wichtig, aber sie sind nicht wichtig genug, um viel Zeit damit zu verschwenden. Wenn Sie sich in 10 Minuten keinen guten Namen ausdenken können, fahren Sie fort.
Antworten:
Ich habe eine ähnliche Frage gestellt , aber wenn möglich, versuche ich, die Namen bereits im .NET Framework zu kopieren , und suche nach Ideen in den Java- und Android- Frameworks.
Es scheint
Helper
,Manager
undUtil
sind die unvermeidlichen Substantive, die Sie für die Koordinierung von Klassen anhängen, die keinen Status enthalten und im Allgemeinen prozedural und statisch sind. Eine Alternative istCoordinator
.Sie könnten sich vor allem lila prosey mit den Namen und gehen für Dinge wie
Minder
,Overseer
,Supervisor
,Administrator
, undMaster
, aber wie gesagt , ich es wie die Rahmen Namen lieber halten Sie es gewohnt sind.Einige andere gebräuchliche Suffixe (wenn dies der richtige Begriff ist), die Sie auch im .NET Framework finden, sind:
Builder
Writer
Reader
Handler
Container
quelle
Conductor
, wie der Dirigent eines Musikorchesters. Es ist sicherlich eine wichtige Rolle, abhängig von der Art der Kollaborationen, die Sie "durchführen" müssen (andere Objekte sind sehr spezialisierte Akteure, die auf zentralisierte Befehle reagieren und sich nicht zu viele Sorgen um jeden anderen Kollaborateur machen sollten).Sie können einen Blick auf source-code-wordle.de werfen . Ich habe dort die am häufigsten verwendeten Suffixe von Klassennamen des .NET Frameworks und einiger anderer Bibliotheken analysiert.
Die Top 20 sind:
quelle
Thingy
.Ich bin alles für gute Namen, und ich schreibe oft darüber, wie wichtig es ist, bei der Auswahl von Namen für Dinge sehr vorsichtig zu sein. Aus dem gleichen Grund bin ich vorsichtig bei Metaphern, wenn ich Dinge benenne. In der ursprünglichen Frage sehen "Fabrik" und "Synchronisierer" wie gute Namen für das aus, was sie zu bedeuten scheinen. "Hirte" und "Kindermädchen" sind es jedoch nicht, weil sie auf Metaphern basieren . Eine Klasse in Ihrem Code kann nicht buchstäblich ein Kindermädchen sein. Sie nennen es ein Kindermädchen, weil es sich um einige andere Dinge kümmert, ähnlich wie ein echtes Kindermädchen sich um Babys oder Kinder kümmert. Das ist in informeller Sprache in Ordnung, aber (meiner Meinung nach) nicht in Ordnung, um Klassen in Code zu benennen, die von wem weiß wen wen wann gepflegt werden müssen.
Warum? Weil Metaphern kulturabhängig und oft auch individuell abhängig sind. Für Sie kann es sehr klar sein, eine Klasse "Kindermädchen" zu nennen, aber für andere ist es vielleicht nicht so klar. Darauf sollten wir uns nicht verlassen, es sei denn, Sie schreiben Code, der nur für den persönlichen Gebrauch bestimmt ist.
In jedem Fall kann Konvention eine Metapher machen oder brechen. Die Verwendung von "factory" selbst basiert auf einer Metapher, die es aber schon eine ganze Weile gibt und die derzeit in der Programmierwelt ziemlich bekannt ist. Daher würde ich sagen, dass die Verwendung sicher ist. "Kindermädchen" und "Hirte" sind jedoch inakzeptabel.
quelle
Wir konnten tun ohne
xxxFactory
,xxxManager
oderxxxRepository
Klassen , wenn wir die reale Welt korrekt modelliert:;-);
quelle
Universe.Instance.ToParallel()
;)Es klingt wie ein rutschiger Hang zu etwas, das auf thedailywtf.com, "ManagerOfPeopleWhoHaveMortgages" usw. veröffentlicht wird.
Ich nehme an, es ist richtig, dass eine monolithische Manager-Klasse kein gutes Design ist, aber die Verwendung von 'Manager' ist nicht schlecht. Anstelle von UserManager wird es möglicherweise in UserAccountManager, UserProfileManager, UserSecurityManager usw. unterteilt.
'Manager' ist ein gutes Wort, weil es deutlich zeigt, dass eine Klasse kein reales 'Ding' darstellt. 'AccountsClerk' - Wie soll ich feststellen, ob dies eine Klasse ist, die Benutzerdaten verwaltet oder jemanden repräsentiert, der für seinen Job ein Account Clerk ist?
quelle
Da Sie an Artikeln in diesem Bereich interessiert sind, könnte Sie Steve Yegges Meinungsartikel "Hinrichtung im Königreich der Substantive" interessieren:
http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html
quelle
Wenn ich über die Verwendung von
Manager
oderHelper
in einem Klassennamen nachdenke , halte ich es für einen Codegeruch, der bedeutet, dass ich noch nicht die richtige Abstraktion gefunden habe und / oder gegen das Prinzip der Einzelverantwortung verstoße , also umgestalte und mehr Aufwand in das Design stecke oft erleichtert das Benennen viel.Aber selbst gut gestaltete Klassen benennen sich nicht (immer) selbst, und Ihre Auswahl hängt teilweise davon ab, ob Sie Geschäftsmodellklassen oder Klassen für technische Infrastruktur erstellen.
Geschäftsmodellklassen können schwierig sein, da sie für jede Domäne unterschiedlich sind. Es gibt einige Begriffe, die ich häufig verwende,
Policy
z. B. für Strategieklassen innerhalb einer Domäne (z. B.LateRentalPolicy
), aber diese ergeben sich normalerweise aus dem Versuch, eine " allgegenwärtige Sprache " zu erstellen , die Sie mit Geschäftsbenutzern teilen können, und dem Entwerfen und Benennen von Klassen, damit diese real modellieren -Weltideen, Objekte, Aktionen und Ereignisse.Technische Infrastrukturklassen sind etwas einfacher, da sie Domänen beschreiben, die wir sehr gut kennen. Ich ziehe es vor, Entwurfsmusternamen in die Klassennamen aufzunehmen, wie
InsertUserCommand,
CustomerRepository,
oderSapAdapter.
ich verstehe die Besorgnis über die Kommunikation der Implementierung anstelle von Absichten, aber Entwurfsmuster verbinden diese beiden Aspekte des Klassendesigns - zumindest, wenn Sie sich mit Infrastruktur befassen, wo Sie die wollen Umsetzung Design transparent zu sein , auch wenn Sie die Details versteckt sind.quelle
Policy
Suffix für Klassen zu verwenden, die Geschäftslogik enthaltenWenn ich mit Mustern, wie sie im GOF-Buch definiert sind , vertraut bin und Objekte danach benenne, kann ich Klassen gut benennen, organisieren und Absichten kommunizieren. Die meisten Menschen werden diese Nomenklatur (oder zumindest einen Großteil davon) verstehen.
quelle
Wenn ich keinen konkreteren Namen für meine Klasse als XyzManager finden kann, wäre dies ein Punkt für mich, um zu überdenken, ob dies wirklich eine Funktionalität ist, die in einer Klasse zusammengehört, dh ein architektonischer „Code-Geruch“.
quelle
Ich denke, das Wichtigste ist: Ist der Name beschreibend genug? Kannst du anhand des Namens erkennen, was die Klasse tun soll? Die Verwendung von Wörtern wie "Manager", "Service" oder "Handler" in Ihren Klassennamen kann als zu allgemein angesehen werden. Da jedoch viele Programmierer sie verwenden, hilft es auch, zu verstehen, wofür die Klasse gedacht ist.
Ich selbst habe das Fassadenmuster oft benutzt (zumindest denke ich, dass es so heißt). Ich könnte eine
User
Klasse haben, die nur einen Benutzer beschreibt, und eineUsers
Klasse, die meine "Sammlung von Benutzern" verfolgt. Ich nenne die Klasse nicht a,UserManager
weil ich Manager im wirklichen Leben nicht mag und nicht daran erinnert werden möchte :) Die einfache Verwendung der Pluralform hilft mir zu verstehen, was die Klasse tut.quelle
Users
, insbesondere wenn Sie das Manager-Objekt weitergeben.this.users = new Users()
Aber dann wird immer irgendwo anders in Ihrem Codeusers
auf ein Array vonUser
s verwiesen.Speziell für C # fand ich "Richtlinien für das Framework-Design: Konventionen, Redewendungen und Muster für wiederverwendbare .NET-Bibliotheken" viele gute Informationen zur Logik der Benennung enthalten.
Um diese spezifischeren Wörter zu finden, verwende ich oft einen Thesaurus und springe durch verwandte Wörter, um zu versuchen, ein gutes zu finden. Ich versuche jedoch, nicht zu viel Zeit damit zu verbringen, während ich mich durch die Entwicklung entwickle, finde ich bessere Namen oder merke manchmal, dass dies
SuchAndSuchManager
wirklich in mehrere Klassen unterteilt werden sollte, und dann wird der Name dieser veralteten Klasse kein Problem mehr .quelle
Ich glaube, das Entscheidende dabei ist, innerhalb der Sichtbarkeit Ihres Codes konsistent zu sein, dh solange jeder, der Ihren Code betrachten / bearbeiten muss, Ihre Namenskonvention versteht, sollte dies in Ordnung sein, selbst wenn Sie sich entscheiden, sie aufzurufen 'CompanyThingamabob' und 'UserDoohickey'. Wenn Sie für ein Unternehmen arbeiten, müssen Sie zunächst prüfen, ob es eine Unternehmenskonvention für die Benennung gibt. Wenn dies nicht der Fall ist oder Sie nicht für ein Unternehmen arbeiten, erstellen Sie Ihre eigenen Begriffe mit für Sie sinnvollen Begriffen, geben Sie sie an einige vertrauenswürdige Kollegen / Freunde weiter, die zumindest beiläufig codieren, und berücksichtigen Sie alle sinnvollen Rückmeldungen.
Es ist ein kleiner Fehler in meinem Buch, die Konvention eines anderen anzuwenden, auch wenn sie allgemein akzeptiert wird, wenn sie nicht von der Seite springt. In erster Linie muss ich meinen Code verstehen, ohne auf andere Dokumentationen zu verweisen, aber gleichzeitig muss er so allgemein sein, dass er für andere Personen auf demselben Gebiet in derselben Branche nicht unverständlich ist.
quelle
Ich würde die Muster berücksichtigen, die Sie für Ihr System verwenden, und die Namenskonventionen / Katalogisierung / Gruppierung von Klassen von Tendenzen werden durch das verwendete Muster definiert. Persönlich halte ich mich an diese Namenskonventionen, da sie die wahrscheinlichste Möglichkeit für eine andere Person sind, meinen Code aufzunehmen und damit auszuführen.
Zum Beispiel könnte UserRecordsClerk besser als Erweiterung einer generischen RecordsClerk-Schnittstelle erklärt werden, die sowohl UserRecordsClerk als auch CompanyRecordsClerk implementieren und sich dann darauf spezialisieren. Dies bedeutet, dass man sich die Methoden in der Schnittstelle ansehen kann, um zu sehen, wofür die Unterklassen im Allgemeinen funktionieren.
Siehe ein Buch wie Design Patterns Informationen finden Sie in . Es ist ein ausgezeichnetes Buch und kann Ihnen dabei helfen, zu klären, wo Sie mit Ihrem Code arbeiten möchten - wenn Sie ihn nicht bereits verwenden! ;Ö)
Ich denke, solange Ihr Muster gut ausgewählt und soweit angemessen verwendet wird, sollten ziemlich nicht erfinderische, einfache Klassennamen ausreichen!
quelle