No hay una respuesta clara a eso. Aunque la pregunta es estrecha, las explicaciones no lo son.
Para mí, es algo como Occam's Razor si quieres. Es un ideal donde intento medir mi código actual contra. Es difícil concretarlo en palabras simples y sencillas. 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 utilizo un estilo de codificación que consta principalmente de dos fases:
La fase I se describe mejor como un caos creativo. En esta fase escribo el código a medida que los pensamientos fluyen, es decir, crudos y feos.
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.
Estoy trabajando principalmente en Python ahora, lo que me permite pensar en objetos y clases más adelante. Primero Fase I : escribo solo funciones y las distribuyo casi al azar en diferentes módulos. En Phase II , después de que empecé a hacer las cosas, tengo una visión más detallada de qué módulo trata con qué parte de la solución. Y mientras hojeo los módulos, temas son emergentes para mí. Algunas funciones están relacionadas temáticamente. Estos son buenos candidatos para 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 Occam's Razor para eliminar la funcionalidad de otros módulos y clases.
Un ejemplo actual puede ser escribir una pequeña funcionalidad de exportación el otro día.
Hubo la necesidad de csv , excel y combinó hojas de excel en un zip.
La funcionalidad simple se realizó en tres vistas (= funciones).
Cada función utiliza 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.
Hubo demasiados niveles de abstracción mezclados:
I) tratar con la solicitud / respuesta entrante / saliente
II) determinando filtros
III) recuperando 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 quedó fue el tema sobre solicitudes / respuestas .
En el mismo nivel de abstracción, está extrayendo los parámetros de solicitud , lo que está bien. Así que tenía para esta vista una "responsabilidad".
En segundo lugar, tuve que dividir el exportador, que, como vimos, consistía en al menos otras tres capas de abstracción.
Determinar los criterios de filtro y retrival reales 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 colocaron en algo así como una capa de acceso a datos .
En el siguiente paso rompí los mecanismos de exportación reales: donde se necesitaba escribir en un archivo temporal, dividí eso en dos "responsabilidades": una para la escritura real de los datos en el disco y otra parte que se ocupaba de la formato actual
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 para seguir. Por supuesto, podría repetir la críptica "un nivel de abstracción": descartar si eso ayuda.
En mi mayor parte, para mí es un tipo de "intuición artística" que conduce al diseño actual; Yo modelo el código como un artista puede esculpir arcilla o hacer pintura.
Imagíname como un Coding Bob Ross ;)