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 umEngine
e umWheel
- A
Person
tem umLeg
e umArm
- A
Book
temPages
Isto normalmente representa quando existem duas classes, ClassA
e ClassB
, e qualquer um dos dois:
-
ClassA
contémClassB
como atributo, ou - Instâncias de
ClassB
são construídas dentro deClassA
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!