Was bedeutet Onkel Bob mit "Nominalphrasennamen"?

14

Ich lese Clean Code von Onkel Bob. Da ich kein Muttersprachler bin, konnte ich folgende Aussage nicht verstehen:

Klassen und Objekte sollten Namen Substantiv oder Nominalphrase haben wie Customer, WikiPage, Account, und AddressParser. Vermeiden Sie Wörter wie Manager, Processor, Dataoder Infoim Namen einer Klasse. Ein Klassenname sollte kein Verb sein.

Wie ich weiß, keiner von dem Manager, Processor, Dataund Infoist ein Verb, ist es nicht? Was ist der eigentliche Punkt, den er hervorheben möchte?

mmdemirbas
quelle
Vielleicht verwendet Onkel Bob REST-konformes Denken, um die Tugenden der Ressource als Objekt zu preisen.
rwong

Antworten:

21

Die drei Punkte sind getrennt:

  • Klassennamen sollten Substantive oder Nominalphrasen sein . Dies bedeutet, dass der Name der Klasse etwas sein sollte, das Gegenstand eines Verbs wäre. Bei objektorientiertem Design sind Methoden die Verben, die auf dem Objekt ablaufen, für das die Klasse eine Repräsentation ist.

  • Einige Wörter sollten vermieden werden. Managerzeigt eine mögliche Gottklasse an . Infound Datakann einen Dummy-Datencontainer anzeigen. Solche Wörter können auf eine schlechte Modellierung des Problemraums hinweisen.

  • Verben sollten niemals Klassennamen sein. Siehe den ersten Punkt - Klassen modellieren Dinge, Methoden modellieren Aktionen.

Thomas Owens
quelle
1
Solche Wörter können auf eine schlechte Modellierung des Problemraums hinweisen. - Nun, man könnte denken, dass entweder der Problemraum schlecht modelliert ist oder nicht, unabhängig von den gewählten Namen. Ein guter Name hilft einem schlechten Design nicht. und ein gutes Design wird nur am Rande von einem schlechten Namen verletzt.
Ingo
Und man könnte nimm einen Schritt verringern , wenn man bedenkt , wie Sie tatsächlich Ihre Klasse und wie es mit der Außenwelt interagiert - die Eigenschaften der Klasse würden in der Regel Substantive werden, während die Methoden der Klasse allgemein Verben wären
Peteh
Wenn Ihr Projekt eine Klasse hat, die Sie als "Manager" oder "Info" oder "Data" bezeichnen würden, dann hat es wahrscheinlich ein Dutzend solcher Klassen, was bedeutet, dass Sie diese Namen nicht verwenden würden. Sie hätten einen ThisManager und ThatManager und AnotherManger und so weiter.
gnasher729
Er sagt, Verben sollten niemals in Klassennamen vorkommen, aber ich habe gerade Adding Meaningful Context erneut gelesen, und in seinem Beispiel auf Seite 29 nennt er eine Klasse GuessStatisticMessage. Jetzt bin ich in Bezug auf die Regel verwirrt, weil ich seine Verwendung von Guess als Verb und nicht als Substantiv interpretiere. dictionary.com/browse/guess?s=t
Devin Gleason Lambert
2
@ DevinGleasonLambert Aber es ist keine Vermutung. Es ist eine Vermutungsstatistiknachricht. Eine Nachricht ist ein Substantiv. Guess Statistic beschreibt nur die Art der Nachricht, die es ist - eine, die Nachrichten über Guess Statistics enthält.
Thomas Owens
7

Er versucht zwischen Dingen (Substantiven) und Handlungen (Verben) zu unterscheiden. Im konventionellen objektorientierten Design verstehen wir Klassen als Dinge und ihre Methoden als die Aktionen, die diese Dinge ausführen können. Um zu verwalten ist zu kümmern oder zu koordinieren, während Manager eine Person oder Sache, die verwaltet.

In Einführungsbüchern wird dies in der Regel auf die einfachsten und naheliegendsten Begriffe reduziert, die wie bei einer Klasse mit dem Namen Dog mit den Methoden Bark und Bite möglich sind . In Klassen der realen Welt ist die Unterscheidung oft etwas subtiler, aber immer noch vorhanden. Ich glaube jedoch, dass Onkel Bob darauf hinweist, dass Manager zwar ein Substantiv ist, aber viel Aufmerksamkeit auf das richtet, was der Manager tut, und nicht auf das, was es ist - es ist ein zu vages Wort, um genau zu beschreiben, was es ist verwaltet werden oder wie.

pswg
quelle
5
Leider kann diese Art des Denkens zu falschen Designs führen. Eines der besten Beispiele ist das klassische Einführungsbeispiel eines Bankkontos. In fast allen OO-Lehrbüchern Accountist ein Objekt balanceein Feld und transfereine Methode. Aber das richtige Design wäre: TransferIst ein Objekt, accountist ein Feld und balanceist eine Methode. So werden Bankensysteme tatsächlich implementiert und so funktionierte Banking tatsächlich vor Computern.
Jörg W Mittag
@ JörgWMittag: diese warnende Geschichte ist es wert, als Antwort veröffentlicht zu werden; dass dies allgemeine Richtlinien sind und in seltenen Fällen zu einer schlechten Zersetzung führen können.
smci