Estoy confundido acerca de algunas de las notaciones de los diagramas de clases UML.
Estoy bastante seguro de saber lo que significa Asociación . Cualquier relación entre instancias de dos clases, donde una instancia de una clase necesita saber sobre una instancia de la segunda clase para realizar su trabajo, es una relación de asociación. Una asociación a menudo significa que la clase A tiene una referencia (campo) a una instancia de la clase B.
Sin embargo, tengo problemas para entender lo que significan las flechas de Agregación y Composición . Parte de mi confusión fue causada por encontrar diferentes definiciones de estas anotaciones.
Dos definiciones de la notación de agregación :
Definición 1: una notación de agregación entre dos clases es adecuada siempre que una instancia de la clase A contenga una colección de instancias de la clase B (por ejemplo, una lista, matriz, lo que sea).
Definición 2: Un enlace de agregación entre dos clases es adecuado si una instancia de la clase A contiene una referencia a una instancia de la clase B, y la instancia B depende del ciclo de vida de la instancia A. Significado: cuando la instancia de la clase A se elimina, también lo hará la instancia de la clase B. La instancia de la clase B está completamente contenida por la instancia de la clase A, en oposición a la instancia de la clase A, simplemente teniendo una referencia a la instancia de clase B (que es la asociación regular).
Con respecto a lo que significa la notación de composición y cómo difiere de la notación de agregación, no estoy seguro.
Por favor aclare las definiciones y ayúdeme a entender. Ejemplos concretos serían bienvenidos.
fuente
Respuestas:
Los tres enlaces Asociación, Agregación y Composición forman una especie de escala sobre cuán estrechamente se relacionan dos clases entre sí.
En un extremo de la escala, hay una Asociación, donde los objetos de las dos clases pueden conocerse entre sí, pero no afectan la vida de los demás. Los objetos pueden existir independientemente y qué objeto de clase A sabe qué objetos de clase B pueden variar con el tiempo.
En el otro extremo de la escala, hay Composición. La composición representa una relación parte - todo tal que la clase B es una parte integral de la clase A. Esta relación se usa típicamente si los objetos de la clase A no pueden existir lógicamente sin tener un objeto de clase B.
La relación de agregación se encuentra en algún punto entre esos dos extremos, pero nadie parece estar de acuerdo exactamente dónde, por lo que tampoco existe una definición universalmente aceptada de lo que significa una agregación. En ese sentido, ambas definiciones que encontró son correctas y si pregunta a 10 personas, corre el riesgo de obtener 11 definiciones diferentes.
fuente
La composición es cuando un
object A
contieneobject B
y elobject A
también es responsable de crear elobject B
.Relación de composición
Tenemos una clase A que será utilizada por la clase B.
Hay múltiples opciones sobre cómo puede verse la composición.
Composición de inicialización directa:
Composición de inicialización del constructor
Composición de inicialización perezosa
Usted ve que esto crea una estrecha relación entre las clases
A
yB
. La claseB
simplemente no puede existir sin ellaA
. Esta es una gran violación del principio de inyección de dependencia , que dice:La composición a veces tiene sentido, como llamar
new DateTime
a php onew std::vector<int>
en C ++. Pero la mayoría de las veces, es una advertencia, que el diseño de su código es incorrecto.En un caso, donde
class A
sería un objeto especial utilizado para el almacenamiento en caché,class B
siempre se almacenaría en caché utilizando la implementación declass A
, y no tendría control para cambiarlo dinámicamente, lo cual es malo.Además, si usó la composición de inicialización diferida , lo que significa que tendría un funcionamiento
object B
, llamadouseA()
método y la creación deobject A
fallaría, su deobject B
repente es inútil.La agregación, por otro lado, es una forma de relación, que sigue el principio DI .
object B
necesita usarobject A
, entonces debería pasar la instancia deobject A
to ya creadaobject B
, y si la creación deobject A
falla, no se pasaría nada en primer lugar.En resumen, la agregación es una representación UML para el principio de inyección de dependencia , ya sea inyección de constructor, inyección de setter o inyección de propiedad pública.
Estas son todas las agregaciones
La inyección de constructor más ajustada (
object B
no puede existir sinobject A
).Más flojo (puede usarlo o no
object A
dentroobject B
, pero si lo hace, probablemente debería configurarlo primero).Vía setter:
Vía propiedad pública:
Realmente no hay una buena manera de justificar el uso de la agregación sobre la composición, si todo lo que está utilizando son implementaciones concretas de clases, pero una vez que comience a inyectar interfaces o en el caso de clases abstractas de C ++, de repente la agregación será la única forma de Cumplir su contrato.
fuente
Además un extracto del estándar UML actual:
11.5.4 Asociaciones - Semántica - Notación
9.5.4 Clasificación - Propiedades - Notación
fuente
Ya publiqué una respuesta en Stackoverflow .
Básicamente, una agregación es más fuerte que una asociación simple, pero los objetos agregados pueden "vivir" uno sin el otro como con una asociación simple.
Una composición es incluso más fuerte que una agregación porque la clase agregada no puede ser agregada por otras clases. Su "vida" depende del contenedor.
fuente