46
S.O.L.I.D. ¿Cómo lo aplico en mi código?

SOLID - ¿Cómo lo aplico a mi código?

Embed Size (px)

DESCRIPTION

¿Cómo aplicar los principios SOLID a mi código? Definición de los principios y ejemplos clásicos de buenas prácticas de Diseño Orientado a Objetos Audio de la presentación: http://archive.org/details/10.S.o.l.i.d.ComoLoAplicoEnMiCdigo-JuanJosFuchs

Citation preview

Page 1: SOLID - ¿Cómo lo aplico a mi código?

S.O.L.I.D.¿Cómo lo aplico en mi código?

Page 3: SOLID - ¿Cómo lo aplico a mi código?

http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx

Page 4: SOLID - ¿Cómo lo aplico a mi código?

http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg

Que pasa cuando nos toca modificar código?

Page 5: SOLID - ¿Cómo lo aplico a mi código?

http://blog.rwbenwick.com/wp-content/uploads/2009/12/Reason-For-Leaving-iStock_000008369823Medium.jpg

Da miedo…

Page 6: SOLID - ¿Cómo lo aplico a mi código?

Porque probablemente esta sea nuestra única pieza por sacar

http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg

Page 7: SOLID - ¿Cómo lo aplico a mi código?

http://browse.deviantart.com/?qh=&section=&q=avengers#/d41k54l

Quien nos podrá ayudar?

Pues….

Page 8: SOLID - ¿Cómo lo aplico a mi código?

Tampoco….http://www.pharmatek.com/developers/developers.htm

Page 9: SOLID - ¿Cómo lo aplico a mi código?

http://www.catosplace.net/blogs/personal/wp-content/uploads/2011/04/developers.jpg

Nosotros

Page 10: SOLID - ¿Cómo lo aplico a mi código?

Pero como??

http://4.bp.blogspot.com/-wLWxI2BZTEo/TbP44yGHHXI/AAAAAAAACMA/ck1BVzrucHo/s1600/bg_doubt.jpg

Page 11: SOLID - ¿Cómo lo aplico a mi código?

Etc…

Aprendiendo un poco de…

Page 12: SOLID - ¿Cómo lo aplico a mi código?

En donde???

Y otros mas…

Page 13: SOLID - ¿Cómo lo aplico a mi código?

Bueno, manos a la ubre!!

Perdón, a la obra…. ;)

Page 14: SOLID - ¿Cómo lo aplico a mi código?

Entonces, ¿Qué es S.O.L.I.D.?

Es un acrónimo de:• Siempre • Olvido• Lo • Interesante del• Desarrollo

Page 15: SOLID - ¿Cómo lo aplico a mi código?

Mentira, S.O.L.I.D. es un acrónimo de:

• Single Responsibility •Open Closed• Liskov Substitution• Interface Segregation•Dependency Inversion

Page 16: SOLID - ¿Cómo lo aplico a mi código?
Page 17: SOLID - ¿Cómo lo aplico a mi código?

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.

Page 18: SOLID - ¿Cómo lo aplico a mi código?

Single Responsibility Principle

Cohesión:

Qué tan fuertemente relacionadas y enfocadas están las distintas responsabilidades

de un módulo.

Acoplamiento:

El grado en el cual cada módulo de un programa

depende de cada uno de los otros módulos

Page 19: SOLID - ¿Cómo lo aplico a mi código?

Single Responsibility Principle

Page 20: SOLID - ¿Cómo lo aplico a mi código?

Single Responsibility Principle

Page 21: SOLID - ¿Cómo lo aplico a mi código?

Demo

https://github.com/JuanjoFuchs/SOLID/tree/master/SRP

https://github.com/JuanjoFuchs/SOLID/tree/master/SRP%20-%20Refactorizado

Page 22: SOLID - ¿Cómo lo aplico a mi código?
Page 23: SOLID - ¿Cómo lo aplico a mi código?

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

Page 24: SOLID - ¿Cómo lo aplico a mi código?

Open Closed Principle

Abiertas para extensión

