hay una regla general de diseño orientado a objetos que se debe modelar is-a relaciones utilizando la herencia y tiene unas relaciones usando-contención/agregación y expedición/delegación. Esto se reduce aún más por la advertencia del GoF de que generalmente se debe favorecer la contención sobre la herencia, sugiriendo, tal vez, que si se puede defender fuertemente a uno de ellos en una situación particular, esa contención generalmente debe recibir el visto bueno debido al mantenimiento problemas que la herencia a veces puede causar.vs seco "prefieren contención sobre la herencia"
entiendo el razonamiento detrás de esta forma de pensar, y no necesariamente están de acuerdo con ella. Sin embargo, cuando veo una clase con decenas de métodos, cada uno reenviando a una variable de instancia, veo una forma de duplicación de código. La duplicación de código es, en mi opinión, el último olor del código. Reimplementar un enorme protocolo de métodos simplemente porque la relación entre dos clases no es estrictamente-a parece una exageración. Es un código adicional e innecesario agregado al sistema, código que ahora necesita ser probado y documentado como cualquier otra parte del sistema, código que probablemente no habría tenido que escribir si hubiera heredado.
¿Los costes de la adhesión a este principio de contención-sobre-herencia vez mayores que sus beneficios?
¿Podría dar un ejemplo más concreto? Es demasiado abstracto para comentar sin asumir lo que quieres decir. –
Por ejemplo, desea un comportamiento tipo HashTable en una clase, pero la clase no es lo suficientemente estricta como una HashTable para justificar heredar de ella bajo la regla is-a. Pero que contenga una HashTable daría lugar a la reimplementación de una gran parte de los métodos de HashTable, la mayoría de los cuales invocaría el mismo método en la variable de instancia que contiene la HashTable. –
Mi propia opinión sobre los problemas de la herencia es que hay efectos secundarios involuntarios al heredar de las clases. Al heredar, se crean dependencias y eso afectará la mantenibilidad general del sistema. Obviamente, esto no es gran cosa si la jerarquía de herencia es poco profunda, pero si es muy profunda, puede causar problemas. – Min