2009-10-21 23 views
15

Me gustaría mantener este breve. Construyo un HouseA que tiene dos salas, digamos BedRoom y StudyRoom, ambas derivadas de una clase base llamada Room. BedRoom y StudyRoom tienen un mismo elemento primario llamado House. Además, cualquier habitación de una casa puede acceder a otras habitaciones solo a través del padre. Si BedRoom tiene que acceder a cualquier atributo de StudyRoom, debe ir solo a través de House (es decir, principal) y viceversa.¿Debo usar herencia o composición?

HouseA ISA House 
HouseA HAS BedRoom and StudyRoom. 
BedRoom ISA Room 
StudyRoom ISA Room 

Ahora el problema: Digamos, voy a construir otra casa (por ejemplo HouseB), que es un exactamente el mismo que el anterior, pero con un cambio. No quiero dos habitaciones separadas (es decir, BedRoom y StudyRoom), sino una habitación individual (MasterRoom) que tiene ambas instalaciones. En aras de la reutilización de código, lo que podía pensar de las siguientes opciones de diseño:

Option-1: 
HouseB ISA House 
HouseB HAS MasterRoom 
MasterRoom ISA Room 

Aquí pierdo la capacidad de reutilizar los atributos de BedRoom y StudyRoom que creé para HouseA. Tenga en cuenta que la mayoría de los atributos de BedRoom y StudyRoom deben volverse a implementar en MasterRoom de todos modos, lo que da como resultado la duplicación del código.

Option-2: 
HouseB ISA House 
HouseB HAS MasterRoom 
MasterRoom ISA Room 
MasterRoom HAS LogicalBedroom 
MasterRoom HAS LogicalStudyRoom 
LogicalBedroom ISA BedRoom 
LogicalStudyRoom ISA StudyRoom 

De esta manera, puedo usar la composición para que pudiera volver a utilizar la mayor parte de mi código (tengo varios miles de líneas de código que podría volver a utilizar), pero el problema es que BedRoom es una clase concreta y logicalBedRoom halle ciertos atributos no son adecuados y pueden verse obligados a anular los métodos para que no hagan nada. Por ejemplo, Bedroom->noOfSides() = 4 y logicalBedRoom->noOfSides() = ??. ¿Es esto un buen uso de la herencia?

Mi diseño real es para un chip complejo que combina la funcionalidad de dos chips individuales (utilicé la analogía de House (motherboard) y Room (chip)). Codigo en Object Oriented Perl y realmente apreciaría cualquier sugerencia de diseño alternativa.

Gracias

Respuesta

19

Por qué no usar papeles para lograrlo:

House A has a Bedroom 
Bedroom does SleepingArea 
House has a Studyroom 
Studyroom does ComfyArea 

House B has a MasterRoom 
MasterRoom does SleepingArea and ComfyArea 

La manera más fácil de conseguir roles es utilizar Moose.

+1

¿Es el mismo papel que Mixin en Ruby? – rpattabi

+1

@ ragu.pattabi, los roles son similares a mixins. La principal diferencia es que los roles tienen algunos controles sobre cuándo se pueden aplicar: los roles pueden requerir que ciertos métodos estén disponibles en una clase consumidora. Hay otras diferencias, también. Uso de Perl del término mapas de roles para 'rasgos' en el mundo más amplio de la investigación OO. En Perl/Moose, un rasgo es un rol aplicado a un método que utiliza el protocolo metaobjeto, que está más allá del alcance de esta respuesta. Planteo el punto para poder evitar la apariencia de no-sequitor mientras lo dirijo a un recurso sobre rasgos en general: http://scg.unibe.ch/research/traits/ – daotoad

+0

Eso significa que los roles proporcionan un mecanismo como el método de la plantilla patrón sin el equipaje de la herencia. Eso es bastante interesante. – rpattabi

Cuestiones relacionadas