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.
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, 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.
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 interagir 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