Principio de responsabilidad única en SOLID

Clase 2 de 27Curso de Patrones de Diseño y SOLID en Python

Resumen

Aplicar el principio de responsabilidad única fortalece el diseño del software desde la base. Con foco en claridad y orden, este enfoque, propuesto por Robert C. Martin, ayuda a escribir código más fácil de mantener, probar y escalar, evitando efectos secundarios innecesarios y costos de cambio altos.

¿Qué es el principio de responsabilidad única y cómo se define?

El SRP establece que una clase debe tener una y solo una razón para cambiar. También puede extrapolarse a funciones: cada componente debe tener una responsabilidad única.

  • Definición formal según Robert C. Martin: una sola razón para cambiar.
  • Aplicación práctica: separar responsabilidades en clases o funciones pequeñas.
  • Efecto directo: menos áreas del sistema impactadas por una modificación.

¿Por qué concentrar una sola responsabilidad?

Porque cuando una clase o función hace “demasiado”, el código se desordena. Aparecen múltiples razones para cambiar y, por tanto, más riesgo y costo.

  • Código con muchas responsabilidades: difícil de entender y de modificar.
  • Una responsabilidad única: cambios focalizados y predecibles.

¿Cómo se relaciona con Single Responsibility Principle?

El término en inglés, Single Responsibility Principle, resume la idea central: cada pieza del sistema debe encargarse de una sola cosa.

¿Qué beneficios ofrece: mantenibilidad, reusabilidad y escalabilidad?

Separar responsabilidades trae ventajas claras en el ciclo de vida del software. Cuando el diseño es claro, es más simple evolucionar el sistema sin romper otras partes.

  • Mantenibilidad: menos desorden, menor costo de modificación y corrección de bugs.
  • Reusabilidad: componentes pequeños y específicos se pueden usar en múltiples contextos.
  • Pruebas unitarias: preparar escenarios es más simple cuando cada función hace una sola cosa.
  • Escalabilidad del sistema: crecer sin efectos secundarios inesperados.
  • Menor complejidad: cada parte es más simple de razonar y cambiar.

¿Cómo impacta en pruebas unitarias?

Las pruebas unitarias son un pilar del desarrollo de software. Con SRP, probar es más directo.

  • Preparación sencilla: menos dependencias y configuraciones.
  • Validación enfocada: se prueba comportamiento específico.
  • Ciclo de desarrollo más rápido: errores detectados antes, con menos fricción.

¿Qué pasa con cohesión y acoplamiento?

Una máxima del diseño indica: aumentar la cohesión y disminuir el acoplamiento.

  • SRP aumenta la cohesión: cada clase o función tiene un propósito claro.
  • SRP disminuye el acoplamiento: menos dependencias entre partes del sistema.

¿Cómo reconocer cuándo aplicar SRP en tu código?

Hay señales claras que indican que una clase o función asume demasiado. Identificarlas a tiempo evita costos y bloqueos futuros.

  • Varias razones para cambiar: múltiples motivos de modificación en una misma pieza.
  • Cambios de contexto: la lógica salta entre responsabilidades distintas.
  • Alta complejidad y difícil mantenimiento: agregar un feature o arreglar un error resulta costoso.
  • Dificultad para realizar pruebas unitarias: demasiada preparación alrededor de la función que se quiere probar.
  • Duplicación del código: la misma validación o comportamiento repetido en varios lugares.

¿Qué hacer ante duplicación de responsabilidades?

Extraer y centralizar.

  • Mover la lógica repetida a una función única.
  • Reutilizar esa función donde se requiera el mismo comportamiento.
  • Reducir errores al tener una sola fuente de verdad.

¿Cómo actuar cuando hay múltiples responsabilidades?

Dividir y delimitar.

  • Identificar qué hace cada segmento de la clase o función.
  • Separar en componentes con responsabilidades únicas.
  • Aislar efectos secundarios y facilitar pruebas.

Comparte en comentarios: ¿en qué partes de tu código aplicarías el principio de responsabilidad única? Si ya lo usaste, ¿cómo lo implementaste y qué resultados obtuviste?