domingo, 14 de julio de 2013

PNF EN INFORMÁTICA



UNIDAD V
FUNDAMENTOS  DEL DISEÑO  


·         Conceptos generales de diseño.
El software no es el único campo donde el diseño se encuentra inmiscuido. En general podemos ver el diseño como una forma para resolución de problemas. El problema sin solución definitiva es interesante en términos de comprensión del diseño. Un número de otras nociones y conceptos son también de interés en la comprensión del diseño en su sentido general,  objetivos,  limitaciones, alternativas, representaciones y soluciones
·         Contexto del diseño de software.
El diseño del software se encuentra en el núcleo técnico de la respectiva ingeniería y se aplica de manera independiente al  modelo  software que se utilice. Una vez que se analizan y especifican los requisitos, el diseño del software es la última  acción de la ingeniería correspondiente dentro de la actividad del modelado, la cual establece una plataforma para la  construcción (generación de código y prueba).
"El milagro más común de la ingeniería de software es la transición del  análisis al diseño y del diseño al código" Richard Due
·         Proceso del Diseño de Software.
·         Diseño Arquitectónico.
El diseño arquitectónico puede representarse al usar uno o más de muchos modelos diferentes. Los modelos estructurales representan la arquitectura como una colección organizada de componentes del  programa. Los modelos del marco de trabajo repetible incrementan el grado de abstracción del diseño al intentar identificar marcos de trabajo repetibles del diseño arquitectónico que se encuentran en tipos de aplicaciones similares.
El diseño de la arquitectura de software se describe cómo se descompone y como están organizados los componentes en el software.

