Princípios Fundamentais da Composição
Deslize para mostrar o menu
Composição foca 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 classes colaborem por meio de objetos contidos. Essa abordagem torna os sistemas mais flexíveis, modulares e fáceis de manter, já que os componentes podem ser substituídos ou estendidos sem comprometer toda a estrutura.
123456789101112131415161718192021222324252627282930313233class 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, ela 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 utilizar 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 a introdução de acoplamento oculto quando os componentes dependem excessivamente dos detalhes internos uns dos outros.
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.
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 interagirem diretamente com objetos internos.
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.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo