Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Princípios Fundamentais da Composição | Composição
Programação Orientada a Objetos em Python

Princípios Fundamentais da Composição

Deslize para mostrar o menu

Composição concentra-se na construção de objetos complexos por meio da combinação de componentes mais simples e independentes. Em vez de depender de herança, que cria hierarquias rígidas, a composição permite que as classes colaborem por meio de objetos contidos. Essa abordagem torna os sistemas mais flexíveis, modulares e fáceis de manter, pois os componentes podem ser substituídos ou estendidos sem comprometer toda a estrutura.

123456789101112131415161718192021222324252627282930313233
class Payment: def pay(self, amount): return f"Paid {amount}" class Inventory: def reserve(self, item): return f"{item} reserved" class Shipping: def ship(self, item): return f"{item} shipped" class Order: def __init__(self, item, price, payment, inventory, shipping): self.item = item self.price = price self.payment = payment self.inventory = inventory self.shipping = shipping def process(self): return " | ".join([ self.inventory.reserve(self.item), self.payment.pay(self.price), self.shipping.ship(self.item) ]) order = Order("Laptop", 1200, Payment(), Inventory(), Shipping()) print(order.process())

Order não implementa a lógica de pagamento, estoque ou envio por conta própria. Em vez disso, possui objetos separados (Payment, Inventory, Shipping) e os utiliza para realizar seu trabalho.

Cada componente tem uma responsabilidade, e Order apenas os coordena. Se for necessário alterar como o pagamento ou o envio funcionam, é possível substituir o componente sem modificar a classe Order.

Alguns cuidados ao usar composição incluem evitar objetos deus que acumulam componentes demais e se tornam difíceis de gerenciar, vazamento de APIs de componentes pela classe externa em vez de manter uma interface limpa, e o surgimento de acoplamento oculto quando os componentes dependem excessivamente dos detalhes internos uns dos outros.

Objetos deus
expand arrow

Um objeto deus tenta fazer demais. Ele contém muitos componentes e assume muitas responsabilidades, o que torna a classe difícil de entender, testar e manter.

Vazamento de APIs de componentes
expand arrow

Isso ocorre quando a classe externa expõe os métodos ou atributos internos de seus componentes. Em vez de fornecer sua própria interface limpa, ela força os usuários a interagir diretamente com objetos internos.

Acoplamento oculto
expand arrow

Os componentes tornam-se fortemente conectados por meio de detalhes internos. Alterar uma parte quebra inesperadamente outra porque dependem da estrutura interna um do outro em vez de contratos claros.

question mark

Qual é um risco comum ao usar composição que pode tornar o design mais difícil de manter?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 2

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Princípios Fundamentais da Composição

Composição concentra-se na construção de objetos complexos por meio da combinação de componentes mais simples e independentes. Em vez de depender de herança, que cria hierarquias rígidas, a composição permite que as classes colaborem por meio de objetos contidos. Essa abordagem torna os sistemas mais flexíveis, modulares e fáceis de manter, pois os componentes podem ser substituídos ou estendidos sem comprometer toda a estrutura.

123456789101112131415161718192021222324252627282930313233
class Payment: def pay(self, amount): return f"Paid {amount}" class Inventory: def reserve(self, item): return f"{item} reserved" class Shipping: def ship(self, item): return f"{item} shipped" class Order: def __init__(self, item, price, payment, inventory, shipping): self.item = item self.price = price self.payment = payment self.inventory = inventory self.shipping = shipping def process(self): return " | ".join([ self.inventory.reserve(self.item), self.payment.pay(self.price), self.shipping.ship(self.item) ]) order = Order("Laptop", 1200, Payment(), Inventory(), Shipping()) print(order.process())

Order não implementa a lógica de pagamento, estoque ou envio por conta própria. Em vez disso, possui objetos separados (Payment, Inventory, Shipping) e os utiliza para realizar seu trabalho.

Cada componente tem uma responsabilidade, e Order apenas os coordena. Se for necessário alterar como o pagamento ou o envio funcionam, é possível substituir o componente sem modificar a classe Order.

Alguns cuidados ao usar composição incluem evitar objetos deus que acumulam componentes demais e se tornam difíceis de gerenciar, vazamento de APIs de componentes pela classe externa em vez de manter uma interface limpa, e o surgimento de acoplamento oculto quando os componentes dependem excessivamente dos detalhes internos uns dos outros.

Objetos deus
expand arrow

Um objeto deus tenta fazer demais. Ele contém muitos componentes e assume muitas responsabilidades, o que torna a classe difícil de entender, testar e manter.

Vazamento de APIs de componentes
expand arrow

Isso ocorre quando a classe externa expõe os métodos ou atributos internos de seus componentes. Em vez de fornecer sua própria interface limpa, ela força os usuários a interagir diretamente com objetos internos.

Acoplamento oculto
expand arrow

Os componentes tornam-se fortemente conectados por meio de detalhes internos. Alterar uma parte quebra inesperadamente outra porque dependem da estrutura interna um do outro em vez de contratos claros.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 2
some-alt