O Todo é Maior do que a Soma de suas Partes
-Aristotle
Esta citação é atribuída a Aristóteles. O ponto básico é o da sinergia. No livro best-seller de Stephen Covey Os 7 Hábitos das Pessoas Altamente Eficazes, o seu sexto hábito é sinergizar. O que é verdade com as organizações é verdade também na ciência da computação. O corpo de um objecto é mais valioso do que o seu indivíduo. Na informática, usamos o termo composição.
Composição
Então o que queremos dizer com composição? “Composição é um dos conceitos fundamentais na programação orientada a objetos. Ela descreve uma classe que faz referência a um ou mais objetos de outras classes em variáveis de instância. Isto permite modelar uma associação has-a entre objetos”. É assim que Stackify a descreve aqui. Pense nisto como uma orquestra. Um executante é bom, mas quando se tem todo o grupo junto, a música é mais rica e profunda.
Benefícios
O principal benefício do código criado com composição adequada é a reutilização. Se você o projetar corretamente, deve ser fácil de reutilizar. Caso contrário, pode ser bastante incómodo. Além disso, é uma API intuitiva e limpa ou Interface de Programação de Aplicações. Como um programador Java experiente, tenho ouvido muitas pessoas lamentarem o design da API de threading do Java. Um bom design deve permitir que você mude algo internamente e não mudar como os outros interagem com ele.
Exemplos
Vamos criar um exemplo para que possamos ver como é a composição em Java.
Aqui temos nossa classe Role definida.
A classe Role é usada nesta classe Employee. Em composição, você diria que a classe Employee “has-a” Role.
Esconder
Na nossa API exemplo, as classes HotDogGrinder e HotDogGrill são package-private e não podem ser acessadas de fora.
Aqui está a face pública da nossa API, HotDogMachine. Esta classe tem uma referência às duas classes internas que estamos escondendo com nosso projeto API.
Composição vs Herança
Composição e Herança podem ser confundidas pelos desenvolvedores. Como Steven Lowe aponta neste post do blog ThoughtWorks, precisamos escolher cuidadosamente qual usar.
Ele compartilha a regra básica frequentemente ouvida, “favoreça a composição em detrimento da herança”. Como com qualquer regra de ouro, precisamos entender que nem sempre se aplicam. Então vamos esclarecer algumas coisas antes de irmos mais longe.
Deixemos definir herança, já que já falamos muito sobre composição. Herança é uma das bases da programação orientada a objetos. Por exemplo, se tivermos uma classe alimentar, então a classe pão herdaria da classe alimentar. Onde composição trata de elementos que fazem parte de uma unidade maior.
Lowe nos lembra que quando você poderia usar qualquer uma delas, precisamos fazer duas perguntas diferentes. Primeiro, “A representação/implementação dos conceitos do seu domínio é uma dimensão”. Essencialmente, se ambos estão no mesmo domínio herança é provavelmente a sua melhor aposta. Segundo, “A semântica dos seus conceitos de domínio e a sua relação um com o outro é uma segunda dimensão”. Os componentes que você cria começam a ser encaminhados para outro, isto pode ser um sinal de que você pode precisar reconsiderar usando herança em vez disso.
Composição é um grande princípio no desenvolvimento de software que muitos de nós, profissionais, fazemos asneira. Eu mesmo fiz isso enquanto criava soluções que não se aproximavam corretamente. Uma rápida discussão no quadro branco com um colega ou esboçar algo num pedaço de papel pode ajudá-lo a entender quando existe uma relação “has-a” entre dois objetos. Depois de ler isto, você também deve entender os benefícios e saber como usá-lo em um exemplo. Tente construir algum exemplo e usá-lo então você deve saber se você está no caminho certo ou talvez a herança possa ser um caminho melhor.