Articles

Aggregation vs. Composition in Object Oriented Programming

In Object Oriented Programming, há muitos tipos diferentes de relações que podem existir entre duas ou mais classes. Os dois tipos mais comuns são:

  • Herança – uma relação “é uma” relação
  • Associação – uma relação “tem uma” relação

Este blog vai fazer um mergulho profundo nos dois tipos de relações de Associação – Agregação e Composição.

Uma relação de associação entre duas classes é uma relação “tem uma”. Por exemplo:

  • A Car tem um Engine e um Wheel
  • A Person tem um Leg e um Arm
  • A Book tem Pages

Isto normalmente representa quando existem duas classes, ClassA e ClassB, e qualquer um dos dois:

  • ClassA contém ClassB como atributo, ou
  • Instâncias de ClassB são construídas dentro de ClassA

Qual é a diferença entre Agregação e Composição?

Existem dois subtipos de relações de Associação – Agregação e Composição. Qual é a diferença entre estes dois?

Composição

Composição implica que a classe contida não pode existir independentemente do recipiente. Se o recipiente for destruído, a criança também é destruída.

Toma por exemplo um Page e um Book. O Page não pode existir sem o Book, porque o livro é composto por Pages. Se o Book for destruído, o Page também é destruído.

Em código, isto geralmente refere-se à instância da criança a ser criada dentro da classe do recipiente:

class Book:
def __init__(self):
page1 = Page('This is content for page 1')
page2 = Page('This is content for page 2')
self.pages =
class Page:
def __init__(self, content):
self.content = contentbook = Book() # If I destroy this Book instance,
# the Page instances are also destroyed

Aggregation

Com uma agregação, a criança pode existir independentemente do pai.

Portanto pensando num Car e num Engine, o Engine não precisa de ser destruído quando o Car é destruído.

class Car:
def __init__(self, engine):
self.engine = engine
class Engine:
def __init__(self):
passengine = Engine()
car = Car(engine) # If I destroy this Car instance,
# the Engine instance still exists

Como são representados num diagrama UML?

Num diagrama UML, tanto a Agregação como a Composição são representadas com uma seta diamantada entre as classes. A extremidade diamantada vai para o lado do recipiente.

  • Aggregation usa um diamante aberto
  • Composição usa um diamante fechado

Aqui está um exemplo:

p>Espera que isto ajude!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *