Soy un desarrollador de mucho tiempo (tengo 49 años) pero soy bastante nuevo en el desarrollo orientado a objetos. He estado leyendo sobre OO desde Eiffel de Bertrand Meyer, pero he hecho muy poca programación de OO.
El punto es que cada libro sobre diseño OO comienza con un ejemplo de un bote, automóvil o cualquier objeto común que usemos muy a menudo, y comienzan a agregar atributos y métodos, y explican cómo modelan el estado del objeto y qué se puede hacer con eso.
Por lo tanto, suelen decir algo así como "cuanto mejor sea el modelo, mejor representa el objeto en la aplicación y mejor sale todo".
Hasta ahora todo bien, pero, por otro lado, he encontrado varios autores que dan recetas como "una clase debe caber en una sola página" (agregaría "¿en qué tamaño de monitor?" Ahora que intentamos no para imprimir el código!).
Tomemos, por ejemplo, una PurchaseOrderclase, que tiene una máquina de estados finitos que controla su comportamiento y una colección de PurchaseOrderItem, uno de los argumentos aquí en el trabajo es que deberíamos usar una PurchaseOrderclase simple, con algunos métodos (poco más que una clase de datos), y tener una PurchaseOrderFSM"clase experta" que maneja la máquina de estados finitos para el PurchaseOrder.
Diría que eso cae en la clasificación de "Envidia de características" o "Intimidad inapropiada" de la publicación de los olores de código de Jeff Atwood en Coding Horror. Simplemente lo llamaría sentido común. Si puedo emitir, aprobar o cancelar mi orden de compra real, entonces la PurchaseOrderclase debe tener issuePO, approvePOy cancelPOmétodos.
¿No va eso con los principios antiguos de "maximizar la cohesión" y "minimizar el acoplamiento" que entiendo como pilares de OO?
Además, ¿eso no ayuda a la mantenibilidad de la clase?
PurchaseOrder, sólo podía nombrar sus métodosissue,approveycancel. ElPOsufijo agrega solo valor negativo.