Mapeo de relaciones entre clases en un diagrama UML y Java Nora Blet

Documentos relacionados
Elementos Diagramas de Clases Clase:

Derechos de Acceso: COMPOSICION

Capítulo 16. Diagrama de Clases UML

UML Unifield Modeling Languaje

Contenido. 1. El proceso 2. Los modelos 3. Los diagramas 4. Ejemplo

Prof. Mariano Mancuso. Sistemas de información y control diagrama de clases

Principios de Computadoras II

Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2007/08

CLA. Diagramas de clases en Métrica V3

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Diagramas De Casos De Uso

Diseño. Diseño. Interacción. Aspectos comunes en interacción. Diagramas de Interacción. Curso de Arquitecturas de Software

Diagramas de Clase en UML 1.1

Introducción a la Orientación a Objetos

Universidad Salesiana de Bolivia

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Los diagramas de clases y de objetos sirven para modelar diversos aspectos estructurales o estáticos de un sistema: Modelado - Vocabulario del Sistema

PROGRAMACION ORIENTADA A OBJETOS EN C++

2.2 Nombres, Ligado y Ámbito

Guía práctica de estudio 04: Clases y objetos

Programación Orientada a Objetos con Java. Elementos Básicos del Lenguaje Java. Relación entre clases. Ejemplo de Clase: Punto !

Tutorial de C# Delegados y Eventos. Por: Óscar López, M.Sc.

HERENCIA Y TIPOS. Articulo. Video Audio Altavoces. Amplificador

Lenguaje de Modelamiento Unificado.

Capítulos 2 y 5: Modelación con UML y Modelo Objeto

CIDE, SA. RIF: J NIT: MODELO FUNCIONAL

Universidad de Cantabria

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Conceptos de Programación Orientada a Objetos

Java Inicial (20 horas)

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

Diseño Basado en Componentes. Curso 2008 / 09

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

DIAGRAMAS UML ANDRÉS ESTEBAN MARTÍNEZ HUTA CICLO DE VIDA DEL SOFTWARE GLORIA CECILIA RÍOS MUÑOZ

Diagramas de secuencia

UNIVERSIDAD AUTÓNOMA DE CHIAPAS LICENCIATURA EN SISTEMAS COMPUTACIONALES

DIAGRAMAS DE UML DIAGRAMAS DE CASO DE USO

Curso de Java POO: Programación orientada a objetos

1. Preparar al estudiante para desarrollar aplicaciones de software utilizando un enfoque orientado a objetos.

Interfaces y Clases Internas. ELO329: Diseño y Programación Orientados a Objetos

Tema 7.- Fundamentos de la Programación Orientada a Objetos

TEMA 2 Introducción a C# ANÁLISIS Y DESARROLLO DE APLICACIONES INFORMÁTICAS Curso 2010/2011

CLASES QUE UTILIZAN OBJETOS. RELACIÓN DE USO ENTRE CLASES JAVA. CONCEPTO DE DIAGRAMA DE CLASES. (CU00641B)

Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Enfoque de Desarrollo de software OO

TEMA 4. PROCESO UNIFICADO

UML: INTRODUCCIÓN, ORIENTACIÓN a Objetos

INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)

Programación Avanzada. Diseño Diagramas de Comunicación

FUNDAMENTOS DE INFORMÁTICA

Programación Orientada a Objetos en Java

Relaciones entre clases: Diagramas de clases UML

Definición y Conversión de datos. Agustín J. González ELO-329

Curso de Java POO: Programación orientada a objetos

UML (Lenguaje de Modelado Unificado) y Diagramas de Casos de Uso

20483 Programación en C#

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Java en 3 horas. Ampliación de Sistemas Operativos. Rodrigo Santamaría

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

15. Parámetros o argumentos

TEMA 8: Gestión dinámica de memoria

Tema 3. Programación orientada a objetos en Java (Parte 1)

Sistemas de Bases de Datos I. Modelo Conceptual. Modelo Entidad Relación

- Compilar y ejecutar programas en Java - Estructura básica de una clase - El comando javac - El comando java - Introducción al IDE de desarrollo

Programación Orientada a Objetos (POO)

Introducción a la programación orientada a objetos

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Aplicaciones de Escritorio

Tema: Arreglos de Objetos en C++.

INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

Introducción. Herencia y Polimorfismo. Ejemplos (I) Ejemplos (II) Control de Acceso. Herencia

Tema: Clases y Objetos en C#. Parte II.

Java en 2 horas. Rodrigo Santamaría

BASES DE DATOS TEMA 2 MODELOS DE DATOS

