No hay una respuesta clara a eso. Aunque la pregunta es estrecha, las explicaciones no lo son.
Para mí, es algo como la Navaja de Occam si quieres. Es un ideal donde trato de medir mi código actual. Es difícil precisarlo en palabras simples y simples. Otra metáfora sería »un tema« que es tan abstracto, es decir, difícil de entender, como »responsabilidad única«. Una tercera descripción sería "tratar con un nivel de abstracción".
¿Qué significa eso prácticamente?
Últimamente uso un estilo de codificación que consta principalmente de dos fases:
La fase I se describe mejor como caos creativo. En esta fase, escribo el código a medida que fluyen los pensamientos, es decir, crudo y feo.
La fase II es todo lo contrario. Es como limpiar después de un huracán. Esto requiere más trabajo y disciplina. Y luego miro el código desde la perspectiva de un diseñador.
Ahora estoy trabajando principalmente en Python, lo que me permite pensar en objetos y clases más adelante. Primera fase I : escribo solo funciones y las distribuyo casi al azar en diferentes módulos. En la Fase II , después de poner en marcha las cosas, miro más de cerca qué módulo trata con qué parte de la solución. Y mientras hojeo los módulos, los temas son emergentes para mí. Algunas funciones están relacionadas temáticamente. Estos son buenos candidatos para las clases . Y después de convertir las funciones en clases, lo que casi se hace con sangría y agregar self
a la lista de parámetros en python;), uso SRP
como la Navaja de Occam para quitar la funcionalidad a otros módulos y clases.
Un ejemplo actual puede estar escribiendo una pequeña funcionalidad de exportación el otro día.
Existía la necesidad de csv , excel y hojas de excel combinadas en un zip.
La funcionalidad simple se realizó en tres vistas (= funciones). Cada función utilizó un método común para determinar los filtros y un segundo método para recuperar los datos. Luego, en cada función, se realizó la preparación de la exportación y se entregó como una Respuesta del servidor.
Había demasiados niveles de abstracción mezclados:
I) tratar con solicitudes / respuestas entrantes / salientes
II) determinación de filtros
III) recuperar datos
IV) transformación de datos
El paso fácil fue usar una abstracción ( exporter
) para tratar las capas II-IV en un primer paso.
Lo único que quedaba era el tema relacionado con las solicitudes / respuestas . En el mismo nivel de abstracción se extraen los parámetros de solicitud, lo cual está bien. Entonces, para este punto de vista, tenía una "responsabilidad".
En segundo lugar, tuve que romper el exportador, que, como vimos, consistía en al menos otras tres capas de abstracción.
La determinación de los criterios de filtro y la recuperación real están casi en el mismo nivel de abstracción (los filtros son necesarios para obtener el subconjunto correcto de los datos). Estos niveles se pusieron en algo así como una capa de acceso a datos .
En el siguiente paso, separé los mecanismos de exportación reales: cuando se necesitaba escribir en un archivo temporal, lo dividí en dos "responsabilidades": una para la escritura real de los datos en el disco y otra parte que trataba con el formato real.
A lo largo de la formación de las clases y los módulos, las cosas se aclararon, lo que pertenecía a dónde. Y siempre la pregunta latente, si la clase hace demasiado .
¿Cómo determina qué responsabilidades debe tener cada clase y cómo define una responsabilidad en el contexto de SRP?
Es difícil dar una receta a seguir. Por supuesto, podría repetir la críptica regla de un nivel de abstracción, si eso ayuda.
Principalmente para mí es una especie de "intuición artística" que conduce al diseño actual; Modelo código como un artista puede esculpir arcilla o pintar.
Imaginame como un Coding Bob Ross ;)