SlideShare a Scribd company logo
1 of 46
S.O.L.I.D.
 ¿Cómo lo aplico en mi código?
#codepassion_pe




    @JuanjoFuchs   @RaybertParedes
http://www.lostechies.com/blogs/derickbailey/archive/2009/02/11/solid-development-principles-in-motivational-pictures.aspx
Que pasa
  cuando nos
  toca modificar
  código?


http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg
Da miedo…




http://blog.rwbenwick.com/wp-content/uploads/2009/12/Reason-For-Leaving-iStock_000008369823Medium.jpg
http://www.albertelli.com/photoarchive/Random_2003/lawn_jenga0002.jpeg
Quien nos podrá ayudar?




                                                                 Pues….
http://browse.deviantart.com/?qh=&section=&q=avengers#/d41k54l
Tampoco….
http://www.pharmatek.com/developers/developers.htm
Nosotros




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




http://4.bp.blogspot.com/-wLWxI2BZTEo/TbP44yGHHXI/AAAAAAAACMA/ck1BVzrucHo/s1600/bg_doubt.jpg
Aprendiendo un poco de…




                          Etc…
En donde???




              Y otros mas…
Bueno, manos a la ubre!!




           Perdón, a la obra…. ;)
Entonces, ¿Qué es S.O.L.I.D.?
Es un acrónimo de:
• Siempre
• Olvido
• Lo
• Interesante del
• Desarrollo
Mentira, S.O.L.I.D. es un acrónimo de:

• Single Responsibility
• Open Closed
• Liskov Substitution
• Interface Segregation
• Dependency Inversion
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.
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
Single Responsibility Principle
Single Responsibility Principle
https://github.com/JuanjoFuchs/SOLID/tree/master/SRP
       https://github.com/JuanjoFuchs/SOLID/tree/master/SRP%20-%20Refactorizado




Demo
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
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
Open Closed Principle




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




https://gist.github.com/2896236#file_ocp_empleados.refactorizado.cs
https://github.com/JuanjoFuchs/SOLID/tree/master/OCP
       https://github.com/JuanjoFuchs/SOLID/tree/master/OCP%20-%20Refactorizado




Demo
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.
Liskov Substitution Principle




https://gist.github.com/2896064             https://gist.github.com/2896078
https://github.com/JuanjoFuchs/SOLID/tree/master/LSP




Demo
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.
Interface Segregation Principle




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




                 https://gist.github.com/2896112#file_lsp_animal.refactorizado.cs
https://github.com/JuanjoFuchs/SOLID/tree/master/ISP




Demo
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)
DIP – Ejemplo 1




https://gist.github.com/2896132#file_dip_hola_mundo.sin_refactoriza   https://gist.github.com/2896132#file_dip_hola_mundo.refactorizado.
DIP – Ejemplo 2




https://gist.github.com/2896132#file_dip_volvo.sin_refactorizar.cs   https://gist.github.com/2896132#file_dip_volvo.refactorizado.cs
DIP – Arquitectura tradicional

                 UI

          Negocio




                                    Dependencia
Acceso a Datos        Componentes
DIP – Arquitectura invertida


Acceso a               Pruebas       Web
            UI
 Datos                 Unitarias   Services


           Capa de Negocio


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




Demo
Referencias
• Posters motivacionales
   http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/
• PluralSight – SOLID Principles of Object Oriented Design
   http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=principles-oo-
   design
• Principios de DOO – Bob Martin
   http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
• Pablo’s SOLID Software Development
   http://lostechies.com/wp-content/uploads/2011/03/pablos_solid_ebook.pdf
• Principios SOLID con ejemplos reales
   http://blog.gauffin.org/2012/05/solid-principles-with-real-world-examples/
¿Preguntas?
SOLID - ¿Cómo lo aplico a mi código?

More Related Content

What's hot

BúSqueda Primero En Anchura
BúSqueda Primero En AnchuraBúSqueda Primero En Anchura
BúSqueda Primero En Anchura
mapaz91
 
5. arboles binarios
5. arboles binarios5. arboles binarios
5. arboles binarios
elcapo2008
 

What's hot (20)

Principios SOLID
Principios SOLIDPrincipios SOLID
Principios SOLID
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
Pilas En C++
Pilas En C++Pilas En C++
Pilas En C++
 
Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4Arboles M-Way, 2-3 y 2-3-4
Arboles M-Way, 2-3 y 2-3-4
 
Pilas como estructura de datos..
Pilas como estructura de datos..Pilas como estructura de datos..
Pilas como estructura de datos..
 
Tipos de listas en estructura de datos
Tipos de listas en estructura de datosTipos de listas en estructura de datos
Tipos de listas en estructura de datos
 
Estructura selectiva doble con Java
Estructura selectiva doble con JavaEstructura selectiva doble con Java
Estructura selectiva doble con Java
 
