Je suis un développeur de longue date (j'ai 49 ans) mais plutôt nouveau pour le développement orienté objet. Je lis sur OO depuis Eiffel de Bertrand Meyer, mais j'ai fait très peu de programmation OO.
Le fait est que chaque livre sur la conception OO commence par un exemple de bateau, de voiture ou de tout objet commun que nous utilisons très souvent, et ils commencent à ajouter des attributs et des méthodes, et expliquent comment ils modélisent l'état de l'objet et ce qui peut être fait avec il.
Donc, ils vont généralement quelque chose comme "meilleur est le modèle, mieux il représente l'objet dans l'application et mieux tout sort".
Jusqu'ici tout va bien, mais, d'autre part, j'ai trouvé plusieurs auteurs qui donnent des recettes telles que "une classe devrait tenir sur une seule page" (j'ajouterais "sur quelle taille de moniteur?" Maintenant que nous essayons de ne pas pour imprimer le code!).
Prenons par exemple une PurchaseOrder
classe, qui a une machine à états finis contrôlant son comportement et une collection de PurchaseOrderItem
, l'un des arguments ici au travail est que nous devrions utiliser une PurchaseOrder
classe simple, avec quelques méthodes (un peu plus qu'une classe de données), et avoir une PurchaseOrderFSM
«classe expert» qui gère la machine à états finis pour le PurchaseOrder
.
Je dirais que cela tombe dans la classification «Feature Envy» ou «Inapproprié Intimité» du message Code Smells de Jeff Atwood sur Coding Horror. J'appellerais ça du bon sens. Si je peux émettre, approuver ou annuler mon vrai bon de commande, la PurchaseOrder
classe devrait avoir issuePO
, approvePO
et les cancelPO
méthodes.
Cela ne va-t-il pas avec les principes séculaires de «maximiser la cohésion» et de «minimiser le couplage» que je considère comme les pierres angulaires de l'OO?
D'ailleurs, cela ne contribue-t-il pas à la maintenabilité de la classe?
PurchaseOrder
, vous pouvez simplement nommer vos méthodesissue
,approve
etcancel
. LePO
suffixe n'ajoute qu'une valeur négative.