Podemos hacer que la aplicación se comporte de

distintas formas.

Extendiendo el comportamiento del módulo.

Cerradas para modificación

No se necesita hacer cambios del código fuente de dicho

módulo.

AbstracciónPero cómo?

Page 25: SOLID - ¿Cómo lo aplico a mi código?

Open Closed Principle

https://gist.github.com/2896236#file_ocp_empleados.sin_refactorizar.cs

Page 26: SOLID - ¿Cómo lo aplico a mi código?

Open Closed Principle

https://gist.github.com/2896236#file_ocp_empleados.refactorizado.cs

Page 27: SOLID - ¿Cómo lo aplico a mi código?

Demo

https://github.com/JuanjoFuchs/SOLID/tree/master/OCP

https://github.com/JuanjoFuchs/SOLID/tree/master/OCP%20-%20Refactorizado

Page 28: SOLID - ¿Cómo lo aplico a mi código?
Page 29: SOLID - ¿Cómo lo aplico a mi código?

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.

Page 30: SOLID - ¿Cómo lo aplico a mi código?

Liskov Substitution Principle

https://gist.github.com/2896064 https://gist.github.com/2896078

Page 31: SOLID - ¿Cómo lo aplico a mi código?

Demo

https://github.com/JuanjoFuchs/SOLID/tree/master/LSP

Page 32: SOLID - ¿Cómo lo aplico a mi código?
Page 33: SOLID - ¿Cómo lo aplico a mi código?

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.

Page 34: SOLID - ¿Cómo lo aplico a mi código?

Interface Segregation Principle

https://gist.github.com/2896112#file_lsp_animal.sin_refactorizar.cs

Page 35: SOLID - ¿Cómo lo aplico a mi código?

Interface Segregation Principle

https://gist.github.com/2896112#file_lsp_animal.refactorizado.cs

Page 36: SOLID - ¿Cómo lo aplico a mi código?

Demo

https://github.com/JuanjoFuchs/SOLID/tree/master/ISP

Page 37: SOLID - ¿Cómo lo aplico a mi código?
Page 38: SOLID - ¿Cómo lo aplico a mi código?

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)

Page 39: SOLID - ¿Cómo lo aplico a mi código?

DIP – Ejemplo 1

https://gist.github.com/2896132#file_dip_hola_mundo.sin_refactorizar.cs

https://gist.github.com/2896132#file_dip_hola_mundo.refactorizado.cs

Page 40: SOLID - ¿Cómo lo aplico a mi código?

DIP – Ejemplo 2

https://gist.github.com/2896132#file_dip_volvo.sin_refactorizar.cs https://gist.github.com/2896132#file_dip_volvo.refactorizado.cs

Page 41: SOLID - ¿Cómo lo aplico a mi código?

DIP – Arquitectura tradicional

UI

Negocio

Acceso a Datos Componentes Dep

ende

ncia

Page 42: SOLID - ¿Cómo lo aplico a mi código?

DIP – Arquitectura invertida

Acceso a Datos UI Pruebas

UnitariasWeb

Services

Capa de Negocio

Entidades

Page 43: SOLID - ¿Cómo lo aplico a mi código?

Demo

https://github.com/JuanjoFuchs/SOLID/tree/master/DIP_Multicapa_Refactorizado

https://github.com/JuanjoFuchs/SOLID/tree/master/DIP_Multicapa

Page 44: SOLID - ¿Cómo lo aplico a mi código?

Referencias• Posters motivacionales

http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/

• PluralSight – SOLID Principles of Object Oriented Designhttp://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=principles-oo-design

• Principios de DOO – Bob Martinhttp://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

• Pablo’s SOLID Software Developmenthttp://lostechies.com/wp-content/uploads/2011/03/pablos_solid_ebook.pdf

• Principios SOLID con ejemplos realeshttp://blog.gauffin.org/2012/05/solid-principles-with-real-world-examples/

Page 45: SOLID - ¿Cómo lo aplico a mi código?

¿Preguntas?

Page 46: SOLID - ¿Cómo lo aplico a mi código?