Sou desenvolvedor de longa data (tenho 49 anos), mas sou novo no desenvolvimento orientado a objetos. Eu tenho lido sobre OO desde Eiffel de Bertrand Meyer, mas fiz muito pouca programação OO.
A questão é que todo livro sobre design de OO começa com um exemplo de barco, carro ou qualquer objeto comum que usamos com muita frequência, e eles começam a adicionar atributos e métodos e a explicar como modelam o estado do objeto e o que pode ser feito com ele. isto.
Então eles costumam dizer algo como "quanto melhor o modelo, melhor ele representa o objeto no aplicativo e melhor ele sai".
Até aqui tudo bem, mas, por outro lado, encontrei vários autores que fornecem receitas como “uma classe deve caber em apenas uma página” (acrescentaria “em que tamanho de monitor?” Agora que tentamos não para imprimir código!).
Tomemos, por exemplo, uma PurchaseOrder
classe que tenha uma máquina de estados finitos controlando seu comportamento e uma coleção de PurchaseOrderItem
, um dos argumentos aqui no trabalho é que devemos usar uma PurchaseOrder
classe simples, com alguns métodos (pouco mais que uma classe de dados) e ter uma PurchaseOrderFSM
"classe especialista" que lida com a máquina de estados finitos para o PurchaseOrder
.
Eu diria que se enquadra na classificação “Feature Envy” ou “In Intimate Intimity” do post Code Smells de Jeff Atwood em Coding Horror. Eu chamaria isso de bom senso. Se eu puder emitir, aprovar ou cancelar o meu pedido de compra real, então a PurchaseOrder
classe deve ter issuePO
, approvePO
e cancelPO
métodos.
Isso não se aplica aos princípios da velhice “maximizar a coesão” e “minimizar o acoplamento” que entendo como pedras angulares da OO?
Além disso, isso não ajuda na manutenção da classe?
PurchaseOrder
, você poderia apenas nomear seus métodosissue
,approve
ecancel
. OPO
sufixo adiciona apenas valor negativo.