El modelo de diseño es un refinamiento y formalización adicional del modelo del análisis, donde se toman en cuenta las consecuencias del ambiente de implementación. El resultado del modelo de diseño son especificaciones muy detalladas de todos los objetos, incluyendo sus operaciones y atributos. El modelo de diseño se basa en el diseño por responsabilidades.
* Se requiere un modelo de diseño ya que el modelo de análisis no es lo suficiente formal para alcanzar el código fuente. Por tal motivo se refinan los objetos, incluyendo las operaciones y atributos. Además se debe considerar aspectos como, los requisitos del rendimiento, tiempo real, concurrencia, lenguaje de programación, manejo de base de datos, etc.
* Otro objetivo del diseño es validar los resultados de los modelos de requisitos y análisis. Durante el diseño, se ve si los resultados anteriores son apropiados para la implementación. Si se descubren aspectos que no están claros en algunos de los modelos anteriores, estos se aclaran, posiblemente regresando a etapas anteriores.
En general, los
cambios en la arquitectura del sistema para mejorar su rendimiento deben
proponerse hasta que el sistema este (parcialmente). Construido.
Se considera dos aspectos principales del modelo de diseño.
Se considera dos aspectos principales del modelo de diseño.
* Diseño del objeto. Se refina y formaliza el modelo para generar especificaciones muy detalladas de todos los objetos, incluyendo sus operaciones y atributos. Se describe cómo interactúan los objetos en cada caso de uso específico, especificando que debe hacer cada operación en cada objeto. Este paso genera las interfaces de los objetos, las cuales después deben implementarse mediante métodos.
DISEÑO DE SISTEMA
El modelo se adapta al ambiente de implementación. Este paso incluye identificar e investigar las consecuencias del ambiente de implementación sobre el diseño. Aquí deben tomarse las decisiones de implementación estratégicas: como se incorporara una BD en el sistema: que y como se usaran las bibliotecas de componentes: que lenguajes de programación se utilizaran: como se manejaran los procesos incluyendo comunicación y requisitos de rendimiento: como se diseñaran el manejo de excepciones y recolección de basura, etc.
De manera homogénea
entre los objetos permite que cada objeto sepa menos cosas. Esto produce
objetos más pequeños y más fáciles de comprender. La desventaja es que la
inteligencia del sistema va de la mano con la especialización de las clases. Si
todas las clases son inteligentes, esto significara que estas serán muy
especializadas dificultando la extensibilidad del sistema que requiere
generalizar más las clases.
El tercer enfoque es encontrar un balance entre los dos primeros. La idea es homogeneizar la inteligencia del sistema solo entre ciertas clases, como las de control. El resto de las clases, entidad y borde, serán tontas, generalmente sobreviviendo a modificaciones en el sistema y manteniendo la lógica introducida durante el modelo de requisitos y el modelo de análisis posterior para lograr una mayor robustez del sistema.
La robustez de un sistema debe ser uno de los objetivos principales del diseño. El sistema debe estar protegido contra errores y ofrecer diagnósticos que permitan identificar fallas, en particular aquellas que son fatales. Durante el desarrollo, a veces es bueno insertar instrucciones internas en el código para descubrir fallas, aunque luego se eliminen durante la producción. En general, se debe escoger lenguajes de programación que apoyen estos aspectos, como son el manejo de excepciones. Las principales consideraciones relacionadas con la robustez de un sistema son las siguientes:
El sistema debe estar protegido contra parámetros incorrectos proporcionados por el usuario. Cualquier método que acepte parámetros del usuario debe validar la entrada para evitar problemas. El diseñador de métodos debe considerar dos tipos de condiciones de error: i) errores lógicos que se identifican durante el análisis y ii) errores de implementación, incluyendo errores del sistema operativo, como los errores de asignación de memoria, o errores de archivos de entrada y salida.
El sistema no debe optimizarse hasta que este funcione de manera correcta. se debe estudiar las alternativas, como aspectos de memoria, velocidad y simplicidad de implementación. No se debe optimizar más de lo necesario, ya que la optimización compromete la extensibilidad, reusó y comprensión del sistema.
* El sistema debe incluir estructuras de datos de tamaño variable, sin límites predefinidos. Durante el diseño es difícil predecir la capacidad máxima esperada para la estructura de datos en la aplicación. Por tanto, se deben escoger estructuras de datos como las listas, a diferencia de los arreglos.
* El sistema debe instrumentar un monitoreo de rendimiento y búsqueda de errores. El esfuerzo para llevarlo a cabo depende del ambiente de programación. Si el lenguaje de implementación no proporciona ningún apoyo, se añaden métodos de impresión para cada clase. También se añaden mensajes de entrada y salida a los métodos imprimiendo selectivamente estos valores.
El encapsulamiento es fundamental para la robustez del sistema. Ocultar la información interna, atributos e implementación de métodos de una clase, permite cambiarla sin afectar el resto del sistema. Únicamente la interface de los métodos afecta a las demás clases.
Reuso:
* El reusó es en aspecto fundamental del diseño. Cuanto más se pueda reutilizar el código será mejor la robustez del sistema las siguientes son algunas estrategias para mejorar las posibilidades del reusó de los diseño.
El tercer enfoque es encontrar un balance entre los dos primeros. La idea es homogeneizar la inteligencia del sistema solo entre ciertas clases, como las de control. El resto de las clases, entidad y borde, serán tontas, generalmente sobreviviendo a modificaciones en el sistema y manteniendo la lógica introducida durante el modelo de requisitos y el modelo de análisis posterior para lograr una mayor robustez del sistema.
La robustez de un sistema debe ser uno de los objetivos principales del diseño. El sistema debe estar protegido contra errores y ofrecer diagnósticos que permitan identificar fallas, en particular aquellas que son fatales. Durante el desarrollo, a veces es bueno insertar instrucciones internas en el código para descubrir fallas, aunque luego se eliminen durante la producción. En general, se debe escoger lenguajes de programación que apoyen estos aspectos, como son el manejo de excepciones. Las principales consideraciones relacionadas con la robustez de un sistema son las siguientes:
El sistema debe estar protegido contra parámetros incorrectos proporcionados por el usuario. Cualquier método que acepte parámetros del usuario debe validar la entrada para evitar problemas. El diseñador de métodos debe considerar dos tipos de condiciones de error: i) errores lógicos que se identifican durante el análisis y ii) errores de implementación, incluyendo errores del sistema operativo, como los errores de asignación de memoria, o errores de archivos de entrada y salida.
El sistema no debe optimizarse hasta que este funcione de manera correcta. se debe estudiar las alternativas, como aspectos de memoria, velocidad y simplicidad de implementación. No se debe optimizar más de lo necesario, ya que la optimización compromete la extensibilidad, reusó y comprensión del sistema.
* El sistema debe incluir estructuras de datos de tamaño variable, sin límites predefinidos. Durante el diseño es difícil predecir la capacidad máxima esperada para la estructura de datos en la aplicación. Por tanto, se deben escoger estructuras de datos como las listas, a diferencia de los arreglos.
* El sistema debe instrumentar un monitoreo de rendimiento y búsqueda de errores. El esfuerzo para llevarlo a cabo depende del ambiente de programación. Si el lenguaje de implementación no proporciona ningún apoyo, se añaden métodos de impresión para cada clase. También se añaden mensajes de entrada y salida a los métodos imprimiendo selectivamente estos valores.
El encapsulamiento es fundamental para la robustez del sistema. Ocultar la información interna, atributos e implementación de métodos de una clase, permite cambiarla sin afectar el resto del sistema. Únicamente la interface de los métodos afecta a las demás clases.

