Universidad Nacional Jorge Basadre Grohmann Facultad de Ciencias ANÁLISIS Y DISEÑO ORIENTADO A LOS OBJETIVOS PARA EL SISTEMA CONTROL DE EQUIPOS DE CÓMPUTO DE LA FACULTAD DE CIENCIAS DE LA UNJBG, APLICANDO UML Lic. Wilder Miñano Leon Ing. Edgard Pilco Apaza Tacna – Perú 2003 INTRODUCCIÓN UML, emergió en los '90 luego de la búsqueda de un lenguaje de modelamiento que unificara a la industria, que siguió a la "guerra de métodos" de los '70 y '80. A pesar de que UML evolucionó primeramente de varios métodos orientados al objeto de segunda generación (en nivel de notación), UML no es simplemente un lenguaje para modelamiento orientado al objeto de tercera generación. Su alcance extiende su uso más allá de sus predecesores. Y es la experiencia, experimentación y una gradual adopción del estándar lo que revelará su verdadero potencial y posibilitara a las organizaciones darse cuenta de sus beneficios. El UML es apropiado para una gran variedad de sistemas de modelado de sistemas de información de empresas para aplicaciones distribuidas basadas en Web aún más para sistemas empotrados de tiempo real. Este es un lenguaje muy expresivo, que abarca todos los panoramas necesarios para desarrollar y estructurar tales sistemas. Para aprender a usar UML adecuadamente se requiere aprender tres elementos principalmente: los bloques de construcción básicos, las reglas que dictan como esos bloques deben ser relacionados y algunos mecanismos que aplica todo el tiempo el lenguaje. UML es un proceso independiente que óptimamente debe ser usado en un proceso que es un manejador de caso de uso, con arquitectura central, iterativa e incremental. I. LENGUAJE DE MODELADO UNIFICADO (UML) 1. EL LENGUAJE DE MODELADO UNIFICADO (UML) Es un lenguaje de modelamiento estándar para la escritura de proyectos de software.. UML puede ser usado para: • Dentro de un proceso de sistema intensivo, un método es aplicado para llegar o evolucionar un sistema • • Como un lenguaje, es usado para la comunicación. Es decir, un medio para capturar el conocimiento (semánticas) respecto a un tema y expresar el conocimiento (sintaxis) resguardando el tema propósito de la comunicación. El tema es el sistema en estudio. • Como un lenguaje para modelamiento, se enfoca en la comprensión de un tema a través de la formulación de un modelo del tema (y su contexto respectivo). El modelo abarca el conocimiento cuidando del tema, y la apropiada aplicación de este conocimiento constituye inteligencia. • Cuidando la unificación, integra las mejores prácticas de la ingeniería de la industria tecnologica y sistemas de información pasando por todos os tipos de sistemas (software y no - software), dominios (negocios versus software) y los procesos de ciclo de vida. • En cuanto a cómo se aplica para especificar sistemas, puede ser usado para comunicar "qué" se requiere de un sistema y "cómo" un sistema puede ser realizado. • En cuanto a cómo se aplica para visualizar sistemas, puede ser usado para describir visualmente un sistema antes de ser realizado. • En cuanto a cómo se aplica para construir sistemas, puede ser usado para guiar la realización de un sistema similar a los "planos". • En cuanto a cómo se aplica para documentar sistemas, puede ser usado para capturar conocimiento respecto a un sistema a lo largo de todo el proceso de su ciclo de vida. UML no es: • Un lenguaje de programación visual, sino un lenguaje de modelamiento visual • Una herramienta o deposito de especificación, sino un lenguaje para modelamiento de especificación. • Un proceso, sino que habilita procesos. Fundamentalmente, UML está relacionado con la captura, comunicación y nivelación (disgregación en niveles) de conocimientos. 2. EL UML ES UN LENGUAJE Un lenguaje que proporciona un vocabulario y las reglas para combinar las palabras de ese vocabulario para la comunicación. Un lenguaje de modelado es un lenguaje cuyo vocabulario y reglas se enfocan en la representación conceptual y física de un sistema. Un lenguaje de modelado tal como UML es así un lenguaje estándar para proyectos de software. El modelado permite entender un sistema. Ninguno es suficiente. Mejor dicho, frecuentemente necesitas múltiples modelos que son conectados a algún otro en orden para entender hasta lo más trivial del sistema. El vocabulario y las reglas de un lenguaje tal como UML nos dicen como crear y leer modelos bien formados, pero no nos dicen que modelos debes crear y cuando debes crearlos. Un proceso bien definido te guía en decidir que componentes producir, que actividades y que trabajadores usar para crearlos y manejarlos y como usar esos componentes para validar y controlar el proyecto como tal. a) El UML es un lenguaje para visualización Para muchos programadores la distancia entre el pensamiento de una implementación y convertirlo en código es casi nulo. Tú lo piensas, tú lo codificas. De hecho, algunos objetos son mejor descritos directamente en código. El texto es una forma maravillosamente mínima y directa para escribir expresiones y algoritmos. En tal caso el programador se detiene a hacer un modelado aunque totalmente mental. El debe esbozar sus ideas en un pizarrón o en una servilleta si es posible. No obstante hay muchos problemas con esto. Primero, comunicando esos modelos conceptuales a otros es probable un error al menos que cada uno implique expresar el mismo lenguaje. Típicamente los proyectos y organizaciones desarrollan sus propios lenguajes y este es difícil de entender por una persona ajena o nueva en el grupo. Segundo, hay algunas cosas acerca de un sistema de software que no puedes entender al menos que construyas modelos que trasciendan el lenguaje de programación textual. Por ejemplo, el significado de una jerarquía de clase puede ser deducida pero no totalmente comprendido fijando la atención en el código para todas las clases en la jerarquía. Tercero, si el desarrollador, quien deja de hacer el código, nunca escribió los modelos que estaban dentro de su cabeza, esta información podría ser perdida para siempre. Los modelos escritos en UML enfocan el tercer problema: Un modelo explícito facilita la comunicación. Algunas cosas son mejor modelados textualmente, otros son mejor modelados gráficamente. En todos los sistemas interesantes hay estructuras que trascienden que pueden ser representadas en un lenguaje de programación El UML como tal, es un lenguaje gráfico. Este enfoca el segundo problema descrito fácilmente. El UML es más que un gran número de símbolos gráficos. Mejor dicho, detrás de cada símbolo de la notación de UML hay una semántica bien definida. De esta forma, un desarrollador puede escribir un modelo en el UML y otro desarrollador aun con otra herramienta puede interpretar ese modelo no ambiguamente. Este direcciona el primer problema descrito fácilmente. b) El UML es un lenguaje para especificación En este contexto, especificación significa modelos de construcción que son precisos, no ambiguos y completos. En particular, el UML direcciona la especificación de todas las decisiones importantes de análisis, diseño e implementación que deben ser hechas para el desarrollo y estructuración de un sistema de software extenso. c) El UML es un lenguaje para construcción El UML no es lenguaje de programación visual, pero su modelo puede ser directamente conectado a una variedad de lenguajes de programación. Esto significa que es posible mapear de un modelo de UML a un lenguaje de programación tal como Java, C++, Visual Basic, o aún más, a tablas en una base de datos relacional el almacenamiento persistente de una base de datos orientada a objetos. Las cosas que son mejor expresados gráficamente son hechas en UML, mientras que los que son mejor expresados textualmente en el lenguaje de programación. Este mapeo permite avances de ingeniería: La generación de un código dentro de un lenguaje de programación. La inversa también es posible. La ingeniería inversa requiere de herramientas de soporte con intervención humana. En resumen, UML es suficientemente expresivo y no ambiguo para permitir la ejecución directa de los modelos la simulación de sistemas y la instrumentación de sistemas de ejecución. d) El UML es un lenguaje para documentación Una buena organización de software produce todos los tipos de componentes para el código ejecutable. Estos componentes incluyen (pero no están limitados): • Requerimientos • Arquitectura • Diseño • Código fuente • Planes del proyecto • Pruebas • Prototipos • Revisiones (Releases) Dependiendo de la cultura de desarrollo, alguno de estos componentes son más o menos formal que otros. Tales componentes no son solo la deliberación de un proyecto, son también indispensables para controlar, validar y comunicar un sistema antes de su desarrollo y después de su estructuración. El UML proporciona direcciona la documentación de una arquitectura de un sistema y todos sus detalles. También proporciona un lenguaje para requerimientos y preguntas. Finalmente, UML proporciona un lenguaje para modelar las actividades de planeación del proyecto y manejo de revisiones. 3. DÓNDE PUEDE SER USADO EL UML El UML es contemplado primeramente para sistemas de software intensivos. Este ha sido usado efectivamente campos como: • • • • • • • • • Sistemas de información de empresas Servicios de banco y financieros. Telecomunicaciones Transportación Defensa/aeroespacio Ventas Electrónica médico Científicos Servicios basados en Web UML no está limitado a modelado de software. De hecho este es suficiente expresivo para modelar sistemas de no software, tal como el diseño de hardware y sistemas para determinar la salud de un paciente. 4. UN MODELO CONCEPTUAL DEL UML Para entender UML necesitas formar un modelo conceptual del lenguaje y este requiere aprender tres elementos principalmente. Los bloques de construcción básicos, las reglas que dictan como esos bloques pueden ser combinados y algunos mecanismos que se aplican todo el tiempo en UML. a) Bloques de construcción de UML El vocabulario de UML que comprende tres tipos de bloques de construcción: Elementos (Cosas), Relaciones y Diagramas. i. Elementos: son las abstracciones que son ciudadanas de primera clase en un modelo, las relaciones ligan estos elementos entre sí; el grupo de diagramas comparte colecciones de estos elementos. Hay cuatro tipos de Elementos en UML: ª Elementos Estructurales: Los Elementos estructurales, son los sustantivos de los modelos de UML. Estos son en la mayoría partes estáticas de un modelo, representando elementos que o bien conceptuales o físicos. Hay siete tipos de elementos estructurales: Clases, interfaz, Colaboración, Caso de uso, Clases activas, Componente, nodo. ª Elementos de comportamiento(behavioral) Son las partes dinámicas de los modelos UML. Estos son los verbos de un modelo que rerpesentan la función sobre tiempo y espacio. De hecho, hay dos tipos principales de Elementos de comportamiento nombrados de interacción y máquina de estado. ª Elementos de Agrupamiento Son las partes de organización de los modelos UML. Estos son cajas dentro de las cuales un modelo puede ser descompuesto. Hay un tipo principal de Elementos de agrupamiento nombrados paquetes. ª Elementos de Anotacionales. Son las partes explicativas de los modelos de UML. Son los comentarios que se pueden aplicar para describir, iluminar y remarcar algunos elementos de un modelo. Hay un tipo principal de Elementos anotacionales llamado nota. ii. Relaciones: Se usan para escribir modelos bien formados, existen cuatro tipos de relaciones en UML: Dependencias, Asociación, Generalización, Realización. iii. Diagramas: Es la representación gráfica de un conjunto de elementos, más frecuentemente representados como una gráfica conectada de vértices(objetos) y arcos(relaciones). Los diagramas se utilizan para visualizar un sistema desde diferentes perspectivas. Así, un diagrama es una proyección de un sistema. Un diagrama representa un panorama de los elementos que integran un sistema. Los mismos elementos pueden aparecer en todos los diagramas, sólo en una parte de los diagramas o en ninguno(raramente sucede). En teoría un diagrama puede contener alguna combinación de objetos y relaciones. UML incluye nueve tipos de diagramas: • Diagramas de clases • Diagramas de objetos • Diagramas de casos de uso • Diagramas de secuencia • Diagramas de colaboración • Diagramas de estado • • • Diagramas de actividad Diagramas de componente Diagrama de estructuración(deployment) b) Reglas de UML Los bloques de construcción no pueden ser modelados a la vez en forma aleatoria. UML tiene un conjunto de reglas que un modelo bien formado debe contemplar. Un modelo bien formado es aquel que es semánticamente consistente en sí mismo y en armonía con sus modelos relacionados. UML tiene reglas de semántica para: • Nombres :Cómo llamar a los Elementos, relaciones y diagramas. • Alcance : El contexto que da un significado específico a un nombre. • Visibilidad. Cómo esos nombres pueden ser vistos y usados por otros. • Integridad: Cómo los Elementos se relacionan adecuadamente y consistentemente con otros • Ejecución: Qué significa correr y simular un modelo dinámico. Es común que un desarrollador construya no sólo modelos que son bien formados, sino también modelos que sean: • • • Omitidos(Elided): ciertos elementos son ocultos para simplificar Vista. Incompletos: Ciertos elementos pueden ser olvidados. Inconsistentes: La integridad de un modelo no es garantizada. Las reglas de UML te alientan, pero no forzan a direccionar los aspectos más importantes de análisis, diseño e implementación para que los modelos lleguen a ser bien formados con respecto al tiempo. c) Mecanismos comunes de UML UML cuenta con cuatro mecanismos comunes que se aplican consistentemente todo el tiempo en el lenguaje. • Especificaciones • • • 5. Adornos(Adornments) Divisiones comunes Mecanismos de extensibilidad. ARQUITECTURA DE SOFTWARE CON UML La visualización, especificación construcción y documentación de un sistema de software requiere que el sistema sea enfocado desde diferentes perspectivas. Diferentes personas - usuarios finales, analistas, desarrolladores, integradores del sistema, escritores técnicos y manejadores de proyectoscada uno aporta diferentes agendas a un proyecto y cada uno ve el sistema de diferentes formas, a diferente tiempo durante el ciclo de vida del proyecto. Una arquitectura del sistema es quizás el artefacto que puede ser usado para manejar los diferentes puntos y así controlar el desarrollo iterativo e incremental de un sistema durante su ciclo de vida. La arquitectura es el conjunto de decisiones significativas acerca de: • La organización de un sistema de software • La selección de los elementos estructurales y sus interfaces mediante las cuales se compone el sistema. • Sus funciones, especificada en la s colaboraciones entre estos elementos. • La composición de estos elementos estructural y funcionalmente para subsistemas progresivamente más largos. • El estilo de arquitectura que guía esta organización: los elementos estáticos y dinámicos sus interfaces, colaboraciones y composiciones. La arquitectura de software no sólo contempla la estructura y desempeño, sino también usos, funcionalidad, desempeño, elasticidad, reuso, compresibilidad, contratos económicos y tecnológicos y todo lo que concierne a estética. En la figura siguiente se ilustra como la arquitectura de un sistema de software puede ser descrito desde cuatro puntos de vistas, cada vista es una proyección dentro de la organización y estructura del sistema, enfocándose en general a aspectos de ese sistema. • Vista de caso de uso de un sistema enfoca los casos de uso que describe el desempeño del sistema tal como lo ven los usuarios finales, analistas y ensayistas. Existe para especificar las fuerzas que comparte la arquitectura de un sistema. En UML los aspectos estáticos dentro de este panorama son capturados en diagramas de caso de uso y los dinámicos en este panorama son capturados en diagramas de iteracción, de estado y de actividad. • Vista de diseño de un sistema abarca las clases, interfaces, y colaboraciones que forman el vocabulario del problema y su solución. Este panorama principalmente soporta los requerimientos funcionales del sistema, es decir, los servicios que el sistema debe proporcionar a sus usuarios. En UML el aspecto estático de este panorama es capturado en los diagramas de clases y los de objeto, el aspecto dinámico de este punto de vista son capturados en los diagramas de iteracción, diagramas de estado y de actividad. • Vista de proceso de un sistema enfoca los hilos de control y procesos que conforman los mecanismos de concurrencia y sincronización. Principalmente, direcciona el desempeño, escalabilidad y duración del sistema. • Vista de implementación de un sistema comprende los componentes y archivos que son usados para ensamblar y liberar el sistema físico. Este panorama direcciona principalmente el manejo de configuración de la liberación del sistema. con UML el aspecto estático de este panorama es capturado en diagramas de componentes; y el aspecto dinámico es capturado en los diagramas de interacción de estado y actividad. • 6. Vista de instalación(deployment) de un sistema comprende los nodos forman la topología de hardware del sistema dentro de las cuales el sistema se ejecuta. Direcciona principalmente la distribución, entrega e instalación de las partes que lleva a cabo el sistema físico. En UML el aspecto estático es capturado en los diagramas de estructura y el dinámico en los diagramas de interacción, estado y actividad. CICLO DE VIDA DEL DESARROLLO DEL SOFTWARE El UML es un proceso independiente, lo que significa que no requiere un ciclo de vida de desarrollo de software particular. Para obtener los mejores beneficios de UML se deben considerar un proceso que es: • Un manejado por casos de uso • Centrado en la arquitectura (enfocada a) • Iterativo e incremental Manejado por caso de uso significa que los casos de uso son usados principalmente como una herramienta para establecer el funcionamiento deseado del sistema, para verificación y validación de la arquitectura del sistema, prueba y comunicación entre las personas del proyecto. Un proceso iterativo es aquel que involucra el manejo de un flujo de liberaciones ejecutables. Un proceso incremental es aquel que involucra la integración continua de la arquitectura del sistema para producir esos releases. Con cada nuevo release se incluyen mejoras incrementales sobre el otro. Este manejo de caso de uso, centrado en arquitectura y los procesos iterativos incrementales pueden dividirse en fases. Una fase es la duración de tiempo dos cálculos del proceso, cuando un conjunto de objetivos es conocido, los artefactos son completados y las decisiones realizadas para llevar a cabo la próxima fase. Hay cuatro fases en el ciclo de vida del desarrollo del software: Conceptualización (inception), elaboración, construcción y transición. La conceptualización es la primera fase del proceso, cuando se tiene la idea para el desarrollo lleva al punto lo suficientemente bien fundamentado para garantizar por completo la fase de elaboración. La elaboración es cuando la visión del producto y su arquitectura son definidos. En este punto los requerimientos del sistema son articulados, prioritizados y referenciados. La construcción es la fase cuando el proceso de software que lleva a cabo la arquitectura ejecutable para que este lista para ser transportada al ambiente del usuario. Aquí también los requerimientos del sistema y su evaluación son constantemente reexaminados. La transición es la fase donde el software es turnado a las manos del usuario. Durante esta fase el sistema es continuamente mejorado. II. ESTRUCTURA DE UML 1. ELEMENTOS EN UML a) Elementos Estructurales: i. Clases.- Es una descripción de un conjunto de objetos que comparten los mismos atributos, operaciones, relaciones y semánticas. Una clase lleva a cabo una o más interfaces. Gráficamente, una clase es representada con un rectángulo, usualmente incluyendo su nombre, atributos y operaciones. Ejemplo: Identidad Persona ... Atributos ... Nombre Edad Operaciones void leerdatos(void) void verdatos(void) ii. Interfaz.- Es una colección de operaciones que especifican un servicio de una clase o componente. Así, una interfaz describe el desempeño externamente visible de ese objeto. Una interfaz puede representar el funcionamiento completo de una clase o componente o solo una parte de ese desempeño. Una interfaz define un conjunto de especificaciones, pero nunca un conjunto de implementaciones de operación. Gráficamente una interfaz se representa con un círculo junto con su nombre. Una interfaz raramente es única. Mejor dicho, esta es típicamente agregada a las clases o componentes que realizan la interfaz. Ejemplo: Nombre_Interfaz Información Segura iii. Colaboración.- Define una iteracción y es una sociedad de roles y otros elementos que trabajan a la vez para proporcionar algunas funciones cooperativas que son mayores que la suma de todos los elementos. Una clase dada puede participar en diversas colaboraciones. Estas colaboraciones representan la implementación de patrones que integran un sistema. Gráficamente, una colaboración se representa con una elipse líneas punteadas, usualmente incluyendo sólo su nombre. Ejemplo: Nombre Colaboración Cadena de Responsabilidad iv. Caso de uso.- Es una descripción de un conjunto de secuencias de acciones que un sistema desempeña para permitir un resultado de valor observable para un actor particular. Un caso de uso es usado para estructurar los elementos de comportamiento(behavioral) de un modelo. Gráficamente, un caso de uso se representa con una elipse de líneas sólidas, usualmente incluyendo sólo su nombre. Ejemplo: Nombre Caso de Uso Realizar Pedido v. Clases activas.- Es una clase cuyos objetos reconocen uno o más procesos o hilos y por lo tanto pueden iniciar una actividad de control. Una clase activa es semejante a una clase excepto que sus objetos representan elementos cuya función es concurrente con otros elementos. Gráficamente una clase activa se representa semejante a una clase pero con líneas más anchas, usualmente incluyendo su nombre, atributos y operaciones Ejemplo: Identidad Clase Activa Manejador de Eventos … Atributos Suspender( ) Activar( ) vi. Componente.- Es un una parte física y reemplazable Operaciones de un sistema que conforma y proporciona la realización de un conjunto de interfaces. En un sistema encontrarás diferentes tipos de componentes que son artefactos de procesos de desarrollo, tal como los archivos de código fuente. Un componente típicamente representa el empaquetado físico de diferentes elementos lógicos tal como clases, interfaces, y colaboraciones. Gráficamente, un componente es representado por un rectángulo con pestañas (tabuladores), usualmente incluyendo sólo su nombre. Ejemplo: Busqueda.cpp Nombre vii. Nodo.- Es un elemento físico que existe al tiempo de ejecución y representa un recurso computacional, generalmente tiene al menos una memoria y frecuentemente capacidad de procesamiento. Un conjunto de componentes puede residir en un nodo y puede también emigrar de un nodo a otro. Gráficamente un nodo es representado por un cubo incluyendo usualmente sólo su nombre Ejemplo: Server Nombre PV b) Elementos de comportamiento(behavioral) i. Interacción.- Es una función que comprende un conjunto de intercambio de mensajes entre un conjunto de objetos con un contexto particular para lograr un propósito específico. La función de una asociación de objetos o de una operación individual puede ser especificada con una interacción. Una interacción involucra un número de otros elementos incluyendo mensajes, secuencias de acción (la función invocada por un mensaje), ligas (la conexión entre objetos). Gráficamente un mensaje se representa con una línea dirigida incluyendo sólo el nombre de su operación. Visualizar ii. Máquina de Estados.- Es una función que especifica la secuencia de estados de un objeto o una interacción dada durante su tiempo de vida en respuesta a eventos, junto con las respuestas de esos eventos. La función de una clase individual o una colaboración de clases puede ser especificada con una máquina de estados. Una máquina de estados involucra otros elementos incluyendo estados, transiciones(el flujo de un estado a otro), eventos y actividades. Gráficamente un estado se representa con un rectángulo redondeado, incluyendo usualmente su nombre y sus subestados si hay alguno. Ejemplo: Nombre c) Esperando Elementos de Agrupamiento i. Paquetes.- Es un mecanismo de propósito general para la organización de elementos en grupos. Los Elementos estructurales, funcionales y aun los de agrupación pueden estar situados dentro de un paquete. A diferencia de los componentes (los cuales existen al tiempo de ejecución) un paquete es puramente conceptual (significa que existe durante el tiempo de desarrollo). Gráficamente un paquete se representa con un folder tabulado incluyendo usualmente su nombre y en ocasiones su contenido. Ejemplo: Nombre o elementos Reglas de Negocio d) Elementos Anotacionales i. Notas.- Es simplemente un símbolo para representar las limitaciones y comentarios asociados a un elemento o una colección de elementos. Gráficamente una nota se representa con un rectángulo con una esquina doblada, junto con un comentario textual o gráfico Ejemplo: Texto 2. Retornar copia así mismo RELACIONES EN UML a) Dependencias.- Es una relación semántica entre dos Elementos tal que un cambio en un thing (el independiente) puede afectar al otro(el dependiente). Gráficamente una dependencia se representa con una línea punteada posiblemente dirigida y ocasionalmente incluye una etiqueta. b) Asociación.- Es una relación estructural que describe un conjunto de ligas. Una liga es una conexión entre objetos. Gráficamente una asociación es representada con una línea sólida posiblemente dirigida, ocasionalmente incluye una etiqueta y frecuentemente contiene otros adornos tal como multiplicidad y nombres de roles. 0...1 Empresarios c) * Empleados Generalización.es una relación especialización/generalización en la cual los objetos del elemento especializado(el hijo) son sustituidos por elementos del elemento generalizado(el padre). De esta forma, el hijo comparte la estructura y función del padre. Gráficamente una relación de generalización es representada con una línea sólida con una flecha vacía hacia el padre. d) Realización.- Es una relación semántica entre clasificadores(classifiers) donde un clasificador especifica un contrato que otro clasificador garantiza llevar a cabo. Las relaciones de realización se encuentran en dos partes: entre interfaces y las clases componentes que las realizan y entre casos de uso y las colaboraciones que las realizan. Gráficamente una relación de realización se representa por un híbrido entre una relación de generalización y una de dependencia. 3. DIAGRAMAS EN UML a) Diagramas de clases.- Un diagrama de clases sirve para visualizar las relaciones entre las clases que involucran el sistema, las cuales pueden ser asociativas, de herencia, de uso y de contenido. Estos diagramas son los más comunes del modelado de sistemas orientados a objetos. Direccionan la vista de diseño estático del sistema. Un diagrama de clases esta compuesto por los siguientes elementos: • Clase: atributos, métodos y visibilidad. • Relaciones: Herencia, Composición, Agregación, Asociación y Uso. CLASES: En UML, una clase es representada por un rectángulo que posee tres divisiones: Contiene el nombre de la Clase Contiene los atributos (o variables de instancia) que caracterizan a la Clase (pueden ser private, protected o public). Contiene los métodos u operaciones, los cuales son la forma como interactúa el objeto con su entorno (dependiendo de la visibilidad: private, protected o public). Atributos: Son las características de una Clase y pueden ser de tres tipos, los que definen el grado de comunicación y visibilidad de ellos con el entorno, estos son: public (+, ): Indica que el atributo será visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados. private (-, ): Indica que el atributo sólo será accesible desde dentro de la clase (sólo sus métodos lo pueden accesar). ): Indica que el atributo no será protected (#, accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de las subclases que se deriven. Métodos: Los métodos u operaciones de una clase son la forma en como ésta interactúa con su entorno, éstos pueden tener las características: public (+, ): Indica que el método será visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados. private (-, ): Indica que el método sólo será accesible desde dentro de la clase (sólo otros métodos de la clase lo pueden accesar). ): Indica que el método no será protected (#, accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de métodos de las subclases que se deriven. RELACIONES ENTRE CLASES: En UML, la cardinalidad de las relaciones indica el grado y nivel de dependencia, se anotan en cada extremo de la relación y éstas pueden ser: • uno o muchos: 1..* (1..n) • 0 o muchos: 0..* (0..n) • número fijo: m (m denota el número). Herencia (Especialización/Generalización): Indica que una subclase hereda los métodos y atributos especificados por una Super Clase, por ende la Subclase además de poseer sus propios métodos y atributos, poseerá las características y atributos visibles de la Super Clase (public y protected). Ejemplo: Agregación: Para modelar objetos complejos, no bastan los tipos de datos básicos que proveen los lenguajes: enteros, reales y secuencias de caracteres. Cuando se requiere componer objetos que son instancias de clases definidas por el desarrollador de la aplicación, tenemos dos posibilidades: Por Valor: Es un tipo de relación estática, en donde el tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye. Este tipo de relación es comunmente llamada Composición (el Objeto base se construye a partir del objeto incluido, es decir, es "parte/todo"). Por Referencia: Es un tipo de relación dinámica, donde el tiempo de vida del objeto incluido independiente del que lo incluye. Este tipo relación es comunmente llamada Agregación objeto base utiliza al incluido para funcionamiento). • La composición (por Valor) se destaca por rombo relleno. • La agregación (por Referencia) se destaca por rombo transparente. • La flecha en este tipo de relación indica navegabilidad del objeto referenciado. Cuando existe este tipo de particularidad la flecha elimina. en es de (el su un un la no se Ejemplo: Un Almacen posee Clientes y Cuentas (los rombos van en el objeto que posee las referencias). Cuando se destruye el Objeto Almacen también son destruidos los objetos Cuenta asociados, en cambio no son afectados los objetos Cliente asociados. Asociación: La relación entre clases conocida como Asociación, permite asociar objetos que colaboran entre si. Cabe destacar que no es una relación fuerte, es decir, el tiempo de vida de un objeto no depende del otro. Ejemplo: Un cliente puede tener asociadas muchas Ordenes de Compra, en cambio una orden de compra solo puede tener asociado un cliente. Dependencia o Instanciación (uso): Representa un tipo de relación muy particular, en la que una clase es instanciada (su instanciación es dependiente de otro objeto/clase). Se denota por una flecha punteada. El uso más particular de este tipo de relación es para denotar la dependencia que tiene una clase de otra, como por ejemplo una aplicación grafica que instancia una ventana (la creación del Objeto Ventana esta condicionado a la instanciación proveniente desde el objeto Aplicacion): Cabe destacar que el objeto creado (en este caso la Ventana gráfica) no se almacena dentro del objeto que lo crea (en este caso la Aplicación). CASOS PARTICULARES: Clase Abstracta: Una clase abstracta se denota con el nombre de la clase y de los métodos con letra "itálica". Esto indica que la clase definida no puede ser instanciada pues posee métodos abstractos (aún no han sido definidos, es decir, sin implementación). La única forma de utilizarla es definiendo subclases, que implementan los métodos abstractos definidos. Clase parametrizada: Una clase parametrizada se denota con un subcuadro en el extremo superior de la clase, en donde se especifican los parámetros que deben ser pasados a la clase para que esta pueda ser instanciada. El ejemplo más típico es el caso de un Diccionario en donde una llave o palabra tiene asociado un significado, pero en este caso las llaves y elementos pueden ser genéricos. La genericidad puede venir dada de un Template (como en el caso de C++) o bien de alguna estructura predefinida (especialización a través de clases). Ejemplo aplicativo: Empresa 0..1 * Oficina * 0..1 Departamento Nombre : String * dirección : String telefono : Number * Director Miembro 1..* 1 OficinaPrincipal Persona nombre : Nombre IdEmpleado : Integer cargo : String ObtenerFoto : Foto() obtenerVoz() ObtenerInformacionDeContacto() ObtenerRegistrosPersonales() InformaciónDeContacto dirección : String Registro Personal IdTasas HistorialEmpleados Salario Iinformación Segura b) Diagramas de objetos.- Muestra un conjunto de objetos y relaciones. Representan instancias de los objetos encontrados dentro de diagramas de clase. Estos diagramas direccionan Vista de diseño estático o Vista de proceso estático de un sistema tal como los diagramas de clase pero desde la perspectiva de casos reales o prototípicos. Ejemplo: C:Compañia d1: Departamento d2: Departamento o1: Oficina Nombre : “Ventas” Nombre : “Compras” Dirección = “Av. Sur” Telefono = 919475 p1: Persona Nombre : “Franco” IdEmpleado = 254 Cargo = “Gerente” c) I1: InformaciónDeContacto dirección : “Cono Sur este s/n” Diagramas de casos de uso.- Muestra un conjunto de casos de uso y actores (un tipo especial de clases) y sus relaciones. El diagrama de casos de uso representa la forma en como un Cliente (Actor) opera con el sistema en desarrollo, además de la forma, tipo y orden en como los elementos interactúan (operaciones o casos de uso). Un diagrama de caso direcciona la vista de caso de uso estática de un sistema. Un diagrama de casos de uso consta de los siguientes elementos: • Actor. • Casos de Uso. • Relaciones de Uso, Herencia y Comunicación. ELEMENTOS Actor: Es un rol que un usuario juega con respecto al sistema. Es importante destacar el uso de la palabra rol, pues con esto se especifica que un Actor no necesariamente representa a una persona en particular, sino más bien la labor que realiza frente al sistema. Se tiene los siguientes tipos de actores: • • • • Principales: personas que usan el sistema Secundarios: personas que mantienen o administran el sistema Material externo: dispositivos materiales imprescindibles que forman parte del ámbito de la aplicación y deben ser utilizados Otros sistemas: sistemas con los que el sistema interactúa Caso de Uso: Es una operación/tarea específica que se realiza tras una orden de algún agente externo, sea desde una petición de un actor o bien desde la invocación desde otro caso de uso. Relaciones de Uso, Herencia y Comunicación: Asociación Es el tipo de relación más básica que indica la invocación desde un actor o caso de uso a otra operación (caso de uso). Dicha relación se denota con una flecha simple. Dependencia o Instanciación Es una forma muy particular de relación entre clases, en la cual una clase depende de otra, es decir, se instancia (se crea). Dicha relación se denota con una flecha punteada. Generalización Este tipo de relación es uno de los más utilizados, cumple una doble función dependiendo de su estereotipo, que puede ser de Uso (<<uses>>) o de Herencia (<<extends>>). Este tipo de relación esta orientado exclusivamente para casos de uso (y no para actores). extends: Se recomienda utilizar cuando un caso de uso es similar a otro (características). uses: Se recomienda utilizar cuando se tiene un conjunto de características que son similares en más de un caso de uso y no se desea mantener copiada la descripción de la característica. De lo anterior cabe mencionar que tiene el mismo paradigma en diseño y modelamiento de clases, en donde esta la duda clásica de usar o heredar. Ejemplo: El caso de una Máquina Recicladora: Sistema que controla una máquina de reciclamiento de botellas, tarros y jabas. El sistema debe controlar y/o aceptar: • Registrar el número de ítems ingresados. • Imprimir un recibo cuando el usuario lo solicita: a. Describe lo depositado b. El valor de cada item c. Total • El usuario/cliente presiona el botón de comienzo • Existe un operador que desea saber lo siguiente: a. Cuantos ítems han sido retornados en el día. b. Al final de cada día el operador solicita un resumen de todo lo depositado en el día. • El operador debe además poder cambiar: a. Información asociada a ítems. b. Dar una alarma en el caso de que: i. Item se atora. ii. No hay más papel. Como una primera aproximación identificamos a los actores que interactúan con el sistema: Luego, tenem os que un Cliente puede Deposi tar Items y un Operad Sistema de Máquina de Reciclaje or puede cambia r la inform ación de un Item o bien puede Imprim ir un inform e: Además, podemos notar que un item puede ser una Botella, un Tarro o una Jaba. Otro aspecto es la impresión de comprobantes, que puede ser realizada después de depositar algún item por un cliente o bien puede ser realizada a petición de un operador. Entonces, el diseño completo del diagrama Use Case es: IV PROGRAMACIÓN ORIENTADA A OBJETOS 1. DEFINICIÓN DE BOOCH: La POO es el método de implementación en el que los programas se organizan como colecciones cooperativas de objetos, cada uno de los cuales representa un ejemplar de una clase y cuyas clases son miembros de una jerarquía de clases unidas mediante relaciones de herencia. Conclusiones: • La unidad lógica de programación es el objeto. • Los objetos tienen relaciones. • Existen clases que agrupan conceptualmente los objetos. • Las clases pertenecen a una jerarquía (son las clases las que heredan y no los objetos). Objeto: Entidad que contiene los atributos que describen el estado de un objeto del mundo real y las acciones que se asocian con el objeto del mundo real. Un objeto es designado con un nombre o un identificador. OBJETO = DATOS + OPERACIONES Los datos deberían estar ocultos en el objeto, y las operaciones serían el interface del objeto con el exterior, pero estas operaciones están encapsuladas en "cajas negras". Notación: Taylor Yourdon/Coad Nombre Atributos Métodos Booch Booch Métodos y mensajes Los objetos se comunican mediante llamadas a funciones_miembro o métodos: se dice entonces que "un objeto envía un mensaje a otro objeto". El mensaje es la acción realizada por un objeto mediante la cual se invoca un método. Componentes del mensaje: • Nombre del receptor del mensaje • Método invocado • Información necesaria para la ejecución del método Resumiendo, mensaje es la activación de un objeto. El conjunto de mensajes que puede recibir un objeto se conoce como protocolo de un objeto. Clases Una clase es la descripción de un conjunto de objetos. Consta de métodos y datos que resumen las características comunes de un conjunto de objetos. Muestra el comportamiento general de un grupo de objetos. DISTINTOS OBJETOS = DISTINTAS CLASES Un objeto se crea mediante el envío de un mensaje de construcción a la clase. Análogamente para la destrucción del objeto, la clase recibe un mensaje de destrucción. Un programa orientado a objetos se resume en 3 sucesos: 1) Creación de objetos cuando se necesitan, mediante un mensaje de construcción a la clase. 2) Intercambio de mensajes entre objetos o entre usuario de objeto y objeto (diferencia fundamental entre lenguajes POO puros e híbridos). 3) Eliminar objetos cuando no se necesitan, mediante un mensaje de destrucción a la clase. Identificación de clases Partiendo del enunciado de un problema: 1) Todos los nombres del enunciado son objetos a tener en cuenta. • Cosas tangibles ("coche") • Roles o papeles ("empleado") • Organizaciones ("empresa") • Incidentes o sucesos ("liquidación") • Interacciones o relaciones ("pedido") 2) Los atributos son las características individuales de cada objeto, que serán extraídos de los adjetivos y complementos del verbo que haya en el enunciado. 3) Los métodos serán los verbos del enunciado. Tipos de método: • Constructor • Destructor • Modificadores del estado • Selectores (obtienen el estado del objeto: "visualizar") • Mezcladores (ej. "sumar 2 números complejos") • Cálculos o procesamientos Herencia Herencia es la capacidad de un objeto (clase) para utilizar las estructuras y los métodos existentes en antepasados o ascendientes. Es la reutilización de código desarrollado anteriormente. Cuando usamos herencia decimos que hacemos programación por herencia: Definición de nuevos tipos a partir de otros con los que comparten algún tipo de característica. Tipos de herencia Herencia simple: un tipo derivado se crea a partir de una única clase base. Figura Rectángulo Triángulo Herencia múltiple: una clase tienen más de una ascendiente inmediato. Persona Profesor Investigador Profesor universitario • • La herencia múltiple puede plantear 2 tipos de problema: La herencia repetida: ej.: "profesor universitario hereda 2 veces los atributos de persona" Produce ambigüedad respecto a los atributos o los métodos. En la clase base pueden haber atributos que se llamen igual. EscalaResolución- -Escala Sonido Gráficos -Resolución Multimedia Sólo 2 lenguajes incorporan herencia múltiple: Eiffel y C++ Características de la herencia • Anulación o sustitución: cuando redefino un método heredado en la subclase, se dice que estoy anulando o sustituyendo dicho método. Sería deseable una "herencia selectiva": seleccionar lo que se requiere heredar es la mejor forma de anulación. • Sobrecarga: Propiedad que puede darse también sin herencia. Es designar varios elementos (identificadores) con el mismo nombre. No es anulación. • Polimorfismo (sobrecarga con anulación) es la forma de invocar a distintos métodos utilizando el mismo elemento de programa. Polimorfismo Polimorfismo es invocar métodos distintos con el mismo mensaje (ligadura en tiempo de ejecución). Para ello es necesaria una jerarquía de herencia: una clase base que contenga un método polimórfico, que es redefinido en las clases derivadas (no anulado). Se permite que los métodos de los hijos puedan ser invocados mediante un mensaje que se envía al padre. Este tipo de clase que se usa para implementar el polimorfismo se conoce como clase abstracta. Objetos Compuestos Los objetos pueden contener a su vez objetos de otras clases dentro de sí (esto es lo que da la potencia a la POO). El contenido la mayoría de las veces no es el objeto en sí, sino una referencia (puntero) al objeto; con la ventaja de que el objeto contenido puede cambiar de contenido o posición sin afectar al objeto que contiene. El objeto contenido puede, además, estar en varios objetos a la vez. Al mismo tiempo que se crea un objeto, se crean los objetos que contiene. Lenguajes de POO SIMULA Se considera que SIMULA es el primer Lenguaje de Programación Orientado a Objetos (en adelante LPOO), fue diseñado por Kristen Nygaard y Ole Johan Dhal, del Norwegan Computer Center (NCC). Se concibió para el desarrollo de simulaciones de procesos industriales y científicos, pero llegó a considerarse apto para desarrollar grandes aplicaciones. La ya • • • • • • versión SIMULA_67 tenía características de ALGOL_60, y era casi un LPOO, con estas características: Concepto de objeto (datos + operaciones) Comunicación entre objetos (proceso de simulación) Concepto de clase (estructura que agrupa el comportamiento y características de varios objetos) Concepto de herencia (heredar datos y métodos) Fuertemente tipificado (comprobación de tipos en tiempo de compilación) Concepto de ligadura dinámica "polimorfismo" (tener interfaces idénticos para activar diferentes propiedades. Smalltalk Más tarde surge el primer LPOO en sentido estricto: Smalltalk_80, diseñado por Alan Kay y Adele Goldberg, de la XEROX PARC. Además de ser considerado como primer LPOO es el más puro (sólo tiene objetos, NO ES programación estructurada) Extensiones de Lenguajes Convencionales C++ [1986] Diseñado por Stroustrup, es un LPOO híbrido basado en C y Smalltalk. Ha tenido mucho éxito. Objetive C [1986] Es una extensión de C. Hoy está en desuso. Surge para las plataformas NeXT y fracasó junto a las máquinas NeXT. Object Pascal [1987] Extensión de Pascal, lo popularizó Borland con Turbo Pascal 5.5 Object COBOL [1992-3] Extensión de COBOL, nuevo LPOO que parece haber tenido aceptación. Delphi [1995] Proviene de Object Pascal, creado por Borland. Extensiones de Lenguajes Funcionales PROLOG++ CLOS Common Lisp orientado a objetos Lenguajes fuertemente tipificados Ada_95 Ada_83 ya era casi un LPOO. Ada_95 sólo añade herencia y ligadura dinámica. Eiffel [1988] Diseñado por Beltran Meyer, está aún en desarrollo. Clasificación de Wegner de 1987 I. Lenguajes Basados en Objetos (LBO) Son aquellos en los que la sintaxis y semántica del lenguaje soporta la creación de objetos. Ejemplos: Ada_83, Clipper 5.x, VisualBasic. II. Lenguajes Basados en Clases (LBC) Son LBO con capacidad de crear clases. Ejemplo: CLU III. Lenguajes Orientados a Objetos (LOO) Son LBC con capacidad de herencia. Ejemplos: C++, Object Pascal, etc... Características de un LPOO Tipificación fuerte: comprobación de tipos en tiempo de compilación. Hay una excepción: Smalltalk. 1) Ocultación: de las características de los objetos. 2) Compilación Incremental: compilación separada. 3) Genericidad: reutilización de código. 4) Paso de mensajes. 5) Polimorfismo: basado en la ligadura dinámica. 6) Excepciones: sistema seguro. 7) Concurrencia: "el mundo real es concurrente". 8) Datos compartidos: entre varios objetos. LPOO Puros vs. Híbridos Ventajas Puros • Más potencia. • Flexibilidad para modificar el lenguaje. • Más fácil de asimilar (enseñar). Híbridos • Más rápido. • Más fácil el paso de programación estruc-turada a POO. • Implementación de operacionesalgoritmos fundamentales más sencilla. Inconvenientes • Más lento. • Trabaja con 2 • Implementación de paradigmas a la operacionesvez. algoritmos • Modificar el lenguaje es difícil. fundamentales muy complicada. Ada_95 Incorpora 2 nuevas características a Ada_83: • Herencia • Polimorfismo Smalltalk_80 Características • Todas las entidades que maneja Smalltalk son objetos. • Todas las clases derivan de una clase base llamada Object. • Existe herencia simple. • Usa métodos y paso de mensajes. • Tiene una tipificación débil: la comprobación de los tipos se hace en tiempo de ejecución. • Soporta concurrencia, pero pobre. • Se comercializa con un conjunto de bibliotecas de clases predefinidas, agrupadas en categorías o jerarquías (E/S, etc...) • Existe una versión, Smalltalk V para computadoras IBM. • C++ y CLOS se han apoyado en características de Smalltalk. Eiffel Es un lenguaje inspirado en SIMULA con características añadidas de Smalltalk y Ada. Se destina a aplicaciones de bases de datos e inteligencia artificial. Por su diseño, es bueno para la ingeniería de software. Características • Fuertemente tipificado. • Clases. • Genericidad. • Herencia múltiple. • Ligadura dinámica y polimorfismo. • Se ha empezado a implementar concurrencia y persistencia de objetos. • Proporciona una biblioteca de clases predefinidas: Estructuras de datos, E/S, E/S XWindow. La memoria dinámica es gestionada por el entorno y no por el sistema operativo: incorpora recogida automática de basura. El entorno tiene editor, y Browser, que muestra las clases y jerarquías. El entorno proporciona recompilación automática. Contrato entre proveedor y usuario de clases Para que un método pueda ser ejecutado debe haber: • • • Una precondición Una postcondición Una invariante Hay un contrato entre el proveedor (creador) de la clase y el cliente (usuario): el proveedor asegura que la invariante se cumple y que al finalizar la ejecución del método la postcondición se cumplirá; pero sólo siempre y cuando la otra parte (el usuario) cumpla la precondición. REFERENCIAS BIBLIOGRÁFICAS James; JACOBSON, Ivar; BOOCH, Grady: El Lenguaje Unificado de Modelado: Manual de Referencia. RUMBAUGH, James; JACOBSON, Ivar; BOOCH, Grady: El Proceso Unificado de Desarrollo del Software. LARMAN, Craig: UML y patrones: Introducción al análisis y diseño orientado a objetos.