Patrones utiles para solid

Jose Miguel Torres
Jose Miguel TorresSoftware Engineer um MRW
Patrones útiles para los principios
 SOLID
Dept. Tecnologias Corporativas



                                             noviembre de 2011




                                 José Miguel Torres
                                 Area I+D+i
Agenda

• Básicos
   • Fundamentos
   • Principios
   • Patrones
• Aspectos
   • Acoplamiento
   • Cohesión
   • Encapsulamiento
• Principios SOLID
   • SRP
   • OCP
   • LSP
   • DIP
   • ISP
• Reflexión
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Patrones utiles para solid
Acoplamiento

Cohesión

  Encapsulamiento
Principios SOLID


SRP - Single Responsibility Principle

OCP - Open Closed Principle

LSP - Liskov Substitution Principle

DIP - Dependency Inversion Principle

ISP - Interface Segregation Principle
Patrones utiles para solid
Principio de Responsabilidad Única
public class Factura
{
    public string _codigo;
    public DateTime _fechaEmision;
    public decimal _importeFactura;
    public decimal _importeIVA;
    public decimal _importeDeducir;
    public decimal _importeTotal;
    public ushort _porcentageDeduccion;
    //método que calcula el Total de la factura
    public void CalcularTotal()
    {
        //Calculamos la deducción
        _importeDeducir = (_importeFactura*_porcenDeduccion)
                                                       /100;
        //Calculamos el IVA
        _importeIVA = _importeFactura * 0.16m;
        //calculamos el total
        _importeTotal = (_importeFactura - _importeDeducir)
                                                + _importeIVA;
    }
}
Principio de Responsabilidad Única



Una clase debe tener una y sólo una
única causa por la cual puede ser
modificada
Robert C. Martin
Principio de Responsabilidad Única
//clase IVA que calcula el iva en base a un importe
   public class IVA {

      public readonly decimal _iva = 0.16m;

      public decimal CalcularIVA(decimal importe)
      {
        return importe*_iva;
      }
  }

  //clase deduccion que calcula la deducción en base a un importe
  public class Deduccion {
     public readonly decimal _deduccion;

      public Deduccion(ushort porcentage)
      {
        _deduccion = porcentage;
      }

      public decimal CalcularDeduccion(decimal importe)
      {
        return (importe*_deduccion)/100;
      }
  }
Principio de Responsabilidad Única
 public class Factura
 {
   public string _codigo;
   public DateTime _fechaEmision;

     public   decimal _importeFactura;
     public   decimal _importeIVA;
     public   decimal _importeDeducir;
     public   decimal _importeTotal;
     public   ushort _porcentageDeduccion;

     public void CalcularTotal()
     {
       //calculamos el IVA
       IVA iva = new IVA();
       _importeIVA = iva.CalcularIVA(_importeFactura);

         //calculamos la deducción a aplicar
         Deduccion deduccion = new Deduccion(_porcentageDeduccion);
         _importeDeducir = deduccion.CalcularDeduccion(_importeFactura);

         //calculamos el total
         _importeTotal = (_importeFactura - _importeDeducir) + _importeIVA;
     }
 }
Principio de Responsabilidad Única



        interface Modem
        {
          void dial(int pNumber);
          void hangup();
          void send(char[] data);
          char[] receive();
        }
Patrón Software
Patrón Software
Patrones utiles para solid
Principio Open/Closed
public void Finalizar()
{
    switch (_estadoTarea)
    {
        case TareasEstadosEnum.Pendiente:
            //finalizamos
            break;
        case TareasEstadosEnum.Finalizada:
            throw new
                   ApplicationException
                         ("Ya esta finalizada");
        case TareasEstadosEnum.Cancelada:
            throw new
                   ApplicationException
                   ("Imposible finalizar. Tarea cancelada");
        default:
            throw new ArgumentOutOfRangeException();
    }
}
Principio Open/Closed