Objeto Clase Atributo / Método Encapsulamiento Mensaje Herencia Polimorfismo Encadenamiento Dinámico

Unidad Nº V Listas Enlazadas

PROGRAMACIÓN ORIENTADA A OBJETOS CON JAVA

Parte I: Elementos del lenguaje Ada

Forma Básica Clase Java

Metodologías en la Ingeniería del Software Métodos Orientados a Objetos

PROGRAMACIÓN EN C#.NET Programación Orientada a Objetos en C# Ing. Bruno López Takeyas

16. Herencia Definición de herencia. 168 A. García-Beltrán y J.M. Arranz

Curso Introducción JAVA Pág.: 1

Programación Orientada a Objetos

INTRODUCCIÓN al Lenguaje de Modelado Unificado

Base de Datos. Docente: Ing. Francisco Rodríguez BASE DATOS. Resultados. Internet. Requerimientos

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Herencia. Hay clases que comparten gran parte de sus características.

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Clases abstractas e interfaces

Una Clase: define un grupo de objetos que tienen propiedades similares y se comportan de manera similar.

Programa de actualización profesional ACTI.NET Desarrollo de aplicaciones locales y web con tecnología VB.NET

Se utiliza para representar los tipos de objetos dentro del sistema (proceso) y las diversas relaciones estáticas que existen entre ellos

PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

Modulo 11. Clases y Objetos en Java

Transcripción:

Mapeo de relaciones entre clases en un diagrama UML y Java Nora Blet En UML se define la relación como una conexión semántica entre elementos del modelo. Este concepto engloba diversos tipos de relaciones, tales como asociación, generalización y distintas formas de dependencia. La expresión conexión semántica suele ser particularmente oscura para quien se adentra en el mundo del modelado. Semántica es la parte de la lingüística que estudia el significado de las palabras, de modo que esta expresión podría traducirse como conexión significativa, aunque esto no acaba de aclarar la vaguedad de la misma. El concepto de relación no se entiende hasta que no se profundiza en el significado de cada uno de los distintos tipos de relaciones, es decir, qué propiedades tienen y cómo se usan para construir los modelos. En la figura siguiente pueden observarse las tres relaciones básicas entre clases en un diagrama UML. Asociación binaria Una asociación se define como una relación semántica entre dos o más clases (aquí se consideran sólo entre dos clases) que especifica conexiones entre las instancias de estas clases. En orientación a objetos, el comportamiento de un sistema se define en términos de interacciones entre objetos, es decir, intercambios de mensajes. Enviar un mensaje habitualmente resulta en la invocación de una operación en el receptor. Las asociaciones son necesarias para la comunicación, ya que los mensajes son enviados a través de las asociaciones; sin asociaciones, los objetos quedarían aislados, incapaces de interactuar. Los lenguajes que soportan programación orientada a objetos permiten expresar muy bien las relaciones de generalización e implementación pero, no tienen ninguna sintaxis o semántica para hacerlo con las asociaciones contextuales, en forma directa. Por tanto, éstas deben implementarse mediante una adecuada combinación de clases, atributos y métodos. La idea más simple es proveer un atributo para almacenar los enlaces de la asociación, métodos de acceso-modificación para manipularlos y aquéllos necesarios para controlar las restricciones impuestas por la asociación. Sería conveniente agrupar estos métodos y atributos de alguna forma para identificar más fácilmente, dentro de la clase, qué pertenece al control de la asociación y qué a los atributos y métodos propios de la clase. Esta idea, sin embargo, proporciona una implementación muy incompleta ya que no garantiza automáticamente el cumplimiento de las propiedades de la asociación. El

número de las consideraciones que el programador debe tener en cuenta al escribir el código ligado a las asociaciones, es tan grande que continuamente corre el riesgo de olvidar algún detalle esencial, especialmente cuando se trata de asociaciones con multiplicidad mayor a 1 o asociaciones bidireccionales. En la siguiente figura se ilustran ejemplos de asociación unidireccional (a) y bidireccional (b). La asociación Llave- Puerta es unidireccional: una llave puede acceder a la puerta que abre pero una instancia de Puerta no conoce el conjunto de instancias de Llave que la abren. En la figura que sigue, para el caso (a), en el extremo B, si x es 0 o 1, (si la multiplicidad es 0 se dice que la asociación es opcional y si es 1, se dice que es obligatoria), se añade una variable de instancia de tipo B (en el caso de asociación obligatoria hay que asegurarse que sea distinta de null) en el código de la clase A y si la multiplicidad del lado B es de tipo 0 * se añade una variable de instancia de tipo CollectionOfB en el código de la clase A. La clase contenedora o colección CollectionOfB implementan java.uti.list o java.util.set. En el caso general (multiplicidad: *) no se puede utilizar arrays de objetos, debido a que tienen un tamaño fijo desde el momento de su creación. Se debe añadir, entre otros, dos clases de métodos modificadores: uno para añadir y otro para eliminar objetos, ambos con parámetros que sean referencias a un objeto único o referencias a colecciones enteras.

