Skip to content
IRC-CodingIRC-Coding
SOLIDSRPOCPLSPISPDIPClean CodeOOPCalidad de software

Principios SOLID: SRP, OCP, LSP, ISP y DIP

Guía de principios SOLID: Single Responsibility, Open-Closed, Liskov, Interface Segregation y Dependency Inversion con ejemplos prácticos.

S

schutzgeist

3 min read
Principios SOLID: SRP, OCP, LSP, ISP y DIP

Fundamentos de los Principios SOLID

SOLID es un acrónimo que agrupa cinco principios de diseño orientado a objetos, cuyo objetivo es crear código mantenible, extensible y resiliente a fallos.

En Resumen

SOLID: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.

S — Single Responsibility (SRP)

Una clase debe tener una única razón para cambiar.

// Incorrecto: múltiples responsabilidades
class User {
  saveToDatabase() { /* DB */ }
  sendEmail() { /* E-mail */ }
  validateEmail() { /* Validación */ }
}

// Correcto: separado
class User {}
class UserRepository { save(u: User) {} }
class EmailService { send(u: User, msg: string) {} }

O — Open-Closed (OCP)

Abierto para extensión, cerrado para modificación.

// Incorrecto: necesita cambios al agregar un tipo
class DiscountCalculator {
  calculate(type: string): number {
    if (type === 'premium') return 0.8;
    if (type === 'vip') return 0.7;
    return 1.0;
  }
}

// Correcto: Strategy Pattern
interface DiscountStrategy { getFactor(): number; }
class PremiumDiscount implements DiscountStrategy { getFactor() { return 0.8; } }
class VipDiscount implements DiscountStrategy { getFactor() { return 0.7; } }

L — Liskov Substitution (LSP)

Los subtipos deben poder reemplazar a los tipos base sin romper el comportamiento esperado.

// Incorrecto: Penguin no puede volar
class Bird { fly() {} }
class Penguin extends Bird { fly() { throw new Error('Cannot fly'); } }

// Correcto: jerarquía adecuada
interface Bird { layEgg(): void; }
interface FlyingBird extends Bird { fly(): void; }

I — Interface Segregation (ISP)

Ningún cliente debe depender de métodos que no utiliza.

// Incorrecto: interfaz demasiado amplia
interface Worker { work(): void; eat(): void; sleep(): void; }

// Correcto: separado
interface Workable { work(): void; }
interface Eatable { eat(): void; }

D — Dependency Inversion (DIP)

Depende de abstracciones, no de implementaciones concretas.

// Incorrecto: acoplamiento directo
class OrderService {
  private repo = new MySQLDatabase();
}

// Correcto: inyección de dependencias
interface OrderRepository { save(order: Order): void; }
class OrderService {
  constructor(private repo: OrderRepository) {}
}

SOLID en Perspectiva

PrincipioSignificadoObjetivo
SRPSingle ResponsibilityUna clase, una responsabilidad
OCPOpen-ClosedExtensible sin modificación
LSPLiskov SubstitutionLos subtipos reemplazan tipos base
ISPInterface SegregationInterfaces pequeñas y específicas
DIPDependency InversionAbstracción antes que implementación

Puntos Clave para Recordar

  • SOLID es un acrónimo de cinco principios de diseño OOP
  • SRP: una razón para cambiar por clase
  • OCP: extensión sin modificación, utiliza Strategy Pattern
  • LSP: los subtipos deben cumplir los contratos
  • ISP: muchas interfaces pequeñas en lugar de una grande
  • DIP: inyección de dependencias, la abstracción como dependencia

Preguntas Frecuentes

1. ¿Qué significa SOLID?

SRP, OCP, LSP, ISP, DIP.

2. ¿Qué dice SRP?

Una clase, una responsabilidad.

3. ¿Qué dice OCP?

Abierto para extensión, cerrado para modificación.

4. ¿Qué dice LSP?

Los subtipos reemplazan tipos base.

5. ¿Qué dice ISP?

Interfaces pequeñas.

6. ¿Qué dice DIP?

Abstracciones antes que implementaciones concretas.

7. ¿Quién estableció SOLID?

Robert C. Martin.

8. ¿Ejemplo de violación de LSP?

Penguin hereda de Bird pero no puede volar.

9. ¿Cómo aplicar OCP?

Strategy Pattern.

10. ¿Qué es DI?

Inyectar dependencias.

11. ¿SOLID vs Clean Code?

SOLID es diseño, Clean Code incluye también estilo.

12. ¿Qué es una interfaz demasiado amplia?

Demasiados métodos, viola ISP.

13. ¿Cuándo aplicar SOLID?

A medida que los proyectos crecen.

14. ¿Se puede llevar SOLID al extremo?

Sí, en proyectos pequeños puede llevar a sobrediseño.

15. ¿SOLID y pruebas?

DIP facilita mocking, SRP hace pruebas más enfocadas.

Continuando en el Camino SOLID

El próximo artículo en el camino SOLID explora Análisis y diseño: UML, GRASP, SOLID y objetivos de calidad, donde se aprende cómo los diagramas UML, patrones GRASP y principios SOLID se integran en la arquitectura de software.

Fuentes

  1. https://en.wikipedia.org/wiki/SOLID
  2. https://www.oreilly.com/library/view/clean-code/9780134661742/
  3. https://refactoring.guru/design-patterns/solid-principles

Libros Recomendados sobre Calidad de Software

Si deseas profundizar en SOLID, Clean Code y calidad de software, te recomendamos los siguientes títulos:

Keine Bücher für Kategorie "software-engineering" gefunden.

Volver al blog
Share:

Nächster Artikel in Calidad de software

Weiterlesen
Shift Left Testing: Calidad en el desarrollo

Entradas relacionadas