Flup se dirige en la dirección correcta. El "principio de responsabilidad única" se aplicó originalmente a los procedimientos. Por ejemplo, Dennis Ritchie diría que una función debe hacer una cosa y hacerlo bien. Luego, en C ++, Bjarne Stroustrup diría que una clase debería hacer una cosa y hacerlo bien.
Tenga en cuenta que, excepto como reglas generales, estos dos tienen poco o nada que ver formalmente entre sí. Solo atienden a lo que es conveniente expresar en el lenguaje de programación. Bueno, eso es algo. Pero es una historia bastante diferente a la que está conduciendo flup.
Las implementaciones modernas (es decir, ágiles y DDD) se centran más en lo que es importante para el negocio que en lo que el lenguaje de programación puede expresar. La parte sorprendente es que los lenguajes de programación aún no se han puesto al día. Los antiguos lenguajes similares a FORTRAN capturan responsabilidades que se ajustan a los principales modelos conceptuales de la época: los procesos que uno aplicaba a cada tarjeta a medida que pasaba por el lector de tarjetas, o (como en C) el procesamiento que acompañaba cada interrupción. Luego vinieron los idiomas ADT, que habían madurado hasta el punto de capturar lo que la gente DDD reinventaría más tarde como importante (aunque Jim Neighbours tenía la mayor parte de esto resuelto, publicado y en uso en 1968): lo que hoy llamamos clases . (NO son módulos).
Este paso fue menos una evolución que un columpio pendular. A medida que el péndulo se movía hacia los datos, perdimos el modelo de caso de uso inherente a FORTRAN. Eso está bien cuando su enfoque principal involucra los datos o las formas en una pantalla. Es un gran modelo para programas como PowerPoint, o al menos para sus operaciones simples.
Lo que se perdió son las responsabilidades del sistema . No vendemos los elementos de DDD. Y no conocemos bien los métodos de clase. Vendemos responsabilidades del sistema. En algún nivel, debe diseñar su sistema en torno al principio de responsabilidad única.
Entonces, si nos fijamos en personas como Rebecca Wirfs-Brock, o yo, que solían hablar sobre métodos de clase, ahora estamos hablando en términos de casos de uso. Eso es lo que vendemos. Esas son las operaciones del sistema. Un caso de uso debe tener una sola responsabilidad. Un caso de uso rara vez es una unidad arquitectónica. Pero todos intentaban fingir que sí. Testigo de la gente SOA, por ejemplo.
Es por eso que estoy entusiasmado con la arquitectura DCI de Trygve Reenskaug, que es lo que se describe en el libro de Arquitectura Lean anterior. Finalmente le da cierta importancia a lo que solía ser un respeto arbitrario y místico a la "responsabilidad única", como se encuentra en la mayoría de los argumentos anteriores. Esa estatura se relaciona con los modelos mentales humanos: los usuarios finales primero Y los programadores después. Se relaciona con preocupaciones comerciales. Y, casi por casualidad, encapsula el cambio a medida que flup nos desafía.
El principio de responsabilidad única, tal como lo conocemos, es un dinosaurio sobrante de sus días de origen o un caballo de pasatiempo que utilizamos como sustituto de la comprensión. Necesitas dejar algunos de estos caballos de afición para hacer un gran software. Y eso requiere pensar fuera de la caja. Mantener las cosas simples y fáciles de entender solo funciona cuando el problema es simple y fácil de entender. No estoy terriblemente interesado en esas soluciones: no son típicas, y no es donde radica el desafío.