22 ejercicios base de datos
22 ejercicios base de datos 22 ejercicios base de datos
22 ejercicios base de datos
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
 
Método de ordenación por inserción directa
Método de ordenación por inserción directaMétodo de ordenación por inserción directa
Método de ordenación por inserción directa
 
Listas Doblemente Enlazadas y Listas Circulares
Listas Doblemente Enlazadas y Listas CircularesListas Doblemente Enlazadas y Listas Circulares
Listas Doblemente Enlazadas y Listas Circulares
 
Estructura selectiva multiple con Java
Estructura selectiva multiple con JavaEstructura selectiva multiple con Java
Estructura selectiva multiple con Java
 
Arboles Binarios
Arboles BinariosArboles Binarios
Arboles Binarios
 
Polimorfismo ppt
Polimorfismo  pptPolimorfismo  ppt
Polimorfismo ppt
 
Programación 3: colas
Programación 3: colasProgramación 3: colas
Programación 3: colas
 
Estructura selectiva simple con Java
Estructura selectiva simple con JavaEstructura selectiva simple con Java
Estructura selectiva simple con Java
 
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
Estructura de datos - Unidad 1: Introducción a las estructuras de datosEstructura de datos - Unidad 1: Introducción a las estructuras de datos
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
 
BúSqueda Primero En Anchura
BúSqueda Primero En AnchuraBúSqueda Primero En Anchura
BúSqueda Primero En Anchura
 
ARBOLES BINARIOS
ARBOLES BINARIOSARBOLES BINARIOS
ARBOLES BINARIOS
 
5. arboles binarios
5. arboles binarios5. arboles binarios
5. arboles binarios
 

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

Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Alfredo Chavez
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Alfredo Chavez
 
Sesionmoodle 101223143117-phpapp02
Sesionmoodle 101223143117-phpapp02Sesionmoodle 101223143117-phpapp02
Sesionmoodle 101223143117-phpapp02
Kimiemi VJ
 
Directorio betabeers
Directorio betabeersDirectorio betabeers
Directorio betabeers
betabeers
 

Similar to SOLID - ¿Cómo lo aplico a mi código? (20)

Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePoint
 
Code Smells y SOLID: A qué huele tu código?
Code Smells y SOLID: A qué huele tu código?Code Smells y SOLID: A qué huele tu código?
Code Smells y SOLID: A qué huele tu código?
 
Qué puede aprender Drupal de Plone
Qué puede aprender Drupal de PloneQué puede aprender Drupal de Plone
Qué puede aprender Drupal de Plone
 
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...VLCTechFest -  Simplificando Controladores: Una introducción a Action-Domain ...
VLCTechFest - Simplificando Controladores: Una introducción a Action-Domain ...
 
Primeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigoPrimeros pasos Symfony PHPVigo
Primeros pasos Symfony PHPVigo
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring -  Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
 
El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8
 
Developing for Android (The movie)
Developing for Android (The movie)Developing for Android (The movie)
Developing for Android (The movie)
 
Introducción a symfony
Introducción a symfonyIntroducción a symfony
Introducción a symfony
 
Evolución Android: Del Framework a la supervivencia del más fuerte
Evolución Android: Del Framework a la supervivencia del más fuerteEvolución Android: Del Framework a la supervivencia del más fuerte
Evolución Android: Del Framework a la supervivencia del más fuerte
 
El testing como impulsor del cambio hacia una cultura DevOps
El testing como impulsor del cambio hacia una cultura DevOpsEl testing como impulsor del cambio hacia una cultura DevOps
El testing como impulsor del cambio hacia una cultura DevOps
 
Sesionmoodle 101223143117-phpapp02
Sesionmoodle 101223143117-phpapp02Sesionmoodle 101223143117-phpapp02
Sesionmoodle 101223143117-phpapp02
 
Sesionmoodle 101223143117-phpapp02
Sesionmoodle 101223143117-phpapp02Sesionmoodle 101223143117-phpapp02
Sesionmoodle 101223143117-phpapp02
 
Sesion moodle - "más allá de lo básico"...
Sesion moodle - "más allá de lo básico"...Sesion moodle - "más allá de lo básico"...
Sesion moodle - "más allá de lo básico"...
 
Directorio betabeers
Directorio betabeersDirectorio betabeers
Directorio betabeers
 
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
SharePoint Saturday Barcelona. La importancia de JavaScript en nuestros desar...
 
Code Igniter
Code IgniterCode Igniter
Code Igniter
 
Herramientas para desarrollar rápidamente
Herramientas para desarrollar rápidamenteHerramientas para desarrollar rápidamente
Herramientas para desarrollar rápidamente
 
Atix24
Atix24Atix24
Atix24
 

Recently uploaded

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 

Recently uploaded (11)

Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 

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