DEV Community

João Paulo Oliveira
João Paulo Oliveira

Posted on • Edited on

Elucidando as diferenças entre associação, agregação e composição em POO

Em POO (Programação Orientada Objetos) é comum utilizarmos um objeto para executar um comportamento específico dentro de outro objeto, ou até mesmo compor agregando mais informações. Isso ocorre quando há relacionamento os objetos dentro de uma sistema que se comunicam entre si.

Podemos definir relação entre objetos em três tipos: associação, agregação e composição. Abaixo falarei mais sobre eles.

Associação

Para identificar a relação de associação entre dois objetos basta entender se entre eles não existe dependência, ou seja, se são independentes.

Por exemplo, Aluno e Curso, um Aluno pode ter vários Cursos e consequentemente um Curso pode conter vários Alunos. Veja, o Aluno pode existir sem um Curso assim como Curso pode existir sem Aluno. Um relacionamento de muitos para muitos.

class Aluno() {
    val cursos: MutableList<Curso> = mutableListOf()
    fun add(curso: Curso) {cursos.add(curso)}
} 
Enter fullscreen mode Exit fullscreen mode
class Curso() {
    val alunos: MutableList<Aluno> = mutableListOf()
    fun add(aluno: Aluno) {alunos.add(aluno)}
} 
Enter fullscreen mode Exit fullscreen mode

A relação entre ambos é eventual.

Agregação

Diferente da associação, o relacionamento por agregação ocorre quando há exclusividade em uma das partes deste relacionamento.

Um exemplo, Funcionário e Departamento, Departamentos podem ter vários Funcionários e Funcionário pode estar vinculado a um Departamento. Porém perceba que Funcionário pode existir sem o vínculo ao Departamento e o mesmo não tem dependência de Funcionário para existir. Um relacionamento de muitos para um.

class Departamento() {
    val funcionarios: MutableList<Funcionario> = mutableListOf()
    fun add(funcionario: Funcionarios) {funcionarios.add(funcionario)}
}
Enter fullscreen mode Exit fullscreen mode
class Funcionario() {
    val departamento: Departamento? = null
}
Enter fullscreen mode Exit fullscreen mode

Composição

Muito parecida com agregação, o relacionamento por composição ocorre quando um objeto depende estritamente de outro objeto.

Por exemplo, Carro e Motor, Carro deve ter um Motor assim como a existência de um motor está particularmente ligada a existência de um Carro. Um relacionamento de um para um.

class Motor() {}
Enter fullscreen mode Exit fullscreen mode
class Carro() {
    val motor: Motor = Moto()
}
Enter fullscreen mode Exit fullscreen mode

Conclusão

Associação, agregação e composição é a dependência existente entre objetos e como eles se relacionam. Não há diferença na maneira de implementá-los e sim como irão se comportar. Devemos pensar o seguinte para quando utilizarmos:

Se ambos os objetos da relação são independentes, isto é uma associação.
Se um dos objetos da relação compõe o todo mas não é dependente, isto é uma agregação.
Se os objetos da relação dependem um do outro compondo o todo, isto é uma composição.

Saber identificar as diferenças entre os relacionamentos de objetos em POO e aplicá-las teremos um código mais coeso e manutenível.

Top comments (0)