Skip to content
IRC-CodingIRC-Coding
Clean CodeSOLIDSRPOCPLSPISPDIPDiseño orientado a objetos

Clean Code y SOLID: Principios explicados

Clean Code y SOLID: SRP, OCP, LSP, ISP, DIP. Significado, ventajas, desventajas, ejemplos y preguntas de examen.

S

schutzgeist

8 min read
Clean Code y SOLID: Principios explicados

Clean Code y SOLID

Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe

Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe

39,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Clean Code für Dummies: Besser programmieren. Professionelle Softwareentwicklung.

Clean Code für Dummies: Besser programmieren. Professionelle Softwareentwicklung.

24,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Besser coden: Best Practices für Clean Code. Das ideale Buch für die professionelle Softwareentwicklung

Besser coden: Best Practices für Clean Code. Das ideale Buch für die professionelle Softwareentwicklung

34,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Este artículo es una explicación de conceptos sobre Clean Code y SOLID, incluyendo preguntas de examen, componentes clave y etiquetas.

En pocas palabras

Clean Code representa código legible, mantenible y libre de errores. SOLID comprende cinco directrices fundamentales para el diseño orientado a objetos.

Descripción técnica compacta

Clean Code se centra, entre otros aspectos, en la nomenclatura, la estructura, la reutilización y funciones pequeñas y comprensibles.

SOLID:

  • S (SRP): Una clase tiene exactamente una responsabilidad.
  • O (OCP): Abierta para extensión, cerrada para modificación.
  • L (LSP): Los subtipos deben reemplazar correctamente los tipos base.
  • I (ISP): Muchas interfaces pequeñas en lugar de pocas grandes.
  • D (DIP): Dependencias a través de abstracciones, no de clases concretas.

Puntos clave relevantes para exámenes

  • Clean Code = legible, mantenible. Clean Code significa que el código fuente se escribe de modo que sea fácil de entender, cambiar y ampliar. La legibilidad reduce errores y facilita la colaboración en equipo.
  • SRP: una clase = una tarea. El Single Responsibility Principle establece que una clase debe tener una única responsabilidad. Si algo cambia por una razón, solo esa clase debe verse afectada.
  • OCP: extensible sin cambios. El Open-Closed Principle establece que las clases deben estar abiertas para extensiones pero cerradas para cambios directos. Las nuevas funciones se realizan añadiendo código, no reconstruyendo el existente.
  • LSP: subclases correctamente sustituibles (relevante para IHK). El Liskov Substitution Principle exige que una clase derivada pueda reemplazar la clase base en cualquier momento sin que el programa falle. Este es un tema frecuente en exámenes de IHK.
  • ISP: separación de interfaces (práctica). El Interface Segregation Principle establece que las interfaces deben ser pequeñas y especializadas. Las clases deben implementar solo los métodos que realmente necesitan.
  • DIP: dependencia a través de interfaces. El Dependency Inversion Principle establece que los módulos deben depender de abstracciones, no de clases concretas. Esto mantiene el código flexible y fácil de probar.
  • Economía: menos bugs, incorporación más rápida. El código limpio reduce la propensión a errores y ayuda a los nuevos desarrolladores a entender el proyecto más rápidamente. Esto reduce costos a largo plazo.
  • Documentación: mencionar principios en la descripción arquitectónica. Cuando Clean Code y SOLID se aplican deliberadamente en un proyecto, estas decisiones deben constar en la documentación de la arquitectura. De este modo, los principios permanecen claros para todos los involucrados.

Componentes clave

  1. Nombres significativos - Variables, funciones y clases deben llevar nombres que expliquen su propósito directamente. Un buen nombre sustituye muchos comentarios y hace el código autodocumentado.
  2. Encapsulación/SRP - La encapsulación oculta detalles internos y protege los datos del acceso no autorizado. Combinada con SRP, produce clases pequeñas y enfocadas que cumplen una única tarea.
  3. Herencia según LSP - La herencia debe usarse de modo que las clases derivadas siempre reemplacen correctamente la clase base. Esto evita sorpresas con el polimorfismo.
  4. Evitar God Objects - Los God Objects son clases que cargan demasiadas responsabilidades y conocen muchas otras clases. Deben dividirse en clases más pequeñas y especializadas.
  5. Interfaces ISP - Las interfaces deben ser pequeñas y coherentes funcionalmente. Una clase implementa solo aquellas interfaces cuyos métodos realmente necesita, manteniéndose así esbelta.
  6. Abstracción/DIP - Las abstracciones como interfaces o clases abstractas desacoplan módulos entre sí. DIP exige que los módulos de alto nivel no dependan de detalles de bajo nivel, sino de abstracciones.
  7. Unit Tests - Los Unit Tests verifican componentes individuales aisladamente. Clean Code y SOLID facilitan las pruebas porque las clases pequeñas y desacopladas son más simples de probar con mocks.
  8. Refactoring - El refactoring es la mejora continua del código existente sin cambiar su comportamiento. A través del refactoring, el código permanece mantenible y se reducen las deudas técnicas.
  9. Diagramas para explicar - Los diagramas UML o simples diagramas de clases ayudan a visualizar relaciones y dependencias. Son especialmente útiles para descripciones arquitectónicas y preparación de exámenes.
  10. Herramientas de análisis de código (SonarQube) - Herramientas como SonarQube detectan automáticamente code smells, complejidad y problemas de seguridad. Ayudan a los equipos a mantener Clean Code y SOLID en el día a día del proyecto.

