SOLID son cinco principios de diseño orientado a objetos formulados por Robert C. Martin. Su objetivo es crear software mantenible, extensible y con bajo acoplamiento.
| Letra | Principio | En una línea |
|---|---|---|
| S | Single Responsibility | Una clase, una razón para cambiar |
| O | Open/Closed | Abierto a extensión, cerrado a modificación |
| L | Liskov Substitution | Los subtipos deben sustituir a sus tipos base |
| I | Interface Segregation | Interfaces específicas, no "gordas" |
| D | Dependency Inversion | Depende de abstracciones, no de implementaciones |
S — Single Responsibility Principle:
// Mal: UserService gestiona usuarios Y envía emails
// Bien: UserService (lógica) + EmailService (notificaciones)O — Open/Closed Principle:
// Mal: switch gigante que hay que modificar por cada nuevo tipo
// Bien: interfaz + polimorfismo — añades nueva clase, no modificas código existenteL — Liskov Substitution Principle:
// Si Pato extends Ave, y Ave tiene volar()...
// Un PingüinoAve que lanza UnsupportedOperationException en volar() → viola LSPI — Interface Segregation Principle:
// Mal: interface Trabajador { trabajar(); comer(); dormir(); } ← los robots no comen
// Bien: interface Trabajable { trabajar(); } + interface Humano extends Trabajable { comer(); dormir(); }D — Dependency Inversion Principle:
// Mal: UserService depende de MySQLRepository
// Bien: UserService depende de UserRepository (interfaz)
// MySQLRepository implements UserRepository- Código más fácil de mantener: cada clase tiene una razón para cambiar.
- Extensión sin modificación: nuevas funcionalidades no rompen código existente.
- Testabilidad: interfaces + DIP permiten mocking.
- Bajo acoplamiento: cambiar una implementación no afecta a quien la usa.
Ver ExpSingleResponsibility.java, ExpOpenClosed.java, ExpLiskovSubstitution.java, ExpInterfaceSegregation.java y ExpDependencyInversion.java para ejemplos ejecutables de cada principio SOLID.