Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
01/06/2013 1 Principios de Diseño para Software Orientado a Objetos Ing. Judith Meles 2Judith Meles Características de un buen diseño Independencia de los componentes Identificación y tratamiento de excepciones Prevención y tolerancia de defectos 01/06/2013 2 3Judith Meles Independencia de los componentes En la mayoría de los diseños se trata que los componentes sean independientes unos de otros. Para reconocer y medir el grado de independencia de los componentes de un diseño se aplican dos conceptos: Acoplamiento Cohesión 4Judith Meles Acoplamiento Dos componentes están altamente acoplados cuando existe mucha dependencia entre ellos. Los componentes poco acoplados, tienen algunas dependencias, pero las interconexiones entre ellos son débiles Los componentes no acoplados no tienen interconexiones con el resto; son completamente independientes 01/06/2013 3 5Judith Meles Cohesión Se refiere al grado de interconexión interna con el que se ha construido el componente. Un componente es cohesivo si todos sus elementos están orientados a la realización de una única tarea y son esenciales para llevarla a cabo. 6Judith Meles 6Judith Meles Principio de Diseño Un principio de diseño es una técnica o herramienta básica que puede ser aplicada para diseñar o construir software, para hacer más flexible, extensible y mantenible. 01/06/2013 4 7Judith Meles Principios de Diseño Básicos Flexibilidad: el software puede cambiar y crecer sin un constante re-trabajo. Evita la fragilidad del software. Encapsulamiento: Mantiene las partes del software que son estables, lejos de las partes que cambian, entonces es fácil hacer cambios sin necesidad de romper todo. Funcionalidad: Sin esto no importa que bien esté hecho el diseño, el cliente no estará feliz. Uso de Patrones de Diseño: se trata de reuso y de no tratar de resolver un problema que ya resolvió alguien más. 8Judith Meles Número 1: El principio Abierto - Cerrado Es para permitir el cambio. Y para permitirlo sin modificar lo existente. Clases abiertas para extensión Clases cerradas para modificación Es a cerca de la flexibilidad. 01/06/2013 5 9Judith Meles Número 2: El principio no te repitas Evitar duplicaciones, abstrayendo cosas comunes y ubicándolas en un único lugar. Se trata de ubicar un requerimiento en un ÚNICO lugar. Tener cada pieza de información y comportamiento del sistema en un único lugar. 10Judith Meles Número 3: El principio de responsabilidad única Cada objeto del sistema debería tener una única responsabilidad. Todos los servicios del objeto deberían focalizarse en ejecutar esa única responsabilidad. Se cumple si cada objeto tiene un única razón para cambiar (cohesión). 01/06/2013 6 11Judith Meles Ejemplo: Clase Automóvil Responsabilidades Sigue el Principio Viola el Principio El automóvil se inicia a sí mismo El automóvil se detiene a sí mismo El automóvil se cambia el neumático a sí mismo El automóvil se conduce a sí mismo El automóvil se lava a sí mismo El automóvil se obtiene su nivel de aceite a sí mismo Análisis del Principio de responsabilidad única 12Judith Meles Número 4: El principio de Sustitución de Liskov Los subtipos deben ser sustituibles por sus tipos base. Se refiere a la herencia bien diseñada. Este principio revela problemas con la estructura de la herencia, si existieran. 01/06/2013 7 13Judith Meles Ejemplo: 14Judith Meles Herencia frente a Realización Conocido también como herencia de implementación frente a herencia de interfaz. Hay que distinguir dos conceptos: Clase: define como se implementa un objeto. Tipo: sólo se refiere a su interfaz. Herencia de clases: define la implementación de un objeto en términos de la implementación de otro. En resumen un mecanismo para compartir código o representación. Herencia de interfaces: describe cuando se puede usar un objeto en lugar de otro. La mayoría de los lenguajes no distinguen entre los dos tipos de herencia. 01/06/2013 8 15Judith Meles Programar para interfaces no para una implementación Herencia de clases es un mecanismo para extender la funcionalidad reutilizando de las clase padre. Permite definir un nuevo tipo de objeto basándose en otro. Reusar la implementación es sólo la mitad de la historia. También es importante la capacidad de la herencia para definir familias de objetos con interfaces idénticas, al ser esto en lo que se basa el polimorfismo. Si la herencia se usa con cuidado (correctamente), todas las clases que derivan de una clase abstracta, compartirán su interfaz. Esto implica que las subclases añaden o redefinen, no ocultan operaciones de la clase padre. 16Judith Meles Programar para interfaces no para una implementación Manipular los objetos solamente en términos de la interfaz definida por las clases abstractas tiene dos ventajas: Los clientes no tienen que conocer los tipos específicos de los objetos que usan, es suficiente con que éstos adhieran a la interfaz que esperan los clientes. Los clientes desconocen las clases que implementan dichos objetos; solo conocen las clases abstractas que definen la interfaz. Esto reduce las dependencias de implementación entre subsistemas. No se deben declarar variables como instancias de clases concretas. En vez de eso, se ajustarán simplemente a la interfaz definida por una clase abstracta. 01/06/2013 9 17Judith Meles La herencia no es la única opción… Delegación: delegar comportamiento a otra clase cuando no quiere cambiar el comportamiento, pero no es su responsabilidad de sus objetos implementar ese comportamiento por si mismos. Composición: puede reusar el comportamiento de una o más clases, y en particular de una familia de clases, con composición. El objeto posee completamente a los objetos compuestos y ellos no existen fuera del uso del objeto. Agregación: Cuando se quieren los beneficios de la composición pero se utiliza el comportamiento de un objeto que existe más allá del objeto que lo usa. Si se favorece la delegación, composición y agregación sobre la herencia, el software será generalmente, más flexible y fácil de mantener, extender y reusar. 18Judith Meles Composición La composición permite utilizar el comportamiento de una familia de otras clases, y cambiar ese comportamiento en tiempo de ejecución. La composición es lo más poderoso cuando se quiere usar el comportamiento definido en una interfaz, y luego elegir de una variedad de implementaciones de la interfaz, tanto en tiempo de ejecución como en tiempo de compilación. En la composición, el objeto compuesto de otros comportamientos posee estos comportamientos. Cuando el objeto se destruye, también sus comportamientos. Los comportamientos en una composición no existen fuera de la composición en sí misma. 01/06/2013 10 19Judith Meles Agregación vs. Composición La forma de reconocerlas es hacer la siguiente pregunta: ¿El objeto cuyo comportamiento quiero usar existe fuera del objeto que usa ese comportamiento? Si un objeto tiene sentido de existencia por si solo se debe usar: Agregación De lo contrario usar: Composición 20Judith Meles Herencia frente a composición La reutilización mediante herencia se suele llamar “Reutilización de Caja Blanca”. Se refiere a la visibilidad, con la herencia el interior de la clase padre suele hacerse visible a las subclases. La composición es una alternativa, la funcionalidad se obtiene “ensamblando” objetos para obtener una funcionalidad más compleja. Este estilo se denomina “Reutilización de Caja Negra” La visibilidad en este caso no ´posible dado que los detalles internos de los objetos no son visibles. 01/06/2013 11 21Judith Meles Herencia frente a composición: Ventajas y desventajas HERENCIA Se define estáticamente en tiempo de compilación. Es sencilla de usar. Fácil de modificar la implementaciónque está siendo reutilizada. No se puede cambiar la implementación en tiempo de ejecución. Rompe el encapsulamiento. Los cambios en la implementación del padre obligan a cambios en la implementación de las subclases. COMPOSICIÓN Se define dinámicamente en tiempo de ejecución. Requiere de objetos con interfaces bien diseñadas, dado que a los objetos solo se accede por sus interfaces, no se rompe el encapsulamiento. Los objetos se pueden reemplazar en tiempo de ejecución siempre que sean del mismo tipo. Las dependencias de implementación son menores. En un diseño así el comportamiento del sistema depende de las relaciones en lugar de estar definido en las clases. 22Judith Meles Delegación Forma de lograr que la composición sea tan potente para la reutilización como la herencia. Es cuando se transfiere la responsabilidad por una tarea particular a otra clase o método. Se utiliza mejor cuando se quiere usar la funcionalidad de una clase tal cual es, sin cambiar su comportamiento para nada. Es una alternativa a la herencia que no viola el principio de sustitución. La principal ventaja es que sea fácil combinar comportamientos en tiempo de ejecución y cambiar la manera en la que éstos se combinan. La desventaja es que el software dinámico y altamente parametrizado es más difícil de entender que el estático. Es un ejemplo extremo de composición de objetos 01/06/2013 12 23Judith Meles 23Judith Meles Ejemplo de Delegación En lugar de pensar que Ventana “es un” Rectángulo, porque resulta que son rectangulares, ventana reusa el comportamiento de rectángulo, guardando una instancia de ésta en una variable y delegando en ella el comportamiento específico de los rectángulos. Dicho de otra forma: en lugar de que Ventana “sea un” rectángulo, Ventana “contendrá” un rectángulo. Así Ventana debe reenviar las peticiones a su instancia de rectángulo, mientras que antes habría heredado esas operaciones. 24Judith Meles Principios de Diseño Orientado a Objetos Las clases se tratan de comportamiento y funcionalidad. Diseños de bajo acoplamiento entre objetos que interactúan. Depender de las abstracciones no de clases concretas. Encapsular lo que varía. Hablar solo con amigos No nos llames, nosotros te llamamos o Principio de Control Invertido. 01/06/2013 13 25Judith Meles Bibliografía Design Patterns: Elements of Reusable Object- oriented software. Gamma, Helm, Johnson, Vlissides Head First Design Patterns. Freeman & Freeman Head First Object-Oriented Analysis & Design. McLaughlin, Brett, Pollice Gary & West David. 26Judith Meles 26Judith Meles Historia de Cambios Fecha Versión Descripción Autor 31/07/2009 1.0 Versión Inicial Judith Meles 30/07/2011 1.1 Correcciones de formato y se agregan slides con conceptos de cohesión y acoplamiento Judith Meles
Compartir