Ejemplo práctico (SRP)

class ReportPrinter {
  public void print(PDFReport report) {
    // solo imprimir, no crear reportes
  }
}

Ventajas e inconvenientes

Ventajas

  • Código comprensible
  • Mejor testabilidad
  • Menor acoplamiento
  • Arquitectura estructurada

Inconvenientes

  • Mayor esfuerzo inicial
  • La aplicación excesiva puede fragmentar

Preguntas típicas de examen (con respuesta breve)

  1. ¿Qué significa Clean Code? Código legible y mantenible.
  2. ¿Cuáles son los principios SOLID? SRP, OCP, LSP, ISP, DIP.
  3. ¿Qué es un God Object? Una clase con demasiadas responsabilidades.
  4. ¿Por qué es importante DIP? Desacopla nivel alto del nivel bajo.

Respuesta abierta

SOLID son directrices, no reglas rígidas. En exámenes, lo importante es poder explicar un principio y justificarlo con un ejemplo, sin caer en overengineering.

Estrategia de aprendizaje

  1. Leer capítulos pequeños sobre Clean Code.
  2. Refactorizar tu propio código (SRP/LSP).
  3. Formular un ejemplo por principio.
  4. Evitar clases demasiado grandes.

Análisis temático

  • Núcleo: OOP, principios de diseño
  • Desafíos: Overengineering
  • Seguridad: menos estado oculto
  • Documentación: decisiones arquitectónicas
  • Economía: menor tasa de bugs

Información adicional

  1. https://refactoring.guru/design-patterns/principles
  2. https://www.sonarsource.com/products/sonarqube/

FAQ: Clean Code y SOLID

1. ¿Qué es Clean Code?

Clean Code es código fuente que es fácil de leer, entender y mantener. Sigue convenciones claras, utiliza nombres significativos y evita complejidad innecesaria.

2. ¿Qué significa SOLID?

SOLID es un acrónimo de cinco principios del diseño orientado a objetos: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation y Dependency Inversion.

3. ¿Qué es el Single Responsibility Principle?

El Single Responsibility Principle establece que una clase debe tener una única responsabilidad. Si hay múltiples razones para cambiar una clase, debe dividirse.

4. ¿Qué es el Open-Closed Principle?

El Open-Closed Principle establece que las clases deben estar abiertas para extensiones pero cerradas para cambios. Las nuevas funciones se implementan añadiendo código, no reconstruyendo el existente.

5. ¿Qué es el Liskov Substitution Principle?

El Liskov Substitution Principle exige que una clase derivada pueda reemplazar la clase base en cualquier momento sin que el programa falle. Es un tema importante en exámenes.

6. ¿Qué es el Interface Segregation Principle?

El Interface Segregation Principle establece que las interfaces deben ser pequeñas y especializadas. Las clases deben implementar solo los métodos que realmente necesitan.

7. ¿Qué es el Dependency Inversion Principle?

El Dependency Inversion Principle establece que los módulos deben depender de abstracciones, no de clases concretas. Esto mantiene el código flexible y testeable.

8. ¿Qué es un God Object?

Un God Object es una clase que carga demasiadas responsabilidades y conoce muchas otras partes del sistema. Los God Objects violan el SRP y deben dividirse en clases más pequeñas.

9. ¿Qué es Code Smell?

Un code smell es un indicador de posibles problemas en el código, aunque aún funcione. Las métodos largos, clases grandes o código duplicado son code smells típicos.

10. ¿Qué es Refactoring?

Refactoring es la mejora del código existente sin cambiar su comportamiento. El objetivo es hacer el código más legible, mantenible y testeable.

