Na programação, código reutilizável é o uso de software existente para criar um novo software usando os princípios de reutilização. A reutilização do código é considerada uma funcionalidade produtiva fundamental em negócios intensivos em tecnologia da informação. É promovido em sistemas orientados a objetos, estabelecendo relacionamentos entre classes. Existem duas maneiras fundamentais de estabelecer esses relacionamentos na programação orientada a objetos - Herança e Composição. Implementar herança é uma maneira de relacionar classes, mas o OOP fornece um novo tipo de relacionamento entre as classes, chamado composição. Ao estabelecer um relacionamento entre classes novas e existentes, uma nova classe pode herdar ou incorporar o código de uma ou mais classes existentes.
Na OOP, herança é a metodologia pela qual um objeto adquire as características de um ou mais outros objetos. É uma das ferramentas mais poderosas na implementação da reutilização de código no OOP. Ao usar a herança, uma nova classe pode ser criada estabelecendo relacionamentos pai-filho com as classes existentes. A composição de objetos é uma alternativa à herança de classe. O uso de um objeto em outro objeto é conhecido como composição. Em muitas ocasiões, você deseja usar um objeto como um campo em outra classe, porque é fácil criar classes complexas usando classes bem escritas e bem projetadas como componentes. Isso é chamado de composição. Bem, tanto a herança quanto a composição fornecem funcionalidade equivalente em muitos casos; a composição do objeto é um modelo de reutilização melhor do que a herança de classe. Este artigo compara as duas abordagens.
A herança é uma das ferramentas mais poderosas na implementação da reutilização de código na programação orientada a objetos. Refere-se à funcionalidade pela qual um objeto adquire as características de um ou mais outros objetos. Herança em C ++ significa que você pode criar classes que derivam seus atributos de classes existentes. Isso significa que você especializou uma classe para criar um relacionamento is-a entre as classes, o que resulta em um forte acoplamento entre as classes base e derivada. A implementação da herança promove a reutilização do código porque novas classes são criadas a partir de classes existentes. A herança de classe também facilita a modificação da implementação que está sendo reutilizada. Mas a herança de classe também tem algumas desvantagens. Primeiro, como a herança é definida no tempo de compilação, você não pode alterar as implementações herdadas das classes pai no tempo de execução.
OOP fornece ainda outro relacionamento entre classes chamado composição, que também é conhecido como um relacionamento tem-um. Se os recursos de um objeto precisarem fazer parte de outro objeto, o relacionamento exigirá composição. Para compor uma classe a partir de classes existentes, um objeto de cada classe deve ser declarado como o membro da nova classe. Em palavras simples, o uso de um objeto em outro objeto é conhecido como composição. Muitas vezes, você pode querer usar um objeto como um campo dentro de outra classe. Você usa um objeto dentro de uma classe na composição. Diferentemente da herança de classe, a composição de objetos é definida dinamicamente em tempo de execução, por meio de objetos que adquirem referências a outros objetos. Além disso, a composição fornece uma maneira melhor de usar um objeto sem comprometer os detalhes internos do objeto, que é onde a composição é útil.
Embora a herança e a composição promovam a reutilização do código no sistema orientado a objetos, estabelecendo relacionamentos entre as classes e fornecendo funcionalidade equivalente de várias maneiras, eles usam abordagens diferentes. Com a herança, você pode criar classes que derivam seus atributos de classes existentes. Portanto, ao usar a herança para criar uma classe, você pode expandir uma classe existente. Pelo contrário, o uso de um objeto em outro objeto é conhecido como composição. A composição de objetos é uma alternativa à herança de classe. Se os recursos de um objeto precisarem fazer parte de outro objeto, o relacionamento exigirá composição.
Na herança, você especializa uma classe para criar um relacionamento "é-a" entre as classes, o que resulta em um forte acoplamento entre as classes base e derivada. Ele permite que uma hierarquia de classes seja projetada e a hierarquia começa com a classe mais geral e passa para classes mais específicas. Ao implementar a herança, as funções de membro de uma classe se tornam propriedades de outra classe sem codificá-las explicitamente dentro da classe. Na composição, você usa um objeto dentro de uma classe e quaisquer solicitações para o objeto são encaminhadas para o objeto. Os detalhes internos não são expostos um ao outro na composição, portanto, é um relacionamento "tem um".
A herança de classe é definida no tempo de compilação, portanto, você não pode alterar as implementações herdadas das classes pai no tempo de execução. Como a herança expõe uma subclasse a detalhes da implementação de seu pai, ela freqüentemente quebra o encapsulamento. Quaisquer alterações na classe pai serão refletidas na subclasse, o que pode criar problemas ao tentar reutilizar uma subclasse. A composição de objetos, pelo contrário, é definida dinamicamente em tempo de execução através de objetos que adquirem referências a outros objetos. E como os objetos são acessados apenas por meio de suas interfaces, ele não quebra o encapsulamento. Qualquer objeto pode ser substituído no tempo de execução por outro objeto, desde que tenha o mesmo tipo.
Em muitas ocasiões, convém usar um objeto como um campo em outra classe, porque classes mais complexas são mais fáceis de criar usando classes bem escritas e bem escritas anteriormente. É aqui que você usa a composição. A herança fornece uma maneira de reutilizar o código estendendo uma classe com o mínimo esforço; é por isso que a herança é uma ferramenta valiosa no estabelecimento de relacionamentos entre classes. Em geral, é preferível usar a composição, pois fornece uma maneira de usar um objeto sem comprometer os detalhes internos do objeto que é onde a composição é útil. A herança não é isenta de problemas, mas, como herança, a composição de objetos suscita preocupações semelhantes de desempenho em relação à criação e destruição de objetos..