public void Finalizar()
{
    switch (_estadoTarea)
    {
        case TareasEstadosEnum.Pendiente:
            //finalizamos
            break;
        case TareasEstadosEnum.Finalizada:
            throw new ApplicationException("Ya esta finalizada");
        case TareasEstadosEnum.Cancelada:
            throw new ApplicationException("Imposible finalizar. Tarea cancelada");
        case TareasEstadosEnum.Pospuesta:
            throw new ApplicationException("Imposible finalizar. Tarea no completada");
        default:
            throw new ArgumentOutOfRangeException();
    }
Principio Software
Principio Software
Principio Open/Closed




      Una clase debe estar abierta a
        extensiones pero cerrada
          a las modificaciones.
      Dr. Bertrand Meyer
Fundamentos OO
     Encapsulamiento
class EstadosTareas
{
    public virtual void Finalizar(EstadoTareasEnum estadoTareasEnum)
    {
        switch (estadoTareasEnum) {
            case EstadoTareasEnum.Pendiente:
                //finalizamos
            case EstadoTareasEnum.Pospuesta:
                throw new ApplicationException("Imposible finalizar. Tarea no completada");
                ....
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
    public virtual void Cancelar(EstadoTareasEnum estadoTareasEnum)
    {
        switch (estadoTareasEnum){
                ....
                //cancelamos
        }
    }
    public virtual void Posponer(EstadoTareasEnum estadoTareasEnum)
    {
        switch (estadoTareasEnum){
                ....
                //posponemos
        }
    }
}
Fundamentos OO
   Polimorfismo

 abstract class EstadosTareasBase {
     protected Tareas _tarea;
     public abstract void Finalizar();
     public abstract void Cancelar();
     public abstract void Posponer();
 }
 class EstadoTareaPendiente : EstadosTareasBase {
     public override void Finalizar()
     {
         //finalizamos
     }
     public override void Cancelar()
     {
         //cancelamos
     }
     public override void Posponer()
     {
         //posponemos
     }
 }
Fundamentos OO
   Polimorfismo

   class Tareas
   {
       private EstadosTareasBase _estadosTareas;
       public Tareas()
       {
           _estadosTareas = new EstadoTareaPendiente();
       }
       public void Finalizar()
       {
           _estadosTareas.Finalizar();
       }
       public void Cancelar()
       {
           _estadosTareas.Cancelar();
       }
       public void Posponer()
       {
           _estadosTareas.Posponer();
       }
   }
Patrón Software
Patrón Software
Patrones utiles para solid
Principio de Substitución de Liskov
  class Ciclomotor: Vehiculo
  {
      public string ObtenerNumLicencia()
      {
          //devuelve num licencia
      }
  }

  class Coche: Vehiculo
  {
      public string ObtenerMatricula()
      {
          //devuelve matricula
      }
  }

  class Impuestos
  {
      public void CalcularImpuesto(Vehiculo vehiculo)
      {
          string matricula = ((Coche) vehiculo).ObtenerMatricula();
          ServicioCalculoImpuestos(matricula, vehiculo.Cilindrada);
      }
  }
Principio de Substitución de Liskov

       Si por cada objeto o1 del tipo S
         existe un objeto o2 del tipo T
     tal que para todos los programas P
          definidos en términos de T
          y el comportamiento de P
             permanece invariable
       cuando o1 es sustituido por o2,
         entonces S es un subtipo de T.
        Barbara Liskov
Principio de Substitución de Liskov



public void CalcularImpuesto(Vehiculo vehiculo)
{
    string matricula = string.Empty;
    if (vehiculo.GetType().Name == "Coche")
        matricula = ((Coche) vehiculo).ObtenerMatricula();
    else if (vehiculo.GetType().Name == "Ciclomotor")
        matricula = ((Ciclomotor)vehiculo).ObtenerNumLicencia();
    ServicioCalculoImpuestos(matricula, vehiculo.Cilindrada);
}
Principio de Substitución de Liskov
   public class Cuadrado : Rectangulo
   {
       public override int Ancho
       {
           get
           {
               return base.Ancho;
           }
           set
           {
               base.Ancho = value;
               base.Alto = value;
           }
       }
       public override int Alto
       {
           get
           {
               return base.Alto;
           }
           set
           {
               base.Ancho = value;
               base.Alto = value;
           }
       }
   }
   public class Rectangulo
   {
       public virtual int Ancho { get; set; }
       public virtual int Alto { get; set; }
   }
Principio de Substitución de Liskov
[Test]
public void AreaRectangulo()
{
    Rectangulo r =
          new Cuadrado
               {
                    Ancho = 5,
                    Alto = 2
               };

    // Fallará pues cuadrado establece
    // a 2 el ancho y el alto
    Assert.IsEqual(r.Ancho*r.Alto, 10); // false
}
Patrón Software
Diseño por Contratos


[Test]
public void AreaRectangulo()
{
    Rectangulo r = new Cuadrado {Ancho = 5, Alto = 2};
    // Fallará pues cuadrado establece
    // a 2 el ancho y el alto
    Assert.IsEqual(r.Ancho*r.Alto, 10); // false
}
Patrones utiles para solid
Principio Inyección Dependencias
Principio Inyección Dependencias



public class EstacioMeteorologica
{
    public void MostrarDatos()
    {
        Barometro barometro = new Barometro();
        Termometro termometro = new Termometro();
        int presion = barometro.Valor;
        int temperatura = termometro.Valor;
        Console.WriteLine(
            string.Format("Datos a {0} nTemperatura: {1}nPresión:{2}",
                           DateTime.Now, temperatura, presion));
    }
}
Principio Inyección Dependencias



•Las clases de alto nivel no deberían depender sobre
las clases de bajo nivel. Ambas deberían
depender de las abstracciones.
•Las abstracciones deberían no depender
de los detalles. Los detalles deberían depender
de las abstracciones.
Robert C. Martin
Principio Inyección Dependencias
Principio Inyección Dependencias

public class EstacioMeteorologica
{
    private IMeteoReferencia __dispo;

    public EstacioMeteorologica(
        IMeteoReferencia dispositivo)
    {
        _ __dispo = dispositivo;
}
    public void MostrarDatos()
    {
        Console.WriteLine(
            string.Format("Fecha/Hora {0}", DateTime.Now));
        Console.WriteLine(_ __dispo());
    }
}
Inversión Del Control (IoC)
Patrón Software
Patrones utiles para solid
Principio Segregación Interfaces
Principio Segregación Interfaces
  class Modelo2002 : ImpresoraMultifuncional {
      public override void Imprimir()
      {
          Impresion.EnviarImpresion();
      }
      public override void Escanear()
      {
          Escaner.DigitalizarAFormatoPng();
      }
      public override void Cancelar()
      {
          Impresion.CancelarImpresion();
      }
      public override void EnviarFax()
      {
          throw new System.NotImplementedException();
      }
      public void EnviarEMail() {
          //enviamos por correo electrónico
      }
  }
Principio Segregación Interfaces




   Los clientes no deben ser forzosamente
dependientes de las interfaces que no utilizan.
 Robert C. Martin
Principio Segregación Interfaces
public interface IImprimible
{
       void Imprimir();
}
public interface IFotocopiable
{
       void Fotocopiar();
}
public interface IEscaneable
{
       void Escanear();
}
public interface IFaxCompatible
{
       void EnviarFax();
       void RecibirFax();
}
public interface ITcpIpCompatible
{
       void EnviarEMail();
}
class Modelo1998 : IImprimible, IEscaneable, IFaxCompatible
{... }
class Modelo2000 : IImprimible, IEscaneable, IFaxCompatible, IFotocopiable
{...}
class Modelo2002 : IImprimible, IEscaneable, IFotocopiable, ITcpIpCompatible
{...}
Patrones utiles para solid
Patrón Software
Principios OO

• Encapsular    aquellas   partes   susceptibles   de
  variaciones
• Más composición, menos herencia
• Programa interfaces, no implementaciones
• Aboga por el bajo acoplamiento
• Ábrete a extensiones, ciérrate a modificaciones.
• Depende de abstracciones, no de clases concretas
• Sólo habla a “tus amigos”.
• “No nos llames; nosotros lo haremos”
• Una clase debe tener una única razón de cambio.
• Analiza el tamaño de los métodos. Los if/switch nos
  hablan.
Blog: http://josemigueltorres.net
Twitter: @alegrebandolero
Email: josemiguel.torres@mrw.es
1 von 58

Recomendados

ESTRUCTURAS DE CONTROL: BUCLES EN C++ von
ESTRUCTURAS DE CONTROL: BUCLES EN C++ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++die_dex
3.1K views65 Folien
ESTRUCTURAS DE CONTROL: BUCLES EN C++ von
ESTRUCTURAS DE CONTROL: BUCLES EN C++ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++die_dex
9.3K views30 Folien
Taller Matrices En Java von
Taller Matrices En JavaTaller Matrices En Java
Taller Matrices En JavaŘỉgö VẻGầ
2.6K views14 Folien
Curva de daño de un transformador c++ von
Curva de daño de un transformador c++Curva de daño de un transformador c++
Curva de daño de un transformador c++Marco Jiménez
1.2K views64 Folien
JavaScript no es Vietnam von
JavaScript no es VietnamJavaScript no es Vietnam
JavaScript no es VietnamAlex Casquete
878 views23 Folien
4. Programación con arrays, funciones, y objetos definidos por el usuario von
4. Programación con arrays, funciones, y objetos definidos por el usuario4. Programación con arrays, funciones, y objetos definidos por el usuario
4. Programación con arrays, funciones, y objetos definidos por el usuarioLaura Folgado Galache
14K views31 Folien

Más contenido relacionado

Was ist angesagt?

Estructura de datos von
Estructura de datosEstructura de datos
Estructura de datosRiki Tapia
700 views15 Folien
P1 von
P1P1
P1cristian270791
177 views43 Folien
Sesion07- Estructuras de control (Oracle) von
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)José Toro
3.4K views7 Folien
Pseudocodigo-funciones y operaciones von
Pseudocodigo-funciones y operacionesPseudocodigo-funciones y operaciones
Pseudocodigo-funciones y operacionesDavid Bastidas
5.6K views5 Folien
Practicas de programacion 11 20 von
Practicas de programacion 11 20Practicas de programacion 11 20
Practicas de programacion 11 20Dariio Lopezz Young
509 views17 Folien
Package operaciones von
Package operacionesPackage operaciones
Package operacionesVviiry VelazzQuezz
225 views4 Folien

Was ist angesagt?(19)

Estructura de datos von Riki Tapia
Estructura de datosEstructura de datos
Estructura de datos
Riki Tapia700 views
Sesion07- Estructuras de control (Oracle) von José Toro
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)
José Toro3.4K views
Pseudocodigo-funciones y operaciones von David Bastidas
Pseudocodigo-funciones y operacionesPseudocodigo-funciones y operaciones
Pseudocodigo-funciones y operaciones
David Bastidas5.6K views
Guia para examen java von tecno5
Guia para examen javaGuia para examen java
Guia para examen java
tecno5390 views
JavaScript funciones von jcremiro
JavaScript funcionesJavaScript funciones
JavaScript funciones
jcremiro4.2K views
ESTATUTO WHILE von charnisch
ESTATUTO WHILEESTATUTO WHILE
ESTATUTO WHILE
charnisch2.5K views
Programacion de la profe lina von Julian David
Programacion de la profe linaProgramacion de la profe lina
Programacion de la profe lina
Julian David4.6K views
Sobrecarga de operadores von r0na91
Sobrecarga de operadoresSobrecarga de operadores
Sobrecarga de operadores
r0na912.7K views
Ejemplo de solución de práctica funciones stl von UVM
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stl
UVM574 views
BIBLIOTECAS EN PROGRAMACION von UTPL
BIBLIOTECAS EN PROGRAMACIONBIBLIOTECAS EN PROGRAMACION
BIBLIOTECAS EN PROGRAMACION
UTPL622 views
Estructura de instrucciones de control von Susana Moyolema
Estructura de instrucciones de controlEstructura de instrucciones de control
Estructura de instrucciones de control
Susana Moyolema257 views

Destacado

Videomarketing von
VideomarketingVideomarketing
VideomarketingSímbolo Ingenio Creativo
451 views19 Folien
Bittorrent von
BittorrentBittorrent
Bittorrentvinkola
319 views8 Folien
Vdgp voorraad in de vingers von
Vdgp voorraad in de vingersVdgp voorraad in de vingers
Vdgp voorraad in de vingersTony Hardenberg
604 views16 Folien
Borja´s presentation von
Borja´s presentationBorja´s presentation
Borja´s presentationBorjaspdp
201 views11 Folien
Презентация по Анри Матиссу von
Презентация по Анри МатиссуПрезентация по Анри Матиссу
Презентация по Анри МатиссуNastya Khlaponina
2.3K views52 Folien
บะหมี่เสริมใยอาหาร von
บะหมี่เสริมใยอาหารบะหมี่เสริมใยอาหาร
บะหมี่เสริมใยอาหารsc809
377 views13 Folien

Destacado(20)

Bittorrent von vinkola
BittorrentBittorrent
Bittorrent
vinkola319 views
Borja´s presentation von Borjaspdp
Borja´s presentationBorja´s presentation
Borja´s presentation
Borjaspdp201 views
Презентация по Анри Матиссу von Nastya Khlaponina
Презентация по Анри МатиссуПрезентация по Анри Матиссу
Презентация по Анри Матиссу
Nastya Khlaponina2.3K views
บะหมี่เสริมใยอาหาร von sc809
บะหมี่เสริมใยอาหารบะหมี่เสริมใยอาหาร
บะหมี่เสริมใยอาหาร
sc809377 views
It is all about me von 1YQBeu
It is all about meIt is all about me
It is all about me
1YQBeu674 views
Eco-code - RECYCLING- Aradippou von panikkx
Eco-code - RECYCLING- AradippouEco-code - RECYCLING- Aradippou
Eco-code - RECYCLING- Aradippou
panikkx371 views
How to create a linked in company profile von Bill Layton
How to create a linked in company profileHow to create a linked in company profile
How to create a linked in company profile
Bill Layton628 views
Modulo per disdetta sky 2 von Disdetta
Modulo per disdetta sky 2Modulo per disdetta sky 2
Modulo per disdetta sky 2
Disdetta2.5K views
Mahala Mobile Presentation 2011 von MahalaMobile
Mahala Mobile Presentation 2011Mahala Mobile Presentation 2011
Mahala Mobile Presentation 2011
MahalaMobile438 views
Proficiency 2 astronomy science von brotjes15
Proficiency 2 astronomy scienceProficiency 2 astronomy science
Proficiency 2 astronomy science
brotjes15428 views
E learning-basic guidelines to develop multimedia learning von Dimas Prasetyo
E learning-basic guidelines to develop multimedia learningE learning-basic guidelines to develop multimedia learning
E learning-basic guidelines to develop multimedia learning
Dimas Prasetyo791 views
Artical. list. report von sadia213
Artical. list. reportArtical. list. report
Artical. list. report
sadia213783 views
(CEFAM) FIN 230 - Portfolio Presentation von AlexisCuny2010
(CEFAM) FIN 230 - Portfolio Presentation(CEFAM) FIN 230 - Portfolio Presentation
(CEFAM) FIN 230 - Portfolio Presentation
AlexisCuny2010576 views
บะหมี่เสริมเส้นใยอาหารจากแป้งข้าวกล้อง von sc809
บะหมี่เสริมเส้นใยอาหารจากแป้งข้าวกล้องบะหมี่เสริมเส้นใยอาหารจากแป้งข้าวกล้อง
บะหมี่เสริมเส้นใยอาหารจากแป้งข้าวกล้อง
sc809594 views
Lecture 16 inflation von Gale Pooley
Lecture 16 inflationLecture 16 inflation
Lecture 16 inflation
Gale Pooley376 views
Dynamic Logic AdReaction 2009 - What Marketers Should Know About Who’s Gettin... von Kantar
Dynamic Logic AdReaction 2009 - What Marketers Should Know About Who’s Gettin...Dynamic Logic AdReaction 2009 - What Marketers Should Know About Who’s Gettin...
Dynamic Logic AdReaction 2009 - What Marketers Should Know About Who’s Gettin...
Kantar2.2K views

Similar a Patrones utiles para solid

P R A C T I C A2 von
P R A C T I C A2P R A C T I C A2
P R A C T I C A2climancc
644 views8 Folien
Java básico von
Java  básicoJava  básico
Java básicoMaría Luisa Velasco
466 views30 Folien
Java::Acceso a Bases de Datos von
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datosjubacalo
2.8K views14 Folien
Programa Java que gestiona los productos que comercializan varios viveros von
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosjubacalo
4.4K views9 Folien
Descripcion de algoritmo von
Descripcion de algoritmoDescripcion de algoritmo
Descripcion de algoritmoluisfe
900 views8 Folien
Introducción a TDD y PHPUnit von
Introducción a TDD y PHPUnitIntroducción a TDD y PHPUnit
Introducción a TDD y PHPUnitDaniel González Cerviño
1.2K views30 Folien

Similar a Patrones utiles para solid(20)

P R A C T I C A2 von climancc
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
climancc644 views
Java::Acceso a Bases de Datos von jubacalo
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datos
jubacalo2.8K views
Programa Java que gestiona los productos que comercializan varios viveros von jubacalo
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viveros
jubacalo4.4K views
Descripcion de algoritmo von luisfe
Descripcion de algoritmoDescripcion de algoritmo
Descripcion de algoritmo
luisfe900 views
Workshop iOS 4: Closures, generics & operators von Visual Engineering
Workshop iOS 4: Closures, generics & operatorsWorkshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operators
Visual Engineering507 views
Clase 11 De Septiembre 2009 von mtemarialuisa
Clase 11 De Septiembre 2009Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009
mtemarialuisa279 views

Último

DELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptx von
DELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptxDELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptx
DELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptxdavidsalazar63484
5 views6 Folien
SESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdf von
SESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdfSESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdf
SESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdfMELVINCALLO1
5 views39 Folien
proyecto lavadora.docx von
proyecto lavadora.docxproyecto lavadora.docx
proyecto lavadora.docxpaulavallejo21
11 views2 Folien
MVelazco_Internet, Origenes y Evolucion.pptx von
MVelazco_Internet, Origenes  y Evolucion.pptxMVelazco_Internet, Origenes  y Evolucion.pptx
MVelazco_Internet, Origenes y Evolucion.pptxal223915
6 views39 Folien
Fundamentos de electricidad y electrónica.docx von
Fundamentos de electricidad y electrónica.docxFundamentos de electricidad y electrónica.docx
Fundamentos de electricidad y electrónica.docxDilanTabares
5 views9 Folien
SOrtiz_Origenes y evolución de internet.ppsx von
SOrtiz_Origenes y evolución de internet.ppsxSOrtiz_Origenes y evolución de internet.ppsx
SOrtiz_Origenes y evolución de internet.ppsxARIADNAYJIMENACRUZOR
6 views9 Folien

Último(20)

DELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptx von davidsalazar63484
DELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptxDELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptx
DELITOS INFORMATICOS EFRAIN CAMACHO 27462611 INFORMATICA III.pptx
SESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdf von MELVINCALLO1
SESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdfSESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdf
SESION-4-Confiabilidad y Validez de Instrumentos de investigacion.pdf
MELVINCALLO15 views
MVelazco_Internet, Origenes y Evolucion.pptx von al223915
MVelazco_Internet, Origenes  y Evolucion.pptxMVelazco_Internet, Origenes  y Evolucion.pptx
MVelazco_Internet, Origenes y Evolucion.pptx
al2239156 views
Fundamentos de electricidad y electrónica.docx von DilanTabares
Fundamentos de electricidad y electrónica.docxFundamentos de electricidad y electrónica.docx
Fundamentos de electricidad y electrónica.docx
DilanTabares5 views
Tecnologías para la enseñanza virtual von mpachecocodem
Tecnologías para la enseñanza virtual Tecnologías para la enseñanza virtual
Tecnologías para la enseñanza virtual
mpachecocodem9 views
Cuadros comparativos Herramientas tecnologicas III.pdf von DarlingGalan1
Cuadros comparativos Herramientas tecnologicas III.pdfCuadros comparativos Herramientas tecnologicas III.pdf
Cuadros comparativos Herramientas tecnologicas III.pdf
DarlingGalan17 views
actividadanlisisdeartefactos1-230424222159-fef7d8f3 (1).docx von MaraJos722801
actividadanlisisdeartefactos1-230424222159-fef7d8f3 (1).docxactividadanlisisdeartefactos1-230424222159-fef7d8f3 (1).docx
actividadanlisisdeartefactos1-230424222159-fef7d8f3 (1).docx
MaraJos7228015 views
Fundamentos de Electricidad y Electronica 9-3 (1).docx von Samuel709479
Fundamentos de Electricidad y Electronica 9-3 (1).docxFundamentos de Electricidad y Electronica 9-3 (1).docx
Fundamentos de Electricidad y Electronica 9-3 (1).docx
Samuel7094797 views
TALLER DE ANÁLISIS DE ARTEFACTOS_.docx von DilanTabares
TALLER DE ANÁLISIS DE ARTEFACTOS_.docxTALLER DE ANÁLISIS DE ARTEFACTOS_.docx
TALLER DE ANÁLISIS DE ARTEFACTOS_.docx
DilanTabares6 views
Fundamentos de Electricidad y Electronica 9-3 (1).docx von Samuel709479
Fundamentos de Electricidad y Electronica 9-3 (1).docxFundamentos de Electricidad y Electronica 9-3 (1).docx
Fundamentos de Electricidad y Electronica 9-3 (1).docx
Samuel7094795 views
Carmona Garcia de León _Mateo _ASX1.pptx von 231458783
Carmona Garcia de León _Mateo _ASX1.pptxCarmona Garcia de León _Mateo _ASX1.pptx
Carmona Garcia de León _Mateo _ASX1.pptx
2314587835 views
Examen Configuracion III.pptx von gatb1825
Examen Configuracion III.pptxExamen Configuracion III.pptx
Examen Configuracion III.pptx
gatb18257 views
cuadros comparativos intranet/ EXTRANET, datos/información, navegador/ buscador von lopezyetsiree
cuadros comparativos intranet/ EXTRANET, datos/información, navegador/ buscadorcuadros comparativos intranet/ EXTRANET, datos/información, navegador/ buscador
cuadros comparativos intranet/ EXTRANET, datos/información, navegador/ buscador
lopezyetsiree12 views

Patrones utiles para solid

  • 1. Patrones útiles para los principios SOLID Dept. Tecnologias Corporativas noviembre de 2011 José Miguel Torres Area I+D+i
  • 2. Agenda • Básicos • Fundamentos • Principios • Patrones • Aspectos • Acoplamiento • Cohesión • Encapsulamiento • Principios SOLID • SRP • OCP • LSP • DIP • ISP • Reflexión
  • 14. Principios SOLID SRP - Single Responsibility Principle OCP - Open Closed Principle LSP - Liskov Substitution Principle DIP - Dependency Inversion Principle ISP - Interface Segregation Principle
  • 16. Principio de Responsabilidad Única public class Factura { public string _codigo; public DateTime _fechaEmision; public decimal _importeFactura; public decimal _importeIVA; public decimal _importeDeducir; public decimal _importeTotal; public ushort _porcentageDeduccion; //método que calcula el Total de la factura public void CalcularTotal() { //Calculamos la deducción _importeDeducir = (_importeFactura*_porcenDeduccion) /100; //Calculamos el IVA _importeIVA = _importeFactura * 0.16m; //calculamos el total _importeTotal = (_importeFactura - _importeDeducir) + _importeIVA; } }
  • 17. Principio de Responsabilidad Única Una clase debe tener una y sólo una única causa por la cual puede ser modificada Robert C. Martin
  • 18. Principio de Responsabilidad Única //clase IVA que calcula el iva en base a un importe public class IVA { public readonly decimal _iva = 0.16m; public decimal CalcularIVA(decimal importe) { return importe*_iva; } } //clase deduccion que calcula la deducción en base a un importe public class Deduccion { public readonly decimal _deduccion; public Deduccion(ushort porcentage) { _deduccion = porcentage; } public decimal CalcularDeduccion(decimal importe) { return (importe*_deduccion)/100; } }
  • 19. Principio de Responsabilidad Única public class Factura { public string _codigo; public DateTime _fechaEmision; public decimal _importeFactura; public decimal _importeIVA; public decimal _importeDeducir; public decimal _importeTotal; public ushort _porcentageDeduccion; public void CalcularTotal() { //calculamos el IVA IVA iva = new IVA(); _importeIVA = iva.CalcularIVA(_importeFactura); //calculamos la deducción a aplicar Deduccion deduccion = new Deduccion(_porcentageDeduccion); _importeDeducir = deduccion.CalcularDeduccion(_importeFactura); //calculamos el total _importeTotal = (_importeFactura - _importeDeducir) + _importeIVA; } }
  • 20. Principio de Responsabilidad Única interface Modem { void dial(int pNumber); void hangup(); void send(char[] data); char[] receive(); }
  • 24. Principio Open/Closed public void Finalizar() { switch (_estadoTarea) { case TareasEstadosEnum.Pendiente: //finalizamos break; case TareasEstadosEnum.Finalizada: throw new ApplicationException ("Ya esta finalizada"); case TareasEstadosEnum.Cancelada: throw new ApplicationException ("Imposible finalizar. Tarea cancelada"); default: throw new ArgumentOutOfRangeException(); } }
  • 25. Principio Open/Closed public void Finalizar() { switch (_estadoTarea) { case TareasEstadosEnum.Pendiente: //finalizamos break; case TareasEstadosEnum.Finalizada: throw new ApplicationException("Ya esta finalizada"); case TareasEstadosEnum.Cancelada: throw new ApplicationException("Imposible finalizar. Tarea cancelada"); case TareasEstadosEnum.Pospuesta: throw new ApplicationException("Imposible finalizar. Tarea no completada"); default: throw new ArgumentOutOfRangeException(); }
  • 28. Principio Open/Closed Una clase debe estar abierta a extensiones pero cerrada a las modificaciones. Dr. Bertrand Meyer
  • 29. Fundamentos OO Encapsulamiento class EstadosTareas { public virtual void Finalizar(EstadoTareasEnum estadoTareasEnum) { switch (estadoTareasEnum) { case EstadoTareasEnum.Pendiente: //finalizamos case EstadoTareasEnum.Pospuesta: throw new ApplicationException("Imposible finalizar. Tarea no completada"); .... default: throw new ArgumentOutOfRangeException(); } } public virtual void Cancelar(EstadoTareasEnum estadoTareasEnum) { switch (estadoTareasEnum){ .... //cancelamos } } public virtual void Posponer(EstadoTareasEnum estadoTareasEnum) { switch (estadoTareasEnum){ .... //posponemos } } }
  • 30. Fundamentos OO Polimorfismo abstract class EstadosTareasBase { protected Tareas _tarea; public abstract void Finalizar(); public abstract void Cancelar(); public abstract void Posponer(); } class EstadoTareaPendiente : EstadosTareasBase { public override void Finalizar() { //finalizamos } public override void Cancelar() { //cancelamos } public override void Posponer() { //posponemos } }
  • 31. Fundamentos OO Polimorfismo class Tareas { private EstadosTareasBase _estadosTareas; public Tareas() { _estadosTareas = new EstadoTareaPendiente(); } public void Finalizar() { _estadosTareas.Finalizar(); } public void Cancelar() { _estadosTareas.Cancelar(); } public void Posponer() { _estadosTareas.Posponer(); } }
  • 35. Principio de Substitución de Liskov class Ciclomotor: Vehiculo { public string ObtenerNumLicencia() { //devuelve num licencia } } class Coche: Vehiculo { public string ObtenerMatricula() { //devuelve matricula } } class Impuestos { public void CalcularImpuesto(Vehiculo vehiculo) { string matricula = ((Coche) vehiculo).ObtenerMatricula(); ServicioCalculoImpuestos(matricula, vehiculo.Cilindrada); } }
  • 36. Principio de Substitución de Liskov Si por cada objeto o1 del tipo S existe un objeto o2 del tipo T tal que para todos los programas P definidos en términos de T y el comportamiento de P permanece invariable cuando o1 es sustituido por o2, entonces S es un subtipo de T. Barbara Liskov
  • 37. Principio de Substitución de Liskov public void CalcularImpuesto(Vehiculo vehiculo) { string matricula = string.Empty; if (vehiculo.GetType().Name == "Coche") matricula = ((Coche) vehiculo).ObtenerMatricula(); else if (vehiculo.GetType().Name == "Ciclomotor") matricula = ((Ciclomotor)vehiculo).ObtenerNumLicencia(); ServicioCalculoImpuestos(matricula, vehiculo.Cilindrada); }
  • 38. Principio de Substitución de Liskov public class Cuadrado : Rectangulo { public override int Ancho { get { return base.Ancho; } set { base.Ancho = value; base.Alto = value; } } public override int Alto { get { return base.Alto; } set { base.Ancho = value; base.Alto = value; } } } public class Rectangulo { public virtual int Ancho { get; set; } public virtual int Alto { get; set; } }
  • 39. Principio de Substitución de Liskov [Test] public void AreaRectangulo() { Rectangulo r = new Cuadrado { Ancho = 5, Alto = 2 }; // Fallará pues cuadrado establece // a 2 el ancho y el alto Assert.IsEqual(r.Ancho*r.Alto, 10); // false }
  • 41. Diseño por Contratos [Test] public void AreaRectangulo() { Rectangulo r = new Cuadrado {Ancho = 5, Alto = 2}; // Fallará pues cuadrado establece // a 2 el ancho y el alto Assert.IsEqual(r.Ancho*r.Alto, 10); // false }
  • 44. Principio Inyección Dependencias public class EstacioMeteorologica { public void MostrarDatos() { Barometro barometro = new Barometro(); Termometro termometro = new Termometro(); int presion = barometro.Valor; int temperatura = termometro.Valor; Console.WriteLine( string.Format("Datos a {0} nTemperatura: {1}nPresión:{2}", DateTime.Now, temperatura, presion)); } }
  • 45. Principio Inyección Dependencias •Las clases de alto nivel no deberían depender sobre las clases de bajo nivel. Ambas deberían depender de las abstracciones. •Las abstracciones deberían no depender de los detalles. Los detalles deberían depender de las abstracciones. Robert C. Martin
  • 47. Principio Inyección Dependencias public class EstacioMeteorologica { private IMeteoReferencia __dispo; public EstacioMeteorologica( IMeteoReferencia dispositivo) { _ __dispo = dispositivo; } public void MostrarDatos() { Console.WriteLine( string.Format("Fecha/Hora {0}", DateTime.Now)); Console.WriteLine(_ __dispo()); } }
  • 52. Principio Segregación Interfaces class Modelo2002 : ImpresoraMultifuncional { public override void Imprimir() { Impresion.EnviarImpresion(); } public override void Escanear() { Escaner.DigitalizarAFormatoPng(); } public override void Cancelar() { Impresion.CancelarImpresion(); } public override void EnviarFax() { throw new System.NotImplementedException(); } public void EnviarEMail() { //enviamos por correo electrónico } }
  • 53. Principio Segregación Interfaces Los clientes no deben ser forzosamente dependientes de las interfaces que no utilizan. Robert C. Martin
  • 54. Principio Segregación Interfaces public interface IImprimible { void Imprimir(); } public interface IFotocopiable { void Fotocopiar(); } public interface IEscaneable { void Escanear(); } public interface IFaxCompatible { void EnviarFax(); void RecibirFax(); } public interface ITcpIpCompatible { void EnviarEMail(); } class Modelo1998 : IImprimible, IEscaneable, IFaxCompatible {... } class Modelo2000 : IImprimible, IEscaneable, IFaxCompatible, IFotocopiable {...} class Modelo2002 : IImprimible, IEscaneable, IFotocopiable, ITcpIpCompatible {...}
  • 57. Principios OO • Encapsular aquellas partes susceptibles de variaciones • Más composición, menos herencia • Programa interfaces, no implementaciones • Aboga por el bajo acoplamiento • Ábrete a extensiones, ciérrate a modificaciones. • Depende de abstracciones, no de clases concretas • Sólo habla a “tus amigos”. • “No nos llames; nosotros lo haremos” • Una clase debe tener una única razón de cambio. • Analiza el tamaño de los métodos. Los if/switch nos hablan.

Hinweis der Redaktion

  1. http://www.flickr.com/photos/ryanec/2054043748/sizes/l/in/photostream/
  2. http://en.wikipedia.org/wiki/File:Geoffrey_West_on_Heuristics.jpg
  3. http://www.flickr.com/photos/zunami/3314705978/sizes/l/in/photostream/
  4. http://www.flickr.com/photos/isaiaslomay/5030185457/sizes/l/in/photostream/