Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Patrones utiles para solid

383 views

Published on

Published in: Technology
  • Be the first to comment

Patrones utiles para solid

  1. 1. Patrones útiles para los principios SOLIDDept. Tecnologias Corporativas noviembre de 2011 José Miguel Torres Area I+D+i
  2. 2. Agenda• Básicos • Fundamentos • Principios • Patrones• Aspectos • Acoplamiento • Cohesión • Encapsulamiento• Principios SOLID • SRP • OCP • LSP • DIP • ISP• Reflexión
  3. 3. AcoplamientoCohesión Encapsulamiento
  4. 4. Principios SOLIDSRP - Single Responsibility PrincipleOCP - Open Closed PrincipleLSP - Liskov Substitution PrincipleDIP - Dependency Inversion PrincipleISP - Interface Segregation Principle
  5. 5. Principio de Responsabilidad Únicapublic 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; }}
  6. 6. Principio de Responsabilidad ÚnicaUna clase debe tener una y sólo unaúnica causa por la cual puede sermodificadaRobert C. Martin
  7. 7. 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; } }
  8. 8. 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; } }
  9. 9. Principio de Responsabilidad Única interface Modem { void dial(int pNumber); void hangup(); void send(char[] data); char[] receive(); }
  10. 10. Patrón Software
  11. 11. Patrón Software
  12. 12. Principio Open/Closedpublic 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(); }}
  13. 13. Principio Open/Closedpublic 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(); }
  14. 14. Principio Software
  15. 15. Principio Software
  16. 16. Principio Open/Closed Una clase debe estar abierta a extensiones pero cerrada a las modificaciones. Dr. Bertrand Meyer
  17. 17. Fundamentos OO Encapsulamientoclass 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 } }}
  18. 18. 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 } }
  19. 19. 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(); } }
  20. 20. Patrón Software
  21. 21. Patrón Software
  22. 22. 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); } }
  23. 23. 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
  24. 24. Principio de Substitución de Liskovpublic 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);}
  25. 25. 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; } }
  26. 26. 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}
  27. 27. Patrón Software
  28. 28. 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}
  29. 29. Principio Inyección Dependencias
  30. 30. Principio Inyección Dependenciaspublic 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)); }}
  31. 31. Principio Inyección Dependencias•Las clases de alto nivel no deberían depender sobrelas clases de bajo nivel. Ambas deberíandepender de las abstracciones.•Las abstracciones deberían no dependerde los detalles. Los detalles deberían dependerde las abstracciones.Robert C. Martin
  32. 32. Principio Inyección Dependencias
  33. 33. Principio Inyección Dependenciaspublic 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()); }}
  34. 34. Inversión Del Control (IoC)
  35. 35. Patrón Software
  36. 36. Principio Segregación Interfaces
  37. 37. 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 } }
  38. 38. Principio Segregación Interfaces Los clientes no deben ser forzosamentedependientes de las interfaces que no utilizan. Robert C. Martin
  39. 39. Principio Segregación Interfacespublic 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{...}
  40. 40. Patrón Software
  41. 41. 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.
  42. 42. Blog: http://josemigueltorres.netTwitter: @alegrebandoleroEmail: josemiguel.torres@mrw.es

×