Una asociación bidireccional introduce una dependencia mutua: actualizar una clase implica actualizar la otra. Para asegurar la integridad de la relación bidireccional los métodos de actualización, deberán mantener siempre la asociación en ambas direcciones. Ejemplo de asociación con multiplicidad no acotada: El uso de una referencia de tipo java.util.vector, no permite identificar el tipo de objetos contenidos en el mismo, lo cual impide saber con qué clase existe una asociación, mirando el código.

Ejemplo de asociación con multiplicidad entre a b, con: (a) caso b distinto de * y (b) caso a mayor a 0. Ejemplo de asociación con multiplicidad uno a uno: (relación entre un publicista y una cuenta publicitaria, de la cual es propietario) Advertiser 1 1 1 Account public class Advertiser { / * El campo account es inicializado en el * constructor y nunca modificado */ private Account account; public Advertiser ( ) { account = new Account (this); public Account getaccount ( ) { return account; public class Account { / * El campo owner es inicializado * en el constructor y nunca modificado*/ private Advertiser owner; public Account(Advertiser owner ) { this.owner = owner; public Advertiser getowner ( ) { return owner;

Ejemplo de asociación unidireccional con multiplicidad mayor a uno: Advertiser 1 * Account public class Advertiser { private Set accounts; private Account account; public Advertiser ( ) { accounts = new HashSet ( ); public void addaccount ( Account a ){ accounts.add (a); a.setowner (this); public void removeaccount (Account a){ accounts.remove (a); a.setowner (null); public class Account { private Advertiser owner; public void setowner (Advertiser newowner) { if (owner!= newowner) { Advertiser old = owner; owner = newowner; if (newowner!= null) newowner.addaccount (this); if (oldowner!= null ) oldowner.removeaccount(this); Ejemplo de asociaciones múltiples entre dos clases:

En este ejemplo al haber dos asociaciones bidireccionales entre Persona y Compañía, existe una ambigüedad en la traducción UML-Java, ya que en lugar de hacer corresponder empleado-empleador y acción-accionista podría hacerlo erróneamente entre empleador-accionista y entre empleado-acción. Este mismo problema aparece cuando se tienen dos atributos definidos en una misma clase y en la otra aparece sólo uno: No se puede saber si existen dos asociaciones y sólo una es bidireccional o y si existen tres asociaciones unidireccionales y ninguna bidireccional. En caso que el nombre de los atributos en Java coincidan con los nombres de roles UML o de asociaciones, la ambigüedad deja de existir, por lo que el problema se resuelve si se tiene un modelo UML de referencia. Dependencia Es el concepto con definición más vaga e imprecisa de UML. Es una forma de asociación que especifica algún tipo de dependencia entre dos clases, donde un cambio en la clase de la cual se depende puede afectar a la clase dependiente, pero no necesariamente a la inversa. En UML se representa como una asociación pero, en lugar de usar una línea sólida se utiliza una línea punteada. Puede agregarse una flecha para indicar dependencia asimétrica. La forma más común de dependencia es la conexión entre una clase que usa referencias a objetos de otra clase como parámetros de un método de la misma. En la siguiente figura se observa un conjunto de clases extraídas de un sistema que maneja la asignación de estudiantes y profesores a cursos en una universidad. La figura muestra la dependencia de la clase CourseSchedule (planificación de cursos) con respecto a Course, debido a que Course se usa como argumento en los métodos add y remove de CourseSchedule. Si en el diagrama de clases se suministra la signatura completa de un método, como en el caso de la figura, no es necesario indicar la relación de dependencia puesto que, el uso de una clase por otra está implícito en la signatura.

También es común encontrar una relación de dependencia entre dos clases Java, donde en una de ella se utilizan variables locales (o campos) que son referencias a objetos de la clase de la cual se depende, además de aquellos casos donde se referencia a un método static de otra clase o, en métodos que retornan referencias a objetos de otras clases. Otro ejemplo: Clases de asociación Una clase de asociación se caracteriza por ser a la vez una asociación y una clase, lo que permite añadir atributos y operaciones a la asociación. En Java, al igual que las asociaciones, no es posible implementar una clase de asociación como tal. Las asociaciones con multiplicidad mayor a uno indican que una clase fuente está conectada a muchas instancias de una clase objetivo pero el diagrama de clases UML no muestra qué clase de contenedores se usan para representar dicha asociación. En la figura, se muestra un ejemplo del uso de una clase de asociación. En el diagrama de clases UML aparece una clase normal conectada a una clase de asociación mediante una línea punteada. Un programador Java interpreta que la clase fuente en realidad contiene una referencia a la clase de asociación, que a su vez contiene referencias a objetos de la clase objetivo. (en este caso Addres tiene una referencia a un Vector de String donde cada una de los String del mismo, representa una línea con una de las posibles direcciones postales de una persona).

Otro ejemplo: Se usa clase de asociación para representar la compra (purchase) de un libro (Book) por un comprador (Customer). public class Book extends Object { // Data attributes private String title; // Association attributes public purchase purchaseofcust; // Default constructor public Book() { // Start user code section // End user code section // default constructor Book // Methods // Do not delete this line -- regeneration end marker // Attribute accessors public String gettitle() { return title; public void settitle(string title_) { title = title_; // Association accessors public purchase getpurchaseofcust() { return purchaseofcust; // class Book public class Customer extends Object { // Data attributes private String name; // Association attributes public Vector purchaseofbookset; // Default constructor

public Customer() { purchaseofbookset = new Vector(); // Start user code section // End user code section // default constructor Customer // Methods // Do not delete this line -- regeneration end marker // Attribute accessors public String getname() { return name; public void setname(string name_) { name = name_; // Association accessors public Vector getpurchaseofbookset() { return purchaseofbookset; // class Customer public class purchase extends Object { // Data attributes private String date; // Association attributes public Customer cust; public Book book; // Default constructor public purchase(customer cust_, Book book_) { cust = cust_; book = book_; cust.purchaseofbookset.addelement(this); book.purchaseofcust = this; // Start user code section // End user code section // default constructor purchase // Methods // Do not delete this line -- regeneration end marker // Attribute accessors public String getdate() { return date; public void setdate(string date_) { date = date_; // Association accessors public Customer getcust() { return cust; public Book getbook() { return book; // class purchase

Como puede observarse, no es posible diferenciar la implementación Java de una clase de asociación de la obtenida al implementar asociaciones normales. No puede asegurarse que es una clase de asociación y no dos asociaciones binarias entre dos clases. Calificadores de una asociación Son utilizados cuando la asociación es implementada a través de algún tipo de clave o índice, (por ejemplo, cuando se accede al objeto real que está al otro lado de la asociación, mediante un índice de un diccionario, tabla o base de datos) en lugar de hacerlo mediante una referencia Java normal. Ejemplo: Para un determinado estudiante y un dado nombre de examen, se puede acceder al puntaje alcanzado por el estudiante en dicho examen. Para implementar la asociación podría utilizarse un diccionario (Por ejemplo usando HashTable, definida en Java): class Student { HashTable scores;. Otro ejemplo: public class Customer { // atributos de los datos private String name; // atributos de la asociación public Hashtable bookset; // Default constructor public Customer() { bookset = new Hashtable(); // //...

// métodos de acceso a los atributos public String getname() { return name; public void setname(string name_) { name = name_; // métodos de acceso para la asociación public Vector getbookset(string bookid_) { Object object = bookset.get(bookid_); if (object!= null) return ((Vector) object); return null; public void addbook(string bookid_, Book book_) { if (book_ == null) return; // si la asociación cualificada tiene multiplicidad mayor a // 1 debe suministrar métodos hashcode y equals para // bookid (cualificador) para el uso de java.util.hashtable. Vector vector = (Vector) bookset.get(bookid_); if (vector == null) { vector = new Vector(); bookset.put(bookid_, vector); vector.addelement(book_); public void removebook(string bookid_, Book book_) { if (book_ == null) return; Vector vector = (Vector) bookset.get(bookid_); if (vector!= null) vector.removeelement(book_); // class Customer Agregación Es una forma especial de asociación asimétrica que connota una relación todo/parte (o entre todo (también llamado agregado ) y parte se da una relación de tipo tiene un/una ); donde el todo está a un nivel conceptualmente superior a la parte, a diferencia de la asociación, en que ambas clases están al mismo nivel conceptual. Ejemplo: Auto y conductor class Car { Driver driver; public setdriver( Driver driver) { this.driver = driver; driver.drive( this ) ; class Driver { Car car; public drive(car car) { this.car = car;

Puede notarse que la implementación es indistinguible de aquélla de la asociación. En el libro de Robert Martin no se recomienda su uso para el caso de implementar las clases en Java. Composición Es una forma asociación simétrica que connota una relación todo/parte en la cual la remoción del conjunto (también llamado compuesto ) implica la eliminación (si es la decisión del todo ) de las partes componentes y en la cual la parte puede pertenecer a un solo conjunto a la vez (aunque el todo puede transferir la propiedad de la parte a otro objeto, el cual pasará a ser responsable de su tiempo de vida). Ejemplo: Auto y Motor class Car { private Engine engine = New Engine( this ) ; class Engine { Car car = null ; public Engine(Car car) { this.car = car; Nuevamente, al igual que para la relación de agregación, la implementación, es indistinguible de la asociación, aún cuando en UML representan conceptos diferentes, por tanto, cualquier tipo de representación sufrirá de una pérdida de información e introduce una discontinuidad entre diseño e implementación. En el proyecto de fin de carrera de Belén Criado Sánchez se afirma que la diferencia entre composición es a menudo un asunto de gusto más que una diferencia semántica y que la composición expresa que las partes están físicamente contenidas en el todo y que esto es imposible de implementar en Java puesto que los atributos de una clase son sólo referencias o punteros a objetos de otra clase, nunca es un valor contenido físicamente. En Java la destrucción de objetos ocurre entre bastidores a cargo del recolector de basura (garbage collector), de forma tal que, muy rara vez se maneja el tiempo de vida de un objeto; esta es una de las razones por las cuales es infrecuente el uso de la relación de composición (y la de agregación) para describir programas en Java.

Otro ejemplo: Aquí la composición es usada para indicar la clonación (en su forma deep copy ) de sus componentes, para impedir que los usuarios de una clase cambien los componentes de un objeto sin usar métodos del contenedor. En este ejemplo se tiene una clase que representa direcciones completas de personas (Address) que contiene muchos String, cada cadena contiene una línea de la dirección completa. Cuando se hace una copia de la dirección se desea que la copia cambie independientemente del original. Generalización La generalización es utilizada para construir jerarquías de clases. Aunque es un concepto más abstracto, también suele utilizarse la palabra herencia para referirse a la generalización. En la figura se ve una clase concreta RealPerson que hereda (extends) de una clase abstracta (representada en UML con un nombre escrito en itálica) Person. En UML las flechas siempre apuntan en un sentido que está relacionado con la dependencia indicada en el código fuente: puesto que la clase RealPerson menciona a la

clase Person en su declaración, en UML la flecha apunta desde dicha subclase a la clase base. Realización UML utiliza una notación parecida a la usada en el caso de relación de generalización/especialización para indicar otra relación de supertipos a subtipos: el de una interface con una clase que la implementa. En este caso se utiliza una línea punteada, con la misma punta de flecha que la usada para indicar una relación de herencia. En Java la realización se traslada directamente usando la palabra clave implements. Otro ejemplo (herencia múltiple usando extensión e implementación de interfaces): public interface Receiver {... // Métodos public void receive(); // interface Receiver public interface Transmitter {... // Métodos public void transmit(); // interface Transmitter

public interface Radio extends Transmitter, Receiver {... // Métodos public int tune(); // interface Radio public class Stereo extends ElectronicDevice implements Radio {... // Default constructor public Stereo() { // // default constructor Stereo... // Métodos-Implementación public void receive() { public void transmit() { public int tune() {... // class Stereo Referencias: UML for Java Programmers Robert C. Martin (Prentice Hall) http://www.auldenfire.com/aitpncc/resources/uml.shtml. Último acceso: 13/11/2008. http://fag.grm.hia.no/ikt403/year2007/slides/uml-ppt/2007-06- ClassDiagrams.ppt#54. Último acceso: 13/11/2008. http://www.ifi.uio.no/in219/verktoy/doc/html/doc/code_gens/java/. Último acceso: 13/11/2008. Mapping UML Associations into Java Code, en Journal of Object Technology, vol. 2, no. 5, September-October 2003, pp. 135-162. Roundtrip engineering for classes: Mapping between UML Diagram and Java structures based on Poseidon for UML and the Eclipse Platform. MSc. Thesis de Sunay Yaldiz, Technical University Hamburg-Harburg, Alemania Belén Criado Sánchez. Verificación de la implementación de asociaciones UML en Java. Ingeniería Informática, julio 2001, Proyecto de fin de carrera Entrelazamiento de los aspectos estático y dinámico en las asociaciones UML, Tesis doctoral Gonzalo Fuster Génova, Universidad Carlos III de Madrid, 2003