MODELADO
CON UML
El modelado de objetos
se puede encontrar la descripción de los
elementos primordiales de la orientación a objetos así como las estructuras
estáticas y sus relaciones.
Los componentes de las
estructuras estáticas son los objetos y clases que a la vez está compuesto de
ligas y asociaciones.
Describiendo cada uno
de los elementos empezaremos por lo que es un objeto el cual su significado en latín
nos describe que es cualquier cosa que se puede arrogar y que se pueda dividir
en abstractos o concretos además de que cuente con una estructura y un
comportamiento así como una identidad coherente.
Para que exista un
objeto depende mucho del contexto del problema, cada objeto puede o no ser
apropiado para diferentes aplicaciones; estos pueden ser independientes y se
deben considerar características o propiedades del mismo.
Los objetos integran
una estructura de datos (atributos) y un
comportamiento (operaciones), estos objetos son representados en un diagrama de
objetos.
Cada uno de los objetos
se distingue por su identidad ya que además cada objeto a pesar de que
internamente los valores sean iguales se consideran diferentes, cada uno de los
objetos necesita un identificador interno único, esto es cuando se implementa
un sistema, cabe destacar que este identificador no se debe de poner al momento
que se esté representando el objeto en el modelado.
Todo objeto pertenece a
un a clase ya que en esta se describe un grupo de objetos con estructura y
comportamiento común, a esa estructura o propiedades se le conocen como
atributos y al comportamiento se le denominan operaciones; cada clase define
uno o más objetos los cuales tienen características comunes; además de crear múltiples
objetos, y al momento de definirlos se logra una abstracción del problema, con
estas características también se le puede dar el nombre de clase básica.
Cuando se empieza con
el proceso de creación de objetos pertenecientes a una clase se llama instanciación,
donde los objetos son la instancia de la clase, en otras palabras es la instancia
de la clase a la que pertenece el objeto, para esta representación se hace a través
de una flecha punteada que va dirigida a la clase.
Algo muy importante
para definir la estructura de la clase son los atributos de sus
correspondientes objetos, ya que este define cada atributo que contenga la
clase se les debe definir un valor estos pueden ser iguales o distintos en los
diferentes objetos existentes de cada clase, cada atributo debe tener un nombre
propio diferente de los demás, a estos se les conoce como con el nombre de
atributos básicos, se puede representar en notación extendida o compacta.
Se nos menciona en el
libro que se puede asociar con cada
atributo un tipo de dato, esto con la finalidad de restringir los posibles
valores a esto se le denomina como omisión en cada atributo.
Se nos recomienda
identificar a los identificadores que se utilizan exclusivamente por razones de
implementación pero no deben ser incluidos como atributos del objeto.
Cabe destacar que
dentro de los atributos podemos agregar restricciones como por ejemplo debe de ser de cierto tipo
de valor o que acepta hasta un número determinado de dígitos según sea el valor
sea entero o numérico.
Dentro de una clase
existe las operaciones que son funciones que se aplican a todos los objetos de
una clase particular y estas pueden ser ejecutadas por o en un objeto; cada uno
de estos debe tener un único nombre además de argumentos o parámetros , cada uno con un tipo y pueden
devolver resultados.
Otros conceptos
relacionados con las operaciones son las consultas las cuales no modifican los
valores de los atributos ni de los objetos, simplemente devuelven valores de
los atributos básicos o derivados, existen los accesos que son otro tipo de
operaciones que nos ayudan para leer o escribir los atributos de un objeto; los
métodos nos ayudan a distinguir las operaciones como un concepto de alto nivel
de la propia implementación de la operación; utilizamos el polimorfismo que se
define como una misma operación que toma diferentes formas.
Una operación se
considera polimórfica si se está implementando en diferentes clases de forma
distinta o si se implementa en una misma clase diferente por diferentes
métodos, con otro número y tipo de argumentos de cada método, la forma de una
operación se define por el tipo y numero de argumentos y el tipo de resultado
que devuelve.
Existe la relación de
objetos y a eso se le llama liga; la
asociación nos describe la relación entre clases de objetos y posibles ligas
donde es una instancia de una asociación.
Hay dos clases de
asociaciones una de conocimiento que es una asociación estática entre
instancias, donde una instancia conoce la existencia de otra y el tipo es de
comunicación, esta asociación es de tipo dinámica donde modela la comunicación
entre los objetos y sirve para intercambiar información entre ellos.
Un grado de una
asociación se determina por el número de clases conectadas por la misma
asociación, estas pueden ser binarias, ternarias o de mayor grado según sea el
caso, estas relaciones solamente se pueden llevar únicamente entre clases.
Existen las relaciones
flexibles donde se relacionan diferentes objeto de una misma clase, esto puede
ser al igual que las asociaciones binarias, terciaria o de mayor grado
dependiendo del número de objetos que estén relacionados.
Otra característica que
podemos encontrar es la multiplicidad o como nosotros conocemos cardinalidad,
esta es una asociación especifica de cuantas instancias de una clase pueden
relacionarse a una sola instancia de otra clase, es necesario decidir la
multiplicidad de cada clase en una asociación, o sea de dos multiplicidades por
cada relación binaria, una para cada extremo de la relación, ya que esta
depende del contexto de la aplicación.
Existen diferentes
tipos de multiplicidades para las
asociaciones, de las cuales las mas relevantes son:
·
Uno a uno
·
Uno a muchos o viceversa
·
Muchos
a muchos.
El rol describe el
papel que juega cada extremo de una asociación, una asociación binaria tiene
dos roles, uno en cada extremo de la asociación, los roles pueden tener un nombre diferente cada uno.
Una relación de n clases tendría n
roles, son necesario para las asociaciones las cuales restringen los valores que
esas entidades pueden asumir.
Dentro de las ligas y
asociaciones existen también las restricciones al igual que en los atributos estas
restricciones pueden ser los valores de esas entidades que pueden asumir.
Nos menciona también el
libro las posibles ligas de una asociación donde puede ser un subconjunto de
las posibles ligas de otra asociación. La multiplicidad del subconjunto debe de
ser igual o menor que la multiplicidad de la asociación del súper conjunto, las
relaciones pueden estar de igual manera ordenadas.
Otra característica
dentro de los diagramas de clases son las asociaciones derivadas las cuales se
consideran que son asociaciones dependientes o redundantes, y están
determinadas directa o indirectamente a través de otras asociaciones que se
agregan para facilitar la búsqueda de cierta información, pero como se
representa, bien cada asociación está representada por una línea a esta línea
se atraviesa con una diagonal y así como
puede representarse la asociación derivada; se menciona que no todas las
asociaciones que forman multiples conexiones entres clases indican redundancia
ya que por lo regular eso pasa. A veces la existencia de una asociación se
deriva de dos o más asociaciones primitivas, se debe mantener la asociación
adicional, ya que puede ser importante para una restricción adicional de
multiplicidad.
Otro tipo de
operaciones que se pueden mostrar y
representar son las operaciones de acceso ya que además de leer o escribir
atributos, pueden servir para acceder a las ligas relacionadas con un objeto
también se puede tener acceso a los objetos por medio de pseudoatributos de los
roles de las asociaciones.
Al igual que un
atributo de clase es prioridad de una clase, un atributo de asociación o
atributo de liga y es propiedad de una
asociación.
Podemos encontrar las
operaciones de asociación y estas dependen de las clases involucradas en una
relación existente según sea el caso , y así como son con asociaciones existen
las asociaciones como clases y estas se pueden modelar como si fuera una clase,
en particular si se desea asociar la propia asociación con otras clases. Los
atributos y operaciones de la asociación
pasan a ser miembros de la clase correspondiente a la asociación.
Los ensamblados, en
particular la agregación y la composición son formas especiales de asociación
entre u todo y sus partes, en donde el ensamblado está compuesto por sus
componentes. El ensamblado es el objeto central, y la estructura completa se
describe como una jerarquía de contenido. Un ensamblado puede componerse de
varias partes, donde cada relación parte-todo se considera una relación
separada. En el caso de la agregación, las partes del ensamblado pueden
aparecer en multiplex ensamblados, las partes den ensamblado pueden aparecer múltiples
ensamblados. En el caso de la composición, las partes del ensamblado no pueden
ser compartidas entre ensamblados.
Ciertos puntos de los
ensamblados es que tienen propiedades de transición o si es antisimetrico, es
decir que si A es parte de B, entonces B no es parte de A.
Se considera un
ensamblado y una asociación:
·
Si se puede usar la frase “parte de “o “
consiste de” o “tiene”.
·
Si algunas operaciones en el todo pueden
propagarse a sus partes.
·
Si algunos atributos en el todo se
pueden propagar a sus partes.
·
El ensamblado es común en los objetos
interface. En un sistema de ventanas por ejemplo, una ventana puede consistir
en botones, menús y barras, cada uno un modelado por su propio objeto
interface. El resultado es una estructura de interface en forma de árbol. La
decisión de usar ensamblados es un poco arbitraria, y en la práctica no causa
grandes problemas la distinción imprecisa entre agregación, composición y
asociación, aunque es bueno ser consistente.
Los tipos de
ensamblados pueden ser:
·
Fijos: los que tienen una estructura
fija donde el número de componentes esta predefinido.
·
Variables: tienen un numero finito de
niveles, pero el número de componentes varia.
·
Recursivos. Los ensamblados recursivos
contienen la forma directa o indirecta una instancia del mismo tipo de
agregado, donde el número de niveles de ensamblado es posteriormente ilimitado.
Uno de los objetivos
del ensamblado es que las operaciones aplicadas a este puedan propagarse de
forma automática a sus objetos componentes. La operación se propaga en una sola
dirección, y puede ser aplicada a las partes del ensamblado de forma
independiente.
Las clases con
atributos y operaciones comunes se puede organizar de forma jerárquica mediante
la herencia, esta es una abstracción importante para compartir similitudes
entre clases, donde todos los atributos y operaciones comunes a varias clases
se pueden compartir por medio de la superclase, una clase más general. Las
clases más refinadas se conocen como subclases.
La herencia es útil
pata el modelado conceptual. Al igual que la implementación: como modelado
conceptual da buena estructuración a las clases. Como modelo de implementación
es un buen vehículo para no replicar innecesariamente el código. Le
generalización define una relación entre una clase más generalizada y una o más
versiones definidas en ella.
El opuesto de la generalización
es la especialización, que define una relación entre una clase más general y
una o más versiones especializadas de ella.
La herencia es
transitiva a través de un numero arbitrario de niveles. Los ancestros de una
clase son la superclase de una clase de cualquier nivel superior de la
jerarquía y de los descendientes de una clase son la subclase de una clase en
cualquier nivel inferior de la jerarquía.
Las siguientes
características se aplican a clases en una jerarquía de herencia:
·
Los valores de una instancia incluyen
valores para cada atributo de cada clase ancestra.
·
Cualquier operación de cualquier clase
ancestra se puede aplicar a una instancia.
·
Cada subclase no solo hereda todas las
características de sus ancestros, sino también añade sus propios atributos y
operaciones.
La generalización se
puede extender a múltiples niveles de jerarquías, donde una clase hereda de su
superclase, que a su vez hereda de otra superclase, hacia arriba en la
jerarquía. En otras palabras, las relaciones entre subclases y superclases son
relativas. La herencia define una jerarquía de clases donde existen ancestros y
descendientes que pueden ser directos o no.
La agregación o
composición no son lo mismo que la generalización, el ensamblado relaciona
clases correspondientes a muchos objetos; mientras que la generalización
relaciona clases, que finalmente corresponden a un solo objeto. La agregación o
composición es una forma de estructurar la descripción de un solo objeto;
mientras que con la generalización, un solo objeto es una instancia de la combinación
de la superclase y subclase. El ensamblado es una relación parte de, en cambio generalización
es una relación tipo de o es una.
La generalización puede
hacerse por diferentes razones:
·
Extensión: clases definidas por
operaciones con estructuras de información.
·
Restricción: clases como implementación es
de tipos, especializaciones, subconjuntos de todas las instancias de un
ancestro.
La extensión de clase
expresa que una subclase pueda añadir nuevos atributos u operaciones ala
superclase.
Dentro de las clases
existen las restricciones de clase que nos indica como una subclase puede
restringir los atributos heredados de una superclase. Una clase descendiente no
puede suprimir los atributos u operaciones de sus ancestros.
Una subclase puede
sobreescribir atributos y operaciones de una superclase, al definir nuevos
atributos y operaciones con el mismo nombre, se pueden sobreescrinbir
atributos, por ejemplo, para redefinir sus valores por omisión, y se pueden
sobreescrinir operaciones para mejorar el rendimiento de un algoritmo.
Se nos aconseja que no
es conveniente desarrollar nuevas clases sobreescribiendo los métodos de las
superclases simplemente por conveniencia de implementación, sobreescritura por
implementación, sobre las cuales no existe ninguna relación conceptual. Se
puede introducir herencia adicional en el sistema durante la etapa de diseño.
Todas las
características o todas las acciones que se pueden hacer simplemente se han
hecho con clases concretas o simplemente clases donde cualquiera de estas tenía
la cualidad de ser instanciada. Una clase abstracta es una clase que no tiene
directamente instancias, pero cuyas clases descendientes si las tiene. Las
clases abstractas organizan características comunes a través de clases; pueden
aparecer naturalmente en la aplicación o pueden ser introducidas
artificialmente para promover la reutilización de código y compartir atributos
y métodos.
Un ejemplo seria para
la clase mueble, la clase asiento es abstracta, ya que para crear un asiento se
debe instanciar una de sus tres subclases: silla, sillón o taburete.
Cuando
una superclase se divide en subclases por discriminación, y existe una subclase
para cada valor posible del discriminador, entonces la superclase se considera
una clase abstracta, esta puede definir métodos para ser usados por la
subclase, o definir el protocolo de la operación, o sea el tipo y numero de
argumentos: el resultado y la intención semántica, sin dar el correspondiente
método (operación abstracta). Cada clase concreta debe proveer su propia
implementación y no debe tener operaciones abstractas.
Otro
concepto que es importante es la herencia múltiple la cual permite a una clase
tener más de una superclase y heredar aspectos de todos sus ancestros.
En
la herencia sencilla no existen conflictos entre superclases. Cuando se hereda
la misma operación se múltiples ancestros, como opción se debe sobrescribirla
operación en la nueva clase para evitar conflictos.
La
ventaja de incorporar la herencia múltiple es que permita integrar información
de dos o más superclases a la vez, dando más poder en la especificación de
clases y más oportunidad de reutilización, siendo por lo general más natural
para el modelo de objetos que la herencia sencilla.
La
desventaja de incorporar herencia múltiple es que es más complicada que la
herencia sencilla, ya que se pierde la simplicidad conceptual y de
implementación. El mayor problema resultante es que se podría estar heredando
varias veces una misma característica de diferentes clases ancestrales. Se
puede definir reglas para resolver ambigüedades y evitar conflictos entre las
características heredadas por varios recorridos en la jerarquía de herencia.
Las
clases disjuntas son clases que semánticamente describen características
diferentes, de distinta jerarquía de herencia mientras que las clases no
disjuntas son clases que tienen aspectos comunes, por lo cual una hereda
características de ambas estaría compartiendo tales propiedades. Se puede
incorporar herencia múltiple de una misma generalización, si las clases dentro
de la generalización son no disjuntas. (No se debe heredad de dos clases
perteneciendo a una misma generalización, si las clases dentro de la
generalización son disjuntas.)
Se
puede incorporar herencia múltiple de dos generalizaciones distintas, donde las
clases son disjuntas. Cada generalización debe cubrir una sola propiedad, por
lo cual, una nueva clase creada por medio de la herencia múltiple estaría
siendo refinada sobre dimensiones de generalización diferentes e
independientes.
Un
módulo o paquete es una construcción lógica para agrupar clases, asociaciones y
generalizaciones. El modulo captura diferentes perspectivas de un sistema. Los
bordes entre distintos módulos pueden ser bastante arbitrarios. Un modelo de
objetos consiste de uno a más módulos.
Cada
módulo debe proveer una visión de alto nivel de las clases más importantes del
sistema, mostrando las clases y sus asociaciones son atributos u operaciones.
Cada una de estas clases se asigna a su propio modulo, mostrando si
descomposición en clases por generalización y agregación.