2009-10-21 7 views
15

Ich möchte dies kurz halten. Ich baue ein HouseA, das zwei Räume hat, sagen BedRoom und StudyRoom, die beide von einer Basisklasse Room stammen. BedRoom und StudyRoom haben einen gleichen Elternteil namens House. Außerdem kann jedes Zimmer in einem Haus nur durch die Eltern auf andere Räume zugreifen. Wenn BedRoom auf ein Attribut von StudyRoom zugreifen muss, muss es nur über House (d. H. Eltern) und umgekehrt gehen.Soll ich Vererbung oder Zusammensetzung verwenden?

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

Jetzt das Problem: Lassen Sie uns sagen, dass ich ein anderes Haus bauen (sagen wir HouseB), die eine genau die gleiche wie die oben ist, aber mit einer Änderung. Ich möchte nicht zwei getrennte Räume (d. H. BedRoom und StudyRoom), sondern stattdessen ein einzelnes Zimmer (MasterRoom), das diese beiden Einrichtungen hat. Aus Gründen der Wiederverwendbarkeit von Code, konnte ich die folgenden Gestaltungsmöglichkeiten denken:

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

Hier habe ich die Fähigkeit verlieren, die Attribute von BedRoom und StudyRoom, die ich für HouseA erstellt wiederzuverwenden. Beachten Sie, dass die meisten Attribute von BedRoom und StudyRoom trotzdem in MasterRoom erneut implementiert werden müssen, was zu Code-Duplizierung führt.

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

Auf diese Weise verwende ich Zusammensetzung so, dass ich die meisten meiner Code wiederverwenden könnte (ich habe mehrere tausend Zeilen Code, die ich wieder verwenden könnte), aber das Problem ist, dass BedRoom eine konkrete Klasse ist und logicalBedRoom finden Bestimmte Attribute sind nicht geeignet und können gezwungen sein, Methoden zu überschreiben, so dass sie nichts tun. Zum Beispiel Bedroom->noOfSides() = 4 und logicalBedRoom->noOfSides() = ??. Ist das eine gute Verwendung der Vererbung?

Mein aktuelles Design ist für einen komplexen Chip, der die Funktionalität von zwei einzelnen Chips kombiniert (ich verwendete House (Motherboard) und Room (Chip) Analogie). Ich Code in objektorientierte Perl und ich würde wirklich jede alternative Design-Vorschläge zu schätzen wissen.

Dank

Antwort

19

Warum dies nicht Rollen verwenden zu erreichen:

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 

Der einfachste Weg roles zu bekommen, ist Moose zu verwenden.

+1

Ist die Rolle identisch mit Mixin in Ruby? – rpattabi

+1

@ ragu.pattabi, Rollen sind ähnlich wie Mixins. Der Hauptunterschied besteht darin, dass Rollen einige Steuerelemente haben, wenn sie angewendet werden können - Rollen können erfordern, dass bestimmte Methoden in einer konsumierenden Klasse verfügbar sind. Es gibt auch andere Unterschiede. Die Verwendung des Begriffes "Rolle" wird in der größeren Welt der OO-Forschung als "Merkmal" bezeichnet. In Perl/Moose ist eine Eigenschaft eine Rolle, die auf eine Methode angewendet wird, die das Meta-Objekt-Protokoll verwendet, was den Rahmen dieser Antwort sprengen würde. Ich hebe den Punkt auf, damit ich das Auftreten von Nicht-Sequitor vermeiden kann, da ich Sie auf eine Ressource zu Merkmalen im Allgemeinen hinweise: http://scg.unibe.ch/research/traits/ – daotoad

+0

Das bedeutet, dass Rollen einen Mechanismus wie die Schablonenmethode bereitstellen Muster ohne das Erbe des Erbes. Das ist ziemlich interessant. – rpattabi