11. ¿Qué es Encapsulación?

La encapsulación oculta los detalles internos de una clase y expone solo una interfaz claramente definida. Protege los datos del acceso no autorizado y reduce el acoplamiento.

12. ¿Qué es Acoplamiento?

El acoplamiento describe cuán fuertemente los módulos dependen unos de otros. Un acoplamiento bajo es deseable porque facilita cambios, pruebas y reutilización.

13. ¿Qué es Cohesión?

La cohesión describe cuán fuertemente los elementos de una clase o módulo están relacionados. Alta cohesión significa que todas las partes de una clase contribuyen a la misma responsabilidad.

14. ¿Qué es un Unit Test?

Un Unit Test verifica un componente individual de forma aislada. Clean Code y SOLID facilitan las pruebas unitarias porque las clases pequeñas y desacopladas son simples de probar.

15. ¿Qué es Dependency Injection?

Dependency Injection es una técnica donde las dependencias se proporcionan desde el exterior, en lugar de que una clase las cree por sí misma. Ayuda a implementar el DIP.

16. ¿Qué es una Interface?

Una interface define un contrato que las clases que la implementan deben cumplir. Las interfaces permiten abstracción y desacoplan módulos entre sí.

17. ¿Qué es Polimorfismo?

El polimorfismo permite que diferentes clases se usen a través de la misma interfaz. Es la base del Liskov Substitution Principle.

18. ¿Qué es Overengineering?

Overengineering es la aplicación excesiva de patrones o principios complejos cuando soluciones más simples serían suficientes. SOLID debe aplicarse pragmáticamente, no dogmáticamente.

19. ¿Qué es una Code Review?

Una code review es el examen del código por otros desarrolladores. Se verifican la legibilidad, el cumplimiento de principios y posibles errores.

20. ¿Qué es un nombre significativo?

Un nombre significativo describe la intención detrás de una variable, función o clase. Hace el código autoexplicativo y reduce la necesidad de comentarios.

21. ¿Qué es DRY?

DRY significa Do not Repeat Yourself. Establece que deben evitarse los duplicados en el código, porque las repeticiones dificultan el mantenimiento y favorecen errores.

22. ¿Qué es KISS?

KISS significa Keep It Simple, Stupid. Es un principio que establece que las soluciones deben mantenerse tan simples como sea posible para evitar errores y mejorar la mantenibilidad.

23. ¿Qué es YAGNI?

YAGNI significa You Ain’t Gonna Need It. Advierte contra la implementación de funciones que actualmente no se necesitan, para evitar complejidad innecesaria.

24. ¿Qué es Deuda Técnica?

La deuda técnica surge cuando se posponen deliberadamente soluciones limpias en favor de resultados rápidos. Debe pagarse posteriormente mediante refactoring.

25. ¿Qué es SonarQube?

SonarQube es una herramienta de análisis de código que detecta automáticamente code smells, bugs, brechas de seguridad y deuda técnica. Ayuda a los equipos a mantener Clean Code.

26. ¿Qué es un diagrama de clases UML?

Un diagrama de clases UML representa clases, atributos, métodos y sus relaciones. Ayuda a comunicar arquitecturas y visualizar los principios SOLID.

27. ¿Qué es Testabilidad?

La testabilidad describe lo simple que es probar automáticamente una parte del código. Clean Code y bajo acoplamiento aumentan significativamente la testabilidad.

28. ¿Qué es Mantenibilidad?

La mantenibilidad describe lo fácil que es adaptar, corregir o ampliar un sistema. Clean Code y SOLID mejoran la mantenibilidad al mejorar la estructura y legibilidad.

29. ¿Qué es una Decisión Arquitectónica?

Una decisión arquitectónica es una elección deliberada para estructurar un sistema. La aplicación de Clean Code y SOLID debe constar en la documentación de la arquitectura.

30. ¿Cómo empiezo con Clean Code y SOLID?

Empiezas con pasos pequeños: usar nombres significativos, reducir las clases a una responsabilidad, utilizar interfaces y realizar refactoring regularmente. Formular un ejemplo por principio SOLID ayuda en el aprendizaje.

Continuamos en la ruta de aprendizaje SOLID

El siguiente artículo en la ruta de aprendizaje SOLID cubre SOLID Prinzipien Grundlagen — una introducción detallada de los cinco principios SOLID con ejemplos de código.

Volver al blog
Share:

Nächster Artikel in Arquitectura de Software

Weiterlesen
Complejidad Algorítmica: Ataques Worst-Case

Entradas relacionadas