SOLID, es un acrónimo introducido por Robert Cecil Martin (conocido como “uncle Bob” firmante del Agile Manifiesto) refiriéndose a cinco principios básicos del Diseño Orientado a Objetos (OOD por sus siglas en inglés). Su objetivo es que, al aplicarse combinada y adecuadamente, estos cinco principios permitan la creación de sistemas robustos, de fácil mantenimiento y extensibles. Proveen una guía para que los desarrolladores eviten problemas en su código, refactorizando el mismo, y permitiendo una mejor integración dentro desarrollos ágiles de software.
De una manera muy básica paso a definir el significado de cada letra dentro del acrónimo.
Principios SOLID:
• SRP -Single Resposability Principle-:
Una clase debe ser responsable de una única funcionalidad. “Divide y vencerás” de manera que la funcionalidad debe estar divida en las más pequeñas responsabilidades que podamos implementar.
• Open/Close Principle:
Las entidades del software deben ser abiertas a la extensibilidad pero cerradas a las modificaciones.
• LSP -Liskov Substitution Principle-:
Objetos deben poder ser reemplazables con instancias de su SubTipo sin afectar la exactitud del programa. Cada clase que hereda de otra puede usarse como su padre sin necesidad de conocer las diferencias entre ellas.
• ISP -Interface Segregation Principle-:
Muchas interfaces específicas son mejores que una grande de propósito general. Esto por cuando necesitemos clases que implemente interfaces, lo deseable es que el propósito de los mismos sea claro, definido y acotado, lo cual no es posible con mega interfaces, si no, con pequeñas interfaces.
• DIP -Dependecy Inversion Principle-:
Se debe depender de abstracciones no de concreciones. Es el principio básico tras la inyección de dependencias en los desarrollados "modernos".
Un muy buen ejemplo del uso de los principios SOLID se encuentra en el post en inclés S.O.L.I.D: The First 5 Principles of Object Oriented Design
La idea es que la utilización de estos principios se interioricen dentro de nuestra cultura de desarrollo de software, formando parte de nuestra filosofía al enfrentar nuevas implementaciones. Muy especialmente puede ir acompañado de una estrategia de desarrollo dirigido por pruebas (TDD Test Driven Development).