Este documento presenta los cinco principios SOLID para el desarrollo de software orientado a objetos: Single Responsibility Principle (un módulo debería tener una sola responsabilidad), Open Closed Principle (entidades de software deberían estar abiertas para extensión pero cerradas para modificación), Liskov Substitution Principle (funciones que usen clases base deben poder usar objetos de clases derivadas), Interface Segregation Principle (interfaces específicas son preferibles a interfaces generales), y Dependency Inversion Principle (módulos de alto nivel no deben depend
14. Entonces, ¿Qué es S.O.L.I.D.?
Es un acrónimo de:
• Siempre
• Olvido
• Lo
• Interesante del
• Desarrollo
15. Mentira, S.O.L.I.D. es un acrónimo de:
• Single Responsibility
• Open Closed
• Liskov Substitution
• Interface Segregation
• Dependency Inversion
16.
17. Single Responsibility Principle
Una clase jamás debería tener más
de una razón por la cual cambiar
• Responsabilidad == Razón para cambiar
• Si una clase asume más de una
responsabilidad, entonces tendrá más de una
razón para cambiar.
• Acoplamiento de responsabilidades.
18. Single Responsibility Principle
Cohesión: Acoplamiento:
Qué tan fuertemente El grado en el cual cada
relacionadas y enfocadas están módulo de un programa
las distintas responsabilidades depende de cada uno de los
de un módulo. otros módulos
23. Open Closed Principle
Entidades de software (clases, módulos,
funciones, etc.) deberían estar abiertas para
extensión pero cerradas para modificación.
• Si 1 cambio impacta a varios módulos,
entonces la aplicación no está bien diseñada.
• Debemos diseñar módulos que nunca
cambien
24. Open Closed Principle
Abiertas para extensión Cerradas para modificación
Podemos hacer que la No se necesita hacer cambios
aplicación se comporte de del código fuente de dicho
distintas formas. módulo.
Extendiendo el
comportamiento del módulo.
Pero cómo?
Abstracción
25. Open Closed Principle
https://gist.github.com/2896236#file_ocp_empleados.sin_refactorizar.cs
29. Liskov Substitution Principle
Funciones que usen punteros o referencias a
clases base deben poder usar objetos de clases
derivadas sin saberlo.
• Si tenemos una clase BASE y dos subclases
SUB1 y SUB2, el código cliente siempre debe
referirse a BASE.
• No decir: SUB1 es una BASE.
• En cambio decir: SUB1 es reemplazable por
una BASE.
33. Interface Segregation Principle
Los clientes no deberían estar forzados a
depender de interfaces que no utilizan.
• Las interfaces “gordas” o “contaminadas”
deben dividirse en varios grupos de funciones.
• Cada grupo será implementado por distintos
tipos de clientes.
38. Dependency Inversion Principle
• Módulos de alto nivel no deben depender de
módulos de bajo nivel. Ambos deben
depender de abstracciones.
• Abstracciones no deben depender de detalles.
Los detalles deben depender de
abstracciones.
• Puede implementarse con:
– Inyección de dependencias
– IoC (Inversión del control)