EXPOSICION: POLIMORFISMO Y FABRICACION PURA GRUPO 1: Cindy J. Bernal, Albeyro Echeverry, Jhoan A. García, Santiago Gómez, Luis D. Males. CONCEPTOS BÁSICOS: COHESION: En una clase es la relación entre los distintos elementos de la clase normalmente en sus métodos. La cohesión consiste en que todos los elementos de una misma clase tienen que trabajar en la misma dirección, es decir hacia un mismo propósito. Ej.: Clase Coche debe ocuparse de cosas relacionadas con el coche en si, como acelerar y frenar, pero no de cosas ajenas a el como manipular información referente a su seguro. En un buen diseño de un Producto de Software Orientado a Objetos el objetivo es mantener en sus clases la mayor cohesión posible. ACOPLAMIENTO: Es la interdependencia existente entre 2 o mas clases, paquetes, etc. Esto ocurre cuando una clase o paquete necesita conocer demasiados detalles internos de otra para su funcionamiento. Para obtener un buen diseño fácil de mantener y modelar cuanto mas bajo acoplamiento se presente en las clases mucho mejor. POLIMORFISMO En patrones GRASP es asignar el mismo nombre a servicios en diferentes objetos cuando los servicios son parecidos ya que tienen asignados una misma responsabilidad o están relacionados por la jerarquía de clases. PROBLEMA: ¿Cómo manejar alternativas basadas en el tipo (clase).? ¿Cómo crear componentes de software conectables? SOLUCION: Cuando los comportamientos varían según el tipo asignar la responsabilidad del comportamiento al tipo que varia, no utilizar condicionales para comprobaciones del tipo de objeto para realizar la operación. EJEMPLO: En la aplicación del PDV Nueva Era, se debe soportar diferentes sistemas externos de cálculo de impuestos de terceras partes, (como Master en impuestos e impuestos-pro); el sistema debe integrarse con distintos de ellos. PROBLEMA: ¿Qué objetos deberían ser los responsables de manejar estas interfaces diferentes de los calculadores de impuestos externos? SOLUCION: Polimorfismo en la adaptación a diferentes calculadores de impuestos externos. DISCUSION: Es un principio fundamental para el diseño en un sistema que debe gestionar variaciones similares. Es fácil de extender para manejar nuevas variaciones, por ejemplo el manejo de un nuevo Calculador de Impuestos seria introduciendo una nueva clase adaptadora de ese calculador con su propio método getImpuestos en el diseño existente. CONTRAINDICACIONES: El uso innecesario de Polimorfismo para manejar variaciones con poca o ninguna probabilidad que ocurran en el sistema. Patrones relacionados con el Polimorfismo: Son las Variaciones Protegidas, el Adaptador, Command, Composite, Proxy, Estado y Estrategia. FABRICACIÓN PURA Patrón que se basa en la creación de clases artificiales que agrupan comportamientos o funciones comunes entre clases del dominio para soportar los conceptos de Alta Cohesión y Bajo Acoplamiento. PROBLEMA: ¿Qué Objetos deberían tener la responsabilidad para evitar la baja cohesión y el alto acoplamiento ocasionados en algunos casos por otros patrones como el Experto? SOLUCION: Asignar un conjunto de responsabilidades comunes (funciones) a una clase artificial que no representa un concepto del dominio del problema y que al implementarlas en otras clases provoca baja cohesión y alto acoplamiento en ellas. Esta clase nueva soporta alta cohesión y bajo acoplamiento. EJEMPLO: En la aplicación del PDV Nueva Era, se debe almacenar los objetos creados de Venta en una Base de Datos. ¿Qué clase debería dar el soporte a la Base de Datos para almacenar el objeto Venta? Según el Patrón Experto la Clase Venta sería la candidata para almacenar sus propios atributos en la Base de Datos. PROBLEMA: La clase Venta tendría que soportar gran variedad de operaciones orientada al almacenamiento de datos que no se referencian en si al concepto de Venta por lo tanto se produce Baja Cohesión. La clase se debe adaptar a una interfaz de Base de Datos, en nuestro caso al JDBC de java, provocando así alto acoplamiento. SOLUCION: Almacenar datos en una Base de Datos son comportamientos comunes entre varias clases por lo tanto implementarlos en una nueva clase artificial “AlmacenamientoPersistente” que soporte estas funciones evita así el problema de baja cohesión, baja reutilización y alto acoplamiento que se producía al seguir el Patrón Experto. DISCUSION: El diseño de los objetos se puede dividir en dos grupos: 1. Los escogidos de acuerdo a una descomposición de la representación. 2. Los escogidos según una descomposición del comportamiento. DESCOMPOSICION DE LA REPRESENTACION: Es una estrategia común en el diseño de los objetos y favorece el objetivo de salto en la representación, es cuando decimos que una clase esta relacionada o representa una cosa en el dominio. DESCOMPOSICION DEL COMPORTAMIENTO Cuando deseamos asignar responsabilidades agrupando comportamientos o algoritmos, sin que interese crear una clase con un nombre u objetivo que este relacionado con un concepto del dominio del mundo real. Es una clase de conveniencia concebida por el desarrollador para agrupar algún comportamiento o métodos relacionados BENEFICIOS: Soporta alta Cohesión puesto que las responsabilidades se factorizan en una clase que solo se centra en un conjunto muy especifico de tareas relacionadas. El potencial para reutilizar podría aumentar debido a la presencia de clases de fabricación pura cuyas responsabilidades tienen aplicación en otras aplicaciones. CONTRAINDICACIONES: Abusar de la descomposición de comportamiento en la creación de objetos de fabricación pura. Abusar de la fabricación pura (demasiados objetos de comportamientos con responsabilidades que NO se colocaron con la información necesaria para su realización) = afecta el acoplamiento negativamente, ya que se puede presentar clases con solo estructura de datos y otras con solo funciones.