Es ist bekanntermaßen schwierig, gute und genaue Namen für Klassen zu finden. Richtig gemacht, macht es den Code selbstdokumentierender und bietet ein Vokabular, um über Code auf einer höheren Abstraktionsebene nachzudenken.
Klassen, die ein bestimmtes Entwurfsmuster implementieren, können einen Namen erhalten, der auf dem bekannten Musternamen basiert (z. B. FooFactory, FooFacade), und Klassen, die Domänenkonzepte direkt modellieren, können ihre Namen aus der Problemdomäne übernehmen, aber was ist mit anderen Klassen? Gibt es so etwas wie einen Thesaurus eines Programmierers, an den ich mich wenden kann, wenn mir die Inspiration fehlt und ich generische Klassennamen (wie FooHandler, FooProcessor, FooUtils und FooManager) vermeiden möchte?
Antworten:
Ich zitiere einige Passagen aus Implementation Patterns von Kent Beck:
Einfacher Name der Oberklasse
Qualifizierter Name der Unterklasse
Schnittstelle
Kaufen Sie das Buch für eine ausführlichere Diskussion! Das ist es wert! :) :)
quelle
Entscheide dich immer für MyClassA, MyClassB - Es ermöglicht eine schöne Alpha-Sortierung.
Ich scherze nur!
Dies ist eine gute Frage und etwas, das ich vor nicht allzu langer Zeit erlebt habe. Ich habe meine Codebasis bei der Arbeit neu organisiert und hatte Probleme, wo ich was ablegen und wie ich es nennen soll.
Das eigentliche Problem?
Ich hatte zu viel Unterricht. Wenn Sie versuchen, sich an das Prinzip der Einzelverantwortung zu halten, wird alles viel besser zusammenpassen. Statt einer monolithischen PrintHandler- Klasse können Sie es in PageHandler , PageFormatter (usw.) aufteilen und dann eine Master- Druckerklasse haben , die bringt alles zusammen.
In meiner Neuorganisation habe ich einige Zeit gebraucht, aber am Ende habe ich viel doppelten Code gebündelt, meine Codebasis viel logischer gemacht und verdammt viel gelernt, bevor ich eine zusätzliche Methode in eine Klasse geworfen habe: D.
Ich würde jedoch nicht empfehlen, Dinge wie Musternamen in den Klassennamen einzufügen. Die Klassenschnittstelle sollte dies deutlich machen (wie das Ausblenden des Konstruktors für einen Singleton). An dem generischen Namen ist nichts auszusetzen, wenn die Klasse einem generischen Zweck dient.
Viel Glück!
quelle
Josh Blochs ausgezeichnetes Gespräch über gutes API-Design enthält einige gute Ratschläge:
Wenn Ihr Problem darin besteht, exponierte interne Klassen zu benennen, sollten Sie sie möglicherweise zu einer größeren Klasse zusammenfassen.
Wenn Ihr Problem darin besteht, eine Klasse zu benennen, die viele verschiedene Aufgaben ausführt, sollten Sie in Betracht ziehen, sie in mehrere Klassen aufzuteilen.
Wenn das ein guter Rat für eine öffentliche API ist, kann es für keine andere Klasse schaden.
quelle
Wenn Sie an einem Namen festhalten, ist es manchmal eine gute Strategie , ihm nur einen halbwegs vernünftigen Namen zu geben, um ihn später zu überarbeiten.
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.
quelle
Wenn mir ein guter Name nicht in den Sinn kommt, würde ich mich wahrscheinlich fragen, ob es ein tieferes Problem gibt - erfüllt die Klasse einen guten Zweck? Wenn ja, sollte die Benennung ziemlich einfach sein.
quelle
Wenn Ihr "FooProcessor" wirklich Foos verarbeitet, zögern Sie nicht, ihm diesen Namen zu geben, nur weil Sie bereits einen BarProcessor, BazProcessor usw. haben. Im Zweifelsfall ist offensichtlich am besten. Die anderen Entwickler, die Ihren Code lesen müssen, verwenden möglicherweise nicht denselben Thesaurus wie Sie.
Eine genauere Darstellung würde diesem Beispiel jedoch nicht schaden. "Prozess" ist ein ziemlich weites Wort. Ist es zum Beispiel wirklich ein "FooUpdateProcessor" (der zu "FooUpdater" werden könnte)? Sie müssen nicht zu "kreativ" in Bezug auf die Benennung werden, aber wenn Sie den Code geschrieben haben, haben Sie wahrscheinlich eine ziemlich gute Vorstellung davon, was er tut und was nicht.
Denken Sie schließlich daran, dass der bloße Klassenname nicht alles ist, was Sie und die Leser Ihres Codes weiter machen müssen - normalerweise sind auch Namespaces im Spiel. Diese können den Lesern oft genug Kontext geben, um klar zu sehen, wofür Ihre Klasse wirklich ist, auch wenn ihr bloßer Name ziemlich allgemein ist.
quelle