Recentemente peguei uma relacao IS-A e transformei numa HAS-A na forca bruta, ou seja, peguei uma arquitetura baseada em heranca e classes abstratas e transformei numa baseada em pura composicao mais wrappers.
Client interface -> AbstractClient -> AbstractTcpClient -> AsciiLineTcpClient
foi transformado em:
Client -> BaseClient
TcpClient contem BaseClient e é também um Client
AsciiLineTcpClient contem TcpClient e é também um Client.
Um client se comunica com outro via ClientListener, e delega a maioria dos métodos para o client que ele contém via delegation.
A bola que quero levantar para o debate é:
Tirando os famigerados testes unitários, que entendo são beneficiados por composicão e dificultados por heranca, quais seriam as outras vantagens de composicao sobre heranca?
Eu trabalhei num lugar que dava preferencia por heranca e agora estou trabalhando num lugar que dá preferencia por composicão. As minhas impressões:
:arrow: Heranca é mais dificil de ser feito direito, mas uma vez feito o código fica mais bonito, limpo e de melhor compreecão.
:arrow: Protected foi disponibilizado para facilitar de o cara fazer milhões de cagadas com heranca. Dá muito bem para programar com heranca sem variáveis protected.
:arrow: Métodos protected até fazem um certo sentido, pelo menos essa é minha impressão.
:arrow: Composicão funciona também mas a arquitetura é menos natural, parecendo um Matrioshka. Fica mais difícil do cara olhar e entender o que acontece.
:arrow: Heranca é mais difícil de fazer direito, mas se o cara faz direito fica bonito. Composicao é mais seguro e menos propicio do cara fazer cagada.
Nota: Estou falando em claramente favorecer composicao (mesmo quando é possível haver uma relacao is-a) através de wrappers via interfaces, ou seja, ao invés do meu AsciiLineTcpClient extender um TcpClient, ele CONTEM o TcpClient e implementa o Client para delegar.
O pessoal fala de polimorfismo e heranca, mas com interfaces também é possível obter polimorfismo.
Fica colocando um objeto dentro do outro não me parece muito natural e fica mais difícil de entender porque olhando uma classe vc nunca vai saber quantas camadas tem ali. Quando vc tem heranca isso fica claro.
Seria isso uma questão de gosto? Opiniões?