* El reusó es en aspecto fundamental del diseño. Cuanto más se pueda reutilizar el código será mejor la robustez del sistema las siguientes son algunas estrategias para mejorar las posibilidades del reusó de los diseño.
* A través de la herencia se incrementa el reuso del código. Se toman las aspectos comunes a clases similares utilizando superficies comunes. Este en enfoque es efectivo cuando las diferencias entre las clases son pequeñas y las similitudes son grandes. Es importante considerar la naturaleza de cada herencia para asegurar que no se llegue a extremos donde la aplicación de la herencia sea inadecuada.
* El uso impropio de la herencia hace que los programas sean difíciles de mantener y extender. Como alternativa, la delegación provee un mecanismo para el reusó de código, pero sin utilizar la herencia. Esto se basa en el uso de agregación a través de clases intermediarias que ocultan la funcionalidad de las clases a las cuales se delega.
Extensibilidad:
* Se debe encapsular otra vez la clases, ocultando su estructura internas a las otras clases. Sólo los métodos de la clase deben accesar a sus atributos.
* No se deben exportar estructuras de datos desde un método. Las estructuras de datos internas son específicas para el algoritmo del método. Si se exportan las estructuras se limita la flexibilidad para cambiar el algoritmo más adelante.
* Una clase particular debe tener un conocimiento limitado de la arquitectura de clases del sistema. Este conocimiento abarcará únicamente las asociaciones entre ésta y sus clases vecinas directas. Cualquier interacción con un vecino indirecto, se deberá hacer mediante llamadas a los vecinos directos
No hay comentarios:
Publicar un comentario