Estou confuso sobre algumas das notações dos diagramas de classes UML.
Tenho certeza que sei o que significa Associação . Qualquer relacionamento entre instâncias de duas classes, em que uma instância de uma classe precisa saber sobre uma instância da segunda classe para executar seu trabalho - é um relacionamento de Associação. Uma associação geralmente significa que a classe A tem uma referência (campo) a uma instância da classe B.
No entanto, estou tendo problemas para entender o que significam as setas de agregação e composição . Parte da minha confusão foi causada por encontrar diferentes definições dessas notações.
Duas definições da notação de agregação :
Definição 1: Uma notação de agregação entre duas classes é adequada sempre que uma instância da classe A contém uma coleção de instâncias da classe B (por exemplo, uma lista, matriz, o que for).
Definição 2: Um link de agregação entre duas classes é adequado se uma instância da classe A tiver uma referência a uma instância da classe B e a instância B depender do ciclo de vida da instância A. Significado: Quando a instância da classe A é excluída, a instância da classe B. também é a instância da classe B. A instância da classe B é totalmente contida pela instância da classe A, em oposição à instância da classe A, simplesmente possuindo uma referência à instância de classe B (que é uma associação regular).
Quanto ao significado da notação Composition e como ela difere da notação Aggregation, não tenho certeza.
Por favor, esclareça as definições e me ajude a entender. Exemplos concretos seriam bem-vindos.
fonte
Respostas:
Os três links Associação, Agregação e Composição formam uma espécie de escala sobre a proximidade entre duas classes.
Por um lado da escala, há Associação, onde objetos das duas classes podem se conhecer, mas não afetam a vida de cada um. Os objetos podem existir independentemente e qual objeto de classe A sabe sobre quais objetos de classe B podem variar ao longo do tempo.
No outro extremo da escala, há Composition. A composição representa um relacionamento parte-todo, de modo que a classe B é parte integrante da classe A. Esse relacionamento é normalmente usado se objetos da classe A não puderem existir logicamente sem ter um objeto da classe B.
A relação de agregação está em algum lugar entre esses dois fins, mas parece que ninguém concorda exatamente onde, portanto, também não há uma definição universalmente aceita do que significa uma agregação. Nesse sentido, as duas definições encontradas são corretas e, se você perguntar a 10 pessoas, corre o risco de obter 11 definições diferentes.
fonte
Composição é quando um
object A
contémobject B
eobject A
também é responsável pela criação doobject B
.Relação de composição
Temos uma classe A que será usada pela classe B.
Existem várias opções para a aparência da composição.
Composição de inicialização direta:
Composição de inicialização do construtor
Composição de inicialização lenta
Você vê que isso cria uma relação estreita entre as classes
A
eB
. A classeB
simplesmente não pode existir semA
. Essa é uma violação enorme do princípio de injeção de dependência , que diz:Às vezes, a composição faz sentido, como chamar
new DateTime
php ounew std::vector<int>
C ++. Mas, na maioria das vezes, é um aviso que seu design de código está errado.Em um caso, onde
class A
seria um objeto especial usado para armazenar em cache,class B
ele sempre seria armazenado em cache usando a implementação declass A
e você não teria controle para alterá-lo dinamicamente, o que é ruim.Além disso, se você usasse a composição de inicialização lenta , o que significa que você teria um trabalho
object B
, chamadouseA()
método e a criação deobject A
falhas, seuobject B
recurso será subitamente inútil.A agregação, por outro lado, é um modo de relacionamento, que segue o princípio da DI .
object B
precisa usarobject A
, você deve passar a instância já criada deobject A
paraobject B
e, se a criação deobject A
falha, nada será passado em primeiro lugar.Em resumo, a agregação é uma representação UML para o princípio de injeção de dependência , seja injeção de construtor, injeção de setter ou injeção de propriedade pública.
Estas são todas as agregações
A injeção mais apertada do construtor (
object B
não pode existir semobject A
).Mais frouxo (você pode ou não usar
object A
dentroobject B
, mas se o fizer, provavelmente deverá defini-lo primeiro).Via setter:
Via propriedade pública:
Não há realmente uma ótima maneira de justificar o uso de Agregação sobre composição, se tudo o que você está usando são implementações concretas de classes, mas quando você começa a injetar interfaces ou no caso de classes abstratas C ++, de repente a Agregação será a única maneira de cumprir seu contrato.
fonte
Além disso, um trecho do atual padrão UML:
11.5.4 Associações - Semântica - Notação
9.5.4 Classificação - Propriedades - Notação
fonte
Eu já postei uma resposta no Stackoverflow .
Basicamente, uma agregação é mais forte que uma associação simples, mas os objetos agregados podem continuar "vivendo" um sem o outro, como acontece com uma associação simples.
Uma composição é ainda mais forte que uma agregação porque a classe agregada não pode ser agregada por outras classes. Sua "vida" depende do recipiente.
fonte