UNIDAD 2 RELACIONES DE OBJETOS. DIAGRAMA DE CLASES

Anuncio
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
INTRODUCCION
Un concepto fundamental que debemos tener en cuenta a la hora de modelar la realidad por medio
de objetos es que los mismos no son entidades aisladas. Los objetos interactúan entre ellos
constantemente por medio de mensajes. De esta forma se definen las responsabilidades de los
objetos. Es decir, cuando modelamos una realidad y abstraemos de ellas objetos definimos
principalmente sus responsabilidades. Una responsabilidad es una descripción de lo que de lo que
hará el objeto.
En otras palabras al modelar determinamos objetos y para cada uno de ellos primero definimos su
“contrato u obligación”. Esta obligación o contrato en los objetos representa que información es
valiosa y/o que operaciones (o sea sus atributos y operaciones) se necesitan de ese objeto.
Cada objeto tiene al menos una responsabilidad y no debería poseer una “gran cantidad” de
responsabilidades. ¿Por qué? Porque esto indicaría que es probable que de una misma clase se
pueda crear otras clases, por lo cual se podría distribuir las responsabilidades entre las nuevas
clases.
Dijimos que los objetos interactúan entre ellos, que no son entidades aisladas. Por lo tanto solicitan a
través de los mensajes algunas de las responsabilidades de los otros objetos. Esta interacción
provoca un vínculo o conexión entre los objetos. Esta conexión se denomina relación.
Una relación es una conexión semántica entre objetos (es decir podemos claramente identificarla por
una frase, como veremos más adelante) y proveen un camino de comunicación entre los objetos.
Existen diversos tipos de relaciones entre objetos. En esta sección daremos sus conceptos y luego
en esta misma unidad al ver los diagramas de clases de UML se especificarán las notaciones de los
mismos
RELACIÓN DE ASOCIACIÓN
Es una relación que se da cuando existe un vínculo conceptual entre objetos. Se podría decir que es
una relación que se da cuando un objeto necesita algo de la otra, entonces de esta forma se
establece el vínculo. La notación semántica usual que se utiliza es “está conectado” o “se asocia”.
Esto sólo sirve para identificar la asociación, ya que normalmente a la asociación se le establece la
palabra real que se utiliza para la asociación
Ejemplos:
Una persona enciende el televisor. En esta relación fijarse que se da la situación de que una persona
(que es un objeto) quiere ver televisión. Por lo tanto para ello necesita prenderla. Entonces el vínculo
entre ellas es que la persona puede encender el televisor para poder ver televisión.
Además entre objetos puede haber más de un vínculo de asociación. En el ejemplo anterior la
persona no solo está vinculada a la televisión por la relación Encender, sino que posee por ejemplo:
Apagar, Cambiar de Canal, Configurar.
Otro ejemplo: Observe la imagen
Ariel Alejandro Vega
13
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
Tom (que es un objeto de la clase Persona) está vinculado con Bill (otro objeto de la misma clase) de
dos formas: resulta que ambos trabajan en el mismo lugar y después de un tiempo se hicieron
amigos. Por lo tanto Tom es colaborador de Bill y, además Tom es amigo de Bill.
Por otro lado observen que el vínculo es verdadero leído desde ambos extremos. Es decir Bill
también es colaborador y amigo de Tom, aunque esto podría no ser verdad, a lo mejor Tom lo
considera amigo a Bill, pero no ocurre lo mismo con Bill. Ya veremos que existen formas de indicar si
el vínculo es unidireccional (se establece en un solo sentido) o bidireccional (se establece en ambos
sentidos)
Un ejemplo más: Observe la imagen
Aquí podemos ver que un objeto se puede relacionar con más de un objeto. Por ejemplo Juan viaja a
su trabajo en auto. Pero resulta que el día de hoy el auto no arrancó porque se agotó su batería.
Entonces tuvo que viajar en colectivo. Esto quiere decir que se establece un nuevo vínculo de
asociación entre Juan y el Colectivo. Además fijarse que la relación de asociación puede o no darse
al mismo tiempo. En este caso diríamos que no es al mismo tiempo, pero en otros ejemplos si puede
existir. Por ejemplo supongamos que Juan atiende una llamada en el colectivo, entonces se
establece un vínculo entre Juan y su celular. Juan habla por Celular. Y esto ocurre al mismo tiempo
que Juan viaja en colectivo.
Y para finalizar con asociaciones, otro ejemplo más:
Ariel Alejandro Vega
14
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
Aquí vemos que un alumno puede estar inscripto a varias asignaturas (2 en este caso). A su vez la
materia puede considerarse un objeto y obviamente posee al menos un alumno, es decir se podría
considerar un conjunto de alumnos. Y finalmente tenemos 2 profesores, el Prof. A imparte
únicamente POO y el Prof. B imparte ambas materias. En pocas palabras podemos indicar con la
asociación la cantidad de objetos de una Clase que está asociado a otro objeto de otra clase. Este
concepto recibe el nombre de multiplicidad.
Resumiendo:
•
•
•
•
La relación de asociación permite indicar un vínculo entre dos o más objetos. En términos de
objetos se dice que un objeto se asocia a otro. Por ejemplo: Si una persona llama usando su
celular, en objetos se dice que la persona se asocia al celular.
La frase usual es “se asocia” o “se conecta”, que luego es representada por la frase real, por
ejemplo: Persona utiliza Celular.
La relación puede ser unidireccional o bidireccional
En esta relación se puede indicar la cantidad de objetos a la cual otro objetos se asocia. Esto
se llama multiplicidad.
LA ASOCIACIÓN DE AGREGACIÓN
La agregación es una relación muy importante en el mundo del modelado de objetos. Básicamente
podemos de decir que un objeto puede estar conformado por otros objetos. Imaginemos nuestra
habitación. Nuestra habitación está conformada mínimamente por una cama, tal vez un escritorio,
algún mueble, el ropero, etc. Ahora bien estos muebles son también objetos. Por lo tanto un objeto
puede estar conformado por otros objetos, formando un nuevo objeto (recordar que todo objeto es
único por la identidad de los objetos)
Otro ejemplo: un objeto sándwich, estará conformado por pan, lomito, huevo, jamón, quizás queso,
etc. Estos ingredientes son otros objetos. Nuevamente un objeto está conformado por otros objetos,
formando un objeto completamente nuevo.
Una agregación es un tipo específico de relación de asociación. Básicamente la agregación es
aquella relación que permite que un objeto sea compuesto/descompuesto en otros objetos.
La notación semántica que permite identificar relaciones de agregación es la frase “forma parte de”
o “formado por”.
Mencioné que esta relación es muy importante, ¿Porqué? Imaginemos el siguiente escenario:
Cuando se trata de escribir o leer desde una unidad de CD, se considera la unidad de CD como un
objeto individual. También se puede analizar cómo interactúa la unidad de CD con el sistema de la
computadora personal; los sistemas de computación también se tratan como un objeto individual.
Ariel Alejandro Vega
15
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
Si se llama a un ingeniero para que repare un problema de una unidad de CD, su perspectiva de la
unidad de CD es más detallada. El ingeniero examina el motor de giro de la unidad de CD, la bandeja
de la unidad y el haz de láser o el lector.
Cada uno de estos elementos es un componente del objeto unidad de CD y es un objeto por sí
mismo. Las distintas perspectivas sobre la unidad de CD son igualmente válidas y cada una se
puede expresar en momentos diferentes.
Al trabajar con objetos, resulta útil emplear un nivel de abstracción lo más alto posible. De este modo,
puede conceptualizar mejor los objetos importantes y entender mejor cómo funciona el sistema.
Hasta aquí lo que se comentó, ¿qué me aporta?:
1. Hemos delimitado la perspectiva de del sistema a la parte que nos interesa. Si no funciona la
lectora llamamos al técnico y él se limita a reparar la unidad lectora, él no intentaría ver el
procesador para saber qué pasó la lectora.
2. Si queremos colocar una lectora de DVD en lugar de una de DVD, simplemente sacamos la
lectora de CD y colocamos la otra. De esta forma vemos que trabajar con agregación de
objetos podemos facilitar la integración, sin embargo esto requiere un buen mecanismo de
integración. En el caso de la lectora, todo está preparado para que podamos reemplazar una
lectora por otra. En los sistemas que realicemos esta facilidad la debemos poder implementar
usando algún mecanismo: usar objetos facilita esta operación porque recordemos que cada
objeto encapsula su responsabilidad, además con el uso de interfaces, es posible desacoplar
aún más la funcionalidad. Entonces los objetos se pueden comportar como componentes. Y
cada componente es un objeto. Esto simplifica mucho la tarea. Por ejemplo en el caso de la
lectora: luego de instalar la nueva lectora es probable que el sistema detecte la configuración
más eficiente de usarla porque el sistema simplemente usará la interface de la lectora, es
decir no se conecta directamente al funcionamiento electrónico, esto es lo que permite
colocar cualquier lectora.
3. En caso de que pudiéramos mejorar el funcionamiento de nuestra lectora, podemos hacerlo
sin afectar al resto del sistema. En nuestro caso real, no podemos hacerlo, porque no somos
técnicos, ni siquiera los técnicos pueden hacerlo, porque las lectoras vienen de fábrica. Pero
la idea central es esa, que al dividir un objeto en otros objetos, Podemos mejorar o modificar
cada uno de ellos sin afectar a los otros, ya que el mecanismo de integración estaría
asegurado.
De todas formas estas ventajas serán evidentes a la hora de programar, así que lo importante es
entender el concepto de agregación.
LA ASOCIACIÓN DE COMPOSICIÓN
La relación de composición es un tipo de agregación con un vínculo muy fuerte, de tal modo que no
se puede concebir que exista un objeto compuesto fuera del todo al que pertenece.
Ariel Alejandro Vega
16
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
Por ejemplo: Un tablero de ajedrez está compuesto por 64 casillas, es decir hay una relación de
agregación entre tablero y las casillas, las 64 casillas forman el tablero; por otro lado si hacemos que
desaparezca el tablero las casillas también desaparecerán.
Otro ejemplo: Una guitarra está compuesta por 6 cuerdas, el diapasón, el clavijero y la caja de
resonancia. Si desaparece la guitarra los elementos no tienen sentido fuera de ella.
Una última aclaración sobre las relaciones de agregación y de composición: Como distinguir si una
relación es de agregación o de composición. Existen algunos puntos clave:
En la relación de agregación un objeto componente (se dice objeto compuesto) puede llegar a
pertenecer a más de un objeto “todo” (por ejemplo un control remoto universal puede formar parte del
televisor y del reproductor de dvd) mientras que en la composición sí o sí un objeto componente
pertenece un objeto de una clase a la vez.
LA RELACIÓN DE GENERALIZACIÓN
En la unidad 1 se presentaron las propiedades de los objetos. Uno de ellas es la herencia. La
herencia es también un tipo de relación entre objetos. Por lo tanto es importante considerar la
importancia de la herencia, no sólo como una propiedad, sino como una relación entre objetos. Al
igual que la agregación y la composición la generación (o especialización) de los objetos resulta ser
fácil de representar con los objetos.
La generalización clarifica el diseño y mejora la productividad.
La notación semántica para representar objetos es la frase “es un tipo de” o “es una”.
OTRAS RELACIONES DE INTERÉS
•
•
La realización: Es una relación de contrato con otra clase. Se utiliza para implementar
clases. Supongamos que definimos que tenemos una Clase que representa una colección de
personas. Supongamos que el sistema debe permitir la consulta por dni o nombre y no se
permite que no estén presentes estas consultas. Además no se permite ningún otro tipo de
consulta. Con esta relación definimos un objeto que es el contrato el cual otro objeto debe
respetar. Generalmente se utilizan para las denominadas interfaces. Supongamos que para
el ejemplo anterior. Definimos una interfaz que se llama ConsultadorDePersonas (el cual
posee las operaciones buscarPorDni y buscarPorNombre) y tenemos la clase Persona,
entonces la relación sería Persona “implementa” ConsutadorDePersonas.
La Dependencia: Es una relación de uso. Es decir una clase utiliza otra clase. Y si esta
última se altera, la anterior se puede ver afectada. En cambio si la primera se modifica sus
cambios no afectan a la segunda. Este tipo de relación provoca lo que se denomina
acoplamiento, el cual debe ser en lo posible evitado. La notación semántica es la frase “usa”
Existen diversos tipos de casos de dependencia, los cuales serán detallados posteriormente
en esta misma unidad. Por ejemplo se suele utilizar para indicar que una aplicación invoca a
otra y se genera entonces una ventana, es decir desde una ventana se invoca a otra
ventana, para ello es necesario que la aplicación genere un objeto de la clase Ventana y
entonces mostrarla. Si por alguna razón modificamos la ventana esto puede afectar a la
aplicación, en cambio si modificamos la aplicación la clase Ventana se mantiene igual.
UML Y EL DIAGRAMA DE CLASES
UML es una herramienta para modelar aspectos de un desarrollo de software (aunque no solo se
limita al software) que es el resultado de varias experiencias que fueron integradas y modificadas por
el aporte de diversos autores y empresas que conformaron lo que se conoce el Consorcio de UML.
Sus padres oficialmente reconocidos son: Grady Booch, James Rumbaugh e Ivar Jacobson.
Cada uno de ellos en sus diversas experiencias de desarrollo creó sus propias metodologías de
desarrollo y aportaron la creación de diversos modelos para el análisis y diseño orientado a objetos.
Ariel Alejandro Vega
17
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
La empresa Rational terminó sumando a sus filas a estos 3 desarrolladores, entonces ellos apostaron
a unificar los diversos modelos que crearon, de esta experiencia surgió UML (Lenguaje de Modelado
Unificado).
A la propuesta original o anteproyecto de UML se le sumaron numerosas modificaciones como
respuesta a las reacciones del “mercado” las cuales fueron acertadamente aceptadas, con lo cual
tuvo una amplia retroalimentación.
En 1997, con el aporte de los númerosos miembros del Consorcio de UML (DEC, Microsoft, HP,
Intellicorp, Oracle, Rational, entre otros) se produjo la versión 1.0 de UML y se puso a disposición de
la OMG.
Desde entonces con diversas modificaciones y evoluciones UML se ha convertido en el Estándar que
recomienda la OMG (Group Management Objetcs) para la Industria del Software.
Lo que ofrece UML es un conjunto de diagramas conformados por elementos gráficos. Cada
diagrama puede modelar uno o varios aspectos del software y pueden llegar a ser más o menos
útiles dependiendo de la etapa del ciclo de desarrollo en la que se el grupo de desarrollo se
encuentre.
UML es un Lenguaje porque define reglas que dirigen la forma en que deben combinarse los
componentes
Entonces lo importante es conocer para qué cosa funciona cada diagrama, y luego ver la notación
que se puede utilizar. Incluso UML permite cierta libertad a la hora de usar los elementos de cada
Diagrama, para poder incluso combinarlos.
No es el objetivo de la asignatura estudiar UML, sin embargo dado que se realizó una introducción al
modelado orientado a objetos, la definición de los objetos, sus propiedades y relaciones, resulta
apropiado utilizar un modelo para representar las clases, algunas de sus propiedades y las
relaciones. UML aporta un modelo ampliamente utilizado por los desarrolladores para modelar las
clases denominado Diagrama de Clases.
El Diagrama de Clases es un diagrama del tipo estático (dado que no refleja la interacción entre las
clases, simplemente refleja la estructura del mismo, como si fuera una foto).
En el Diagrama de Clases una clase puede representarse de 3 formas:
•
Como un rectángulo, es este caso solo se representa el nombre de la clase. Por ejemplo
•
Como un rectángulo dividido en dos partes, en este caso se representa el nombre de la clase
y sus atributos u operaciones. Por ejemplo
•
Como un rectángulo dividido en 3 partes, en este caso se representa el nombre de la clase,
sus atributos y sus operaciones. Observe que las operaciones son acciones que inician con
un verbo en infinitivo seguido de un paréntesis. Por ejemplo
El Diagrama de Clases puede ser utilizado en cualquier ciclo de vida del desarrollo de un sistema
(típicamente análisis, diseño, implementación, prueba, mantenimiento). En cada una de estas fases
Ariel Alejandro Vega
18
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
puede adoptar nuevos conceptos. Por ejemplo en el análisis y diseño nosotros podemos indicar que
un atributo es numérico, fecha, o cadena de caracteres. Mientras que en la implementación nosotros
podemos indicar el tipo de dato del atributo según el lenguaje de programación.
La visibilidad
En el Diagrama de Clases de UML nosotros podemos indicar la visibilidad de los atributos y de las
operaciones.
La visibilidad permite definir el grado en el cual un atributo u operación estará disponible para que
sea usado por otras clases. Por tal razón la visibilidad está relacionada con la relación de realización.
Existen 3 tipos o niveles de visibilidad:
• Público (+): en este nivel de visibilidad el atributo u operación de una clase está disponible
para todas las demás clases. Esto es, una clase cualquiera puede leer o asignar valores al
atributo de clase que es definido como público. De la misma forma cualquier clase puede
invocar una operación que ha sido definida como pública.
• Protegido (#): en este nivel de visibilidad el atributo u operación de una clase está disponible
únicamente para sus subclases.
• Privado (-): en este nivel de visibilidad el atributo u operación de una clase no está
disponible para ninguna otra clase. Solo pueden ser usadas por las operaciones de la misma
clase.
He aquí algunos ejemplos de visibilidad de atributos y operaciones
En el caso de la Clase Televisión se puede observar que tiene 2 atributos públicos, dado que la
marca y el modelo son características que deben estar disponibles para cualquier otra clase
También debería ser posible que cualquier clase pueda modificar el volumen de la Televisión. Sin
embargo la operación colorearImagenEnPantalla() es una operación interna.
En el caso de la Clase Automovil tiene una operación protegida llamada actualizarKilometraje().
Observe que cualquier subclase de Automovil puede usar esta operación con lo cual se evita la
necesidad de volver a crear esta operación en cada subclase.
La Generalización
La generalización se representa mediante una flecha dirigida desde la subclase hasta su superclase.
En la unidad uno se usó esta notación para representar el concepto de herencia.
La generalización permite que una clase “hija” herede todos los atributos y propiedades de
la clase “madre”. Por ejemplo las clases vertebrados e invertebrados pueden heredar de animal.
Observe que únicamente se está representando la herencia a nivel de nombres de clases. En este
caso se habla de generalización porque la superclase posee los atributos y operaciones comunes de
todas sus hijas.
Pero además la herencia permite lo que se denomina especialización. Esto es, una hija puede
agregar atributos y operaciones no contemplados en la superclase y puede modificar las operaciones
definidas en la superclase de acuerdo a sus necesidades “específicas”.
Ariel Alejandro Vega
19
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
La Asociación
En el diagrama de clases la asociación se representa mediante una línea que une dos clases.
Comúnmente se escribe en la línea una frase que representa la asociación. Cuando se realiza de
esta forma se dice que la asociación es bidireccional, es decir la relación es en ambos sentidos.
A veces puede que la asociación sea unidireccional. En ese caso la misma se puede representar de
dos formas: haciendo que la línea sea una flecha que indique la dirección
O usando lo que se denomina navegadores. Por ejemplo
Cualquiera de las dos opciones es válida.
También es posible indicar el papel de cada una de las clases que intervienen en la relación. Para
ello se coloca el papel en el extremo de cada clase. Por ejemplo
También en la relación de asociación es posible establecer la multiplicidad. La multiplicidad indica la
cantidad de objetos de una clase que se relacionan con el objeto de una clase asociada. Existe una
diversidad de notaciones para la multiplicidad, los cuales son indicados a continuación:
A continuación se describen varios ejemplos de multiplicidad
Ariel Alejandro Vega
20
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
La Agregación
Se representa mediante un rombo que señala cual es la clase que está conformada por otras clases.
Se pueden aplicar las reglas de la multiplicidad.
La Composición
Se representa mediante un rombo relleno que señala cual es la clase que está conformada por otras
clases. Se pueden aplicar las reglas de la multiplicidad.
•
•
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.
Dependencias
La dependencia se establece mediante una flecha punteada. Para el ejemplo de la aplicación que
instancia una ventana, sería
Cabe destacar que la instanciación no es el único ejemplo de dependencia.
Otros caso de dependencia aparece cuando una operación recibe como parámetro un objeto y por lo
tanto la operación depende del tipo de parámetro que reciba. Por ejemplo: supongamos que estamos
Ariel Alejandro Vega
21
Programación Orientada a Objetos
Analista Programador Universitario Plan 2008
Año 2010
UNIDAD 2
RELACIONES ENTRE OBJETOS
DIAGRAMA DE CLASES UML
ante una aplicación y que se debe mostrar un formulario en una ventana, el cual será elegido desde
un menú de opciones. Esto se puede representar de esta forma
Donde la operación implementada sería así mostrarFormulario(f:Form) y Form representa un tipo de
formulario específico.
La Realización
La realización se representa mediante una línea punteada con una flecha sin relleno. Por ejemplo
supongamos que Tenemos una clase Persona y tenemos una Clase Factura. Ambas deben poseer
una operación que les permita ordenar personas por nombre y facturas por fecha. Imagine entonces
un contrato que define la operación ordenar mediante una Interfaz denominada Ordenacion.
Entonces ambas clases deben implementar este contrato. Cada una en su forma específica realiza la
operación ordenar() pero no puede obviarla o evitarla. Tampoco se permite que realicen otra
operación. También observe que la interfaz tiene un identificador <<interfaz>> que indica que es una
interfaz. Este identificador se denomina estereotipo. Otra forma de representar la interfaz es colocar
es iniciar el nombre de la Clase con la letra I. En el ejemplo sería IOrdenacion el nombre de la
interfaz.
BIBLIOGRAFIA
•
•
•
UML y Patrones de Diseño. Una introducción al análisis y diseño orientado a objetos y al
proceso unificado. Segunda Edición. Pearson Prentice Hall.
Aprendiendo UML en 24 horas. Joseph Schmuller. Prentice Hall.
Oracle 10g. Programación JAVA. Guía del Alumno Volúmen 1. Jeff Gallus.
Ariel Alejandro Vega
22
Descargar