Ich bin ein langjähriger Entwickler (ich bin 49), aber eher neu in der objektorientierten Entwicklung. Ich lese seit Bertrand Meyers Eiffel über OO, aber ich habe wirklich wenig über OO programmiert.
Der Punkt ist, dass jedes Buch über OO-Design mit einem Beispiel für ein Boot, ein Auto oder ein beliebiges Objekt beginnt, das wir sehr oft verwenden. Sie beginnen, Attribute und Methoden hinzuzufügen und zu erklären, wie sie den Zustand des Objekts modellieren und was damit getan werden kann es.
Sie lauten normalerweise: "Je besser das Modell ist, desto besser repräsentiert es das Objekt in der Anwendung und desto besser kommt alles heraus".
Bisher so gut, aber andererseits habe ich mehrere Autoren gefunden, die Rezepte wie "Eine Klasse sollte auf nur eine Seite passen" (ich würde hinzufügen "Auf welcher Bildschirmgröße?", Jetzt, wo wir es nicht versuchen Code drucken!).
Nehmen wir zum Beispiel eine PurchaseOrder
Klasse, die eine endliche Zustandsmaschine hat, die ihr Verhalten steuert, und eine Sammlung von PurchaseOrderItem
, eines der Argumente hier ist, dass wir eine PurchaseOrder
einfache Klasse mit einigen Methoden (etwas mehr als eine Datenklasse) verwenden sollten und haben eine PurchaseOrderFSM
"Expertenklasse", die die endliche Zustandsmaschine für die behandelt PurchaseOrder
.
Ich würde sagen, das fällt unter die Klassifizierung "Feature Envy" oder "Inappropriate Intimacy" von Jeff Atwoods Code Smells- Post zu Coding Horror. Ich würde es nur gesunden Menschenverstand nennen. Wenn ich ausgeben kann, genehmigen oder zu stornieren meine wirkliche Bestellung, dann die PurchaseOrder
sollte Klasse haben issuePO
, approvePO
und cancelPO
Methoden.
Gehört das nicht zu den uralten Prinzipien „Zusammenhalt maximieren“ und „Kopplung minimieren“, die ich als Eckpfeiler von OO verstehe?
Hilft das nicht auch der Wartbarkeit der Klasse?
PurchaseOrder
, können Sie einfach Ihre Methoden nennenissue
,approve
undcancel
. DasPO
Suffix fügt nur einen negativen Wert hinzu.