O que é composição no que se refere ao design orientado a objects?

Eu ouço (e leio neste site) muito sobre “favorecer composição sobre inheritance”.

Mas o que é o Compositon? Eu entendo a inheritance do ponto de Person: Mammal: Animal, mas eu realmente não consigo ver a definição de Compostion em lugar algum. Alguém pode me preencher?

Composição refere-se à combinação de tipos simples para criar tipos mais complexos. No seu exemplo, a composição poderia ser:

Animal: Skin animalSkin Organs animalOrgans Mammal::Animal: Hair/fur mammalFur warm-blooded-based_cirulation_system heartAndStuff Person::Mammal: string firstName string lastName 

Se você quisesse ir totalmente composição (e se livrar de toda a inheritance) ficaria assim:

 Animal: Skin animalSkin Organs animalOrgans Mammal: private Animal _animalRef Hair/fur mammalFur warm-blooded-based_cirulation_system heartAndStuff Person: private Mammal _mammalRef string firstName string lastName 

A vantagem dessa abordagem é que os tipos Mammal e Person não precisam estar em conformidade com a interface do pai anterior. Isso pode ser uma coisa boa porque às vezes uma mudança na superclass pode ter sérios efeitos nas subclasss. Eles ainda podem ter access às propriedades e comportamentos dessas classs por meio de suas instâncias privadas dessas classs e, se quiserem expor esses comportamentos de ex-superclass, podem simplesmente envolvê-los em um método público.

Encontrei um bom link com bons exemplos aqui: http://www.artima.com/designtechniques/compoinh.html

Composição é simplesmente as partes que compõem o todo. Um carro tem rodas, um motor e assentos. Herança é um relacionamento “é um”. Composição é um relacionamento “tem um”.

Existem três maneiras de dar comportamento a uma class. Você pode escrever esse comportamento na class; você pode herdar de uma class que tenha o comportamento desejado; ou você pode incorporar uma class com o comportamento desejado em sua class como um campo ou variável de membro. Os dois últimos representam formas de reutilização de código e o final – composição – é geralmente preferido. Na verdade, isso não dá à sua turma o comportamento desejado – você ainda precisa chamar o método em campo -, mas coloca menos restrições no design da sua turma e os resultados são mais fáceis de testar e mais fáceis de depurar. A inheritance tem seu lugar, mas a composição deve ser preferida.

 class Engine { } class Automobile { } class Car extends Automobile // car "is a" automobile //inheritance here { Engine engine; // car "has a" engine //composition here } 

Composição – A funcionalidade de um object é composta de um agregado de classs diferentes. Na prática, isso significa manter um ponteiro para outra class para a qual o trabalho é adiado.

Herança – A funcionalidade de um object é composta de sua própria funcionalidade e funcionalidade de suas classs pai.

Quanto ao motivo pelo qual a composição é preferida à inheritance, dê uma olhada no problema Circle-ellipse .

Um exemplo de composição é onde você tem uma instância de uma class dentro de outra class, em vez de herdar dela

Esta página tem um bom artigo explicando porque as pessoas dizem “favor composição sobre inheritance” com alguns exemplos do porquê.

Intereting Posts