Diseño Detallado.
El diseño detallado se describe el  comportamiento específico de estos componentes.
·         Técnicas Permitidas.
·         Abstracción
Abstracción es el proceso o el resultado de la generalización de la reducción del contenido de la  información de un concepto o un fenómeno observable, por lo general, con el fin de conservar únicamente la información que es relevante para un propósito en particular. Cuando se considera una solución modular a cualquier problema se pueden exponer muchos grados de abstracción. En un alto grado de abstracción una solución se establece en términos generales con  el lenguaje del entorno del problema. En los grados de menor abstracción se proporciona una descripción más detallada de la solución. En la medida en que se cambian los diferentes grados de abstracción se trabaja para crear abstracciones procedimentales y de datos.
Abstracción Procedimental: Se refiere a una secuencia de instrucciones que tiene función específica y limitada.
Abstracción de Datos: Es una colección nombrada de datos que describe un objeto de datos.
·         Acoplamiento y Cohesión.
Dentro del  modelo de  diseño es necesario que las clases de diseño colaboren con alguna otra. Es una medida de la interconexión entre los módulos de la estructura  de un  programa. Depende de la complejidad de la interfaz entre los módulos, el punto en el que se entra o se hace referencia al módulo y qué datos pasan a través de la interfaz. Intentamos conseguir el menor nivel posible de acoplamiento. Las conexiones sencillas entre los módulos hacen que el software sea más fácil de entender y menos dado al efecto.
Acoplamiento: La  fuerza de las relaciones entre los módulos.
Acoplamiento de datos: está subordinado al módulo y se accede a él por medio de una lista convencional de argumentos a través de la cual se pasan los datos.
Acoplamiento de marca: cuando en vez de argumentos simples se pasa una porción de la estructura de datos se pasa por la interfaz del módulo.
Acoplamiento de control: se pasa un indicador de control (una variable que controla las decisiones en el módulo subordinado).
Acoplamiento externo: cuando los módulos están atados a un entorno externo al software. Por ejemplo, las I/O y los dispositivos.
Acoplamiento común: varios módulos hacen referencia a un área global de datos.
Acoplamiento de contenido: un módulo hace uso de datos o de  información de control mantenidos dentro de los  límites de otro módulo. Cuando se realiza una bifurcación hacia la mitad de otro módulo.
Una  clase de diseño cohesiva tiene un conjunto de responsabilidades pequeño y enfocado, y aplica atributos y  métodos de manera sencilla de implementar dichas responsabilidades.
Cohesión: Como están relacionados los elementos que conforman un módulo.
Es una extensión natural del  concepto de ocultamiento de la información. Un módulo con cohesión realiza una sola tarea dentro de un  procedimiento de software, requiriendo poca interacción con los  procedimientos que se realizan en otras partes del programa. Un módulo con cohesión debería hacer una sola cosa. Siempre debemos buscar la cohesión más alta, aunque la parte media del espectro es a menudo aceptable.
Coincidencialmente cohesivo: un módulo que realiza un conjunto de tareas poco relacionadas las unas con las otras.
Cohesión  lógica: realiza tareas relacionadas lógicamente (produce todas las salidas).
Cohesión temporal: contienen tareas relacionadas por el hecho de que todas deben hacerse en el mismo intervalo de  tiempo.
Cohesión procedimental: cuando los elementos de procesamiento están relacionados y deben ejecutarse en un orden específico.
Cohesión de  comunicación: todos los elementos de procesamiento se concentran en un área de la estructura de datos.
·         La descomposición y la modularización.
Los patrones de  arquitectura y diseño de software materializan la modularidad; es decir, el software se divide en componentes con nombres independientes y que es posible abordar en forma individual. Estos componentes llamados módulos se integran para satisfacer los requisitos del problema.
Modularidad: Es el atributo particular del software que permite que un programa sea manejable de manera intelectual.
Se divide el software en componentes identificables y tratables por separado, denominados módulos, que están integrados para satisfacer los requisitos del programa.
Hay un número m de módulos que resultarían en un  costo de desarrollo mínimo, pero no tenemos la sofisticación necesaria para predecir m con seguridad
·         Encapsulación/Ocultar Información
Mediante la agrupación y empaquetado de los elementos y los detalles internos de una abstracción, haciendo que estos detalles sean inaccesibles.
·         Separación de la interfaz y la aplicación
La separación de la interfaz y la aplicación implica la definición de un elemento especificando una interfaz pública, conoce a los  clientes, aparte de los detalles de cómo se realiza el componente.
·         Suficiencia, integridad y primitivismo.
Los métodos asociados con una clase de diseño deben enfocarse en el cumplimiento de un  servicio para la clase.
·         Concurrencia:
La forma de descomponer el software en los procesos, tareas e hilos tratar relacionarlos con la eficiencia, la atomicidad, la sincronización, y demás cuestiones de programación.
·         Control y manejo de Eventos
Cómo organizar los datos y el controlar el flujo, manejo de reactivo y temporal de los acontecimientos a través de diversos mecanismos, tales como la invocación implícita de llamadas y sus intentos.
·         Distribución de Componentes
Cómo distribuir el software en el  hardware, cómo los componentes se comunican, cómo se puede usar una plataforma al utilizarse para hacer frente a software heterogéneos.
·         Error y  gestión de Excepciones  tolerancias a Fallos.
El  análisis y la gestión del riesgo son una serie de pasos que ayudan al equipo del software a comprender y a gestionar la incertidumbre.
Un riesgo es un problema potencial que puede ocurrir o no. Pero sin tener en cuenta el resultado, realmente es una  buena idea es identificarlo, evaluar su probabilidad de aparición, estimar su impacto, y establecer un plan de contingencia por si ocurre el problema.  Después, el equipo de Software establece un plan para controlar el riesgo. El primer  objetivo es evitar el riesgo, pero como no se pueden evitar todos los riesgos, el equipo trabaja para desarrollar un plan de contingencia que le permita responder de una manera eficaz y controlada.
Estructura y Arquitectura de Software
En el sentido estricto, una arquitectura de software es "Una  descripción de los subsistemas y componentes de un sistema de software y las relaciones que existen entre ellos".  A mediados de 1990, la arquitectura empezó a emerger como una  disciplina más amplia que implica el estudio de las  estructuras y las arquitecturas de software en una forma más genérica, dando ideas interesantes sobre diseño del software en diferentes niveles de abstracción.
Algunos de estos conceptos son muy útiles durante el diseño arquitectónico (estilo de arquitectura), de software específico, así como en su diseño de detalle (nivel inferior, patrones de diseño). Así también para el diseño de  sistemas genéricos lo que lleva a la concepción de las familias de los  programas (conocidas como líneas de productos  ). La mayoría de estos conceptos pueden verse como intentos de describir, por tanto la reutilización del diseño genérico del  conocimientos.
El desarrollo de un sistema con gran cantidad de software requiere que este sea visto desde diferentes perspectivas. Diferentes usuarios (usuario final, analistas, desarrolladores, integradores, jefes de  proyecto...) siguen diferentes actividades en diferentes momentos del  ciclo de vida del proyecto, lo que da lugar a las diferentes vistas del proyecto, dependiendo de qué interese más en cada instante de tiempo.
La arquitectura es el conjunto de decisiones significativas sobre:
·         La  organización del sistema.
·         Selección de elementos estructurales y sus interfaces a través de los cuales se constituye el sistema.
·         El  comportamiento, como se especifica las colaboraciones entre esos componentes.
·         Composición de los elementos estructurales y de comportamiento en subsistemas progresivamente más grandes.
·         El estilo arquitectónico que guía esta organización: elementos estáticos y dinámicos y sus interfaces, sus colaboraciones y su composición.
·         Estructuras Arquitectónicas y Puntos de Vista.
Durante las diferentes facetas o etapas del software deben ser descritos y documentados.
"Una vista representa un aspecto parcial de la arquitectura de un software mostrando las propiedades del sistema de software".
La arquitectura que no debe centrarse únicamente en la estructura y en el comportamiento, sino que abarque temas como el uso, funcionalidad, rendimiento, capacidad de adaptación, reutilización, capacidad para ser comprendida, restricciones, compromisos entre alternativas, así como aspectos estéticos. Para ello se sugiere una arquitectura que permita describir mejor los sistemas desde diferentes vistas, donde cada una de ellas es una proyección de la organización y la estructura centrada en un aspecto particular del sistema.
La vista de casos de uso comprende la descripción del comportamiento del sistema tal y como es percibido por los usuarios finales, analistas y encargados de las  pruebas y se utilizan los diagramas  de casos de uso para capturar los aspectos estáticos mientras que los dinámicos son representados por diagramas de interacción, estados y actividades.
La vista de diseño comprende las clases, interfaces y colaboraciones que forman el vocabulario del problema y de la solución. Esta vista soporta principalmente los requisitos funcionales del sistema, o sea, los  servicios que el sistema debe proporcionar. Los aspectos estáticos se representan mediante diagramas de clases y objetos y los aspectos dinámicos con diagramas de interacción, estados y actividades.
La vista de procesos comprende los hilos y procesos que forman mecanismos de sincronización y concurrencia del sistema cubriendo el funcionamiento, capacidad de crecimiento y el rendimiento del sistema. Con UML, los aspectos estáticos y dinámicos se representan igual que en la vista de diseño, pero con el énfasis que aportan las clases activas, las cuales representan los procesos y los hilos.
La Vista de implementación comprende los componentes y los archivos que un sistema utiliza para ensamblar y hacer disponible el sistema físico. Se ocupa principalmente de la gestión de configuraciones de las distintas versiones del sistema. Los aspectos estáticos se capturan con los diagramas de componentes y los aspectos dinámicos con los diagramas de interacción, estados y actividades.
La vista de despliegue de un sistema contiene los nodos que forman la topología  hardware sobre la que se ejecuta el sistema. Se preocupa principalmente de la distribución, entrega e instalación de las partes que constituyen el sistema. Los aspectos estáticos de esta vista se representan mediante los diagramas de despliegue y los aspectos dinámicos con diagramas de interacción, estados y actividades.
·         Patrones de Diseño (Patrones Micro arquitectónicos).

Los patrones de diseño hacen que sea más fácil reutilizar buenos diseños y arquitecturas. Al expresar como patrones de diseño técnicas que ya han sido probadas, las estamos haciendo más accesibles para los desarrolladores de nuevos sistemas. Los patrones de diseño nos ayudan a elegir las alternativas del diseño que hacen que un sistema sea reutilizable, y evitar aquellas que dificultan dicha reutilización.
Los patrones de creación tienen que ver con el proceso de creación, estructural o de comportamiento.
Calidad en el análisis, diseño y evaluación del software
·         Calidad de atributos
Varios atributos son generalmente considerados importantes que permiten obtener un diseño de software con alta calidad, existen algunas características que son ( mantenible, portabilidad, probable) y (correctos, robusto). Cabe destacar que existen diferencias entre calidad de atributos que son (rendimiento, seguridad, funcionalidad y usabilidad), y los que son (portabilidad, reutilización, integralidad y pruebas), y las características relacionadas con la arquitectura (integridad conceptual, correcto, completo).
·         Calidad en análisis y evaluación de técnicas
Varias técnicas y herramientas pueden ayudar a mejorar la calidad de diseño de software:
Diseño de software:  Para este tipo se puede aplicar al diseño de software informal y semi informal tomando un  grupo base, técnicas que permiten verificar la calidad de diseño de los artefactos que pueden ser (vista de la arquitectura, diseño -inspección, técnicas y requerimientos).
Análisis estático: Para este tipo se puede aplicar al diseño de software informal y semi informal que permite evaluar algo simple utilizando análisis automáticos de casos de pruebas.
Simulación y prototipos: Son técnicas dinámicas que permiten evaluar un diseño la característica de  simulación, o la flexibilidad del prototipo.
Diseño de software
Muchas notaciones y lenguajes existen para representar el diseño de artefactos de software. Algunos describen un diseño estructural organizado, otros representan el inicio del software. Estas notaciones son generalmente usadas durante un diseño natural y se pueden usar durante ambos casos. Una representan notaciones que son usadas en el contexto de específicos métodos en las  estrategias de diseño y métodos de sub áreas, pero estas categorías son categorizadas en notaciones para describir la estructura estática y la dinámicas vistas.

Bibliografía
[1] Swebok_Ironman_June_23_ 2004
[2] http://www.info-ab.uclm.es/asignaturas/42530/pdf/M1tema2.pdf
[3] http://es.wikipedia.org/wiki/Ingenier%C3%ADa_de_software
[4] http://www.monografias.com/trabajos28/proyecto-uml/proyecto-uml.shtml
[5] PRESSMAN Roger S., 2005. Ingeniería de Software. Un enfoque práctico. Sexta edición. 2005, Estados Unidos.




Paginas a consultar: