Sono uno sviluppatore di lunga data (ho 49 anni) ma piuttosto nuovo nello sviluppo orientato agli oggetti. Ho letto di OO dalla Eiffel di Bertrand Meyer, ma ho programmato davvero poco OO.
Il punto è che ogni libro sul design di OO inizia con un esempio di barca, auto o qualsiasi oggetto comune che usiamo molto spesso e iniziano ad aggiungere attributi e metodi e spiegano come modellano lo stato dell'oggetto e cosa si può fare esso.
Quindi di solito vanno qualcosa come "migliore è il modello, meglio rappresenta l'oggetto nell'applicazione e meglio tutto viene fuori".
Fin qui tutto bene, ma, d'altra parte, ho trovato diversi autori che danno ricette come "una classe dovrebbe rientrare in una sola pagina" (aggiungerei "su quale dimensione del monitor?" Ora che non proviamo a non per stampare il codice!).
Prendiamo ad esempio una PurchaseOrder
classe, che ha una macchina a stati finiti che controlla il suo comportamento e una raccolta di PurchaseOrderItem
, uno degli argomenti qui al lavoro è che dovremmo usare una PurchaseOrder
classe semplice, con alcuni metodi (poco più di una classe di dati), e avere una PurchaseOrderFSM
"classe di esperti" che gestisce la macchina a stati finiti per il PurchaseOrder
.
Direi che rientra nella classifica "Feature Envy" o "Inappropriate Intimacy" del post su Code Smells di Jeff Atwood su Coding Horror. Lo definirei semplicemente buonsenso. Se posso rilasciare, approvare o annullare l'ordine reale di acquisto, allora la PurchaseOrder
classe dovrebbe avere issuePO
, approvePO
e cancelPO
metodi.
Questo non vale per i principi secolari di "massimizzare la coesione" e "minimizzare l'accoppiamento" che capisco come pietre miliari di OO?
Inoltre, ciò non aiuta la manutenibilità della classe?
PurchaseOrder
, si può solo chiamare i vostri metodiissue
,approve
ecancel
. IlPO
suffisso aggiunge solo un valore negativo.