2009-10-21 11 views
15

Chciałbym zachować ten skrót. Buduję dom A, który ma dwa pokoje, na przykład BedRoom i StudyRoom, oba wywodzące się z klasy bazowej o nazwie Room. BedRoom i StudyRoom mają tego samego rodzica o nazwie House. Ponadto każdy pokój w domu może uzyskać dostęp do innych pomieszczeń tylko za pośrednictwem rodzica. Jeśli BedRoom ma uzyskać dostęp do dowolnego atrybutu StudyRoom, musi przejść tylko przez House (tj. Nadrzędny) i na odwrót.Czy powinienem używać dziedziczenia lub kompozycji?

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

Teraz problem: Powiedzmy, że budowa kolejnego domu (słownie HouseB), która jest dokładnie taka sama jak wyżej, ale z jedną zmianą. Nie chcę dwóch oddzielnych pokoi (tj. BedRoom i StudyRoom), ale zamiast tego pojedynczy pokój (MasterRoom), który ma obie te funkcje. Dla kodu ponownego użycia, mogę myśleć o następujących opcji projektowych:

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

Here I tracą zdolność do ponownego użycia atrybuty BedRoom i StudyRoom, który został utworzony dla HouseA. Zauważ, że większość atrybutów BedRoom i StudyRoom musi zostać ponownie zaimplementowana w MasterRoom, co spowoduje duplikację kodu.

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

ten sposób, używam kompozycję, abym mógł ponownie wykorzystać większość mojego kodu (mam kilka tysięcy linii kodu, który mógłby I ponownego wykorzystania), ale problemem jest to, że BedRoom jest beton klasy i logicalBedRoom mogą znaleźć niektóre atrybuty nie są odpowiednie i mogą być zmuszone do nadpisania metod, aby nic nie zrobiły. Na przykład Bedroom->noOfSides() = 4 i logicalBedRoom->noOfSides() = ??. Czy to jest dobre wykorzystanie dziedzictwa?

Moja aktualna konstrukcja dotyczy złożonego układu scalonego, który łączy w sobie funkcjonalność dwóch pojedynczych układów scalonych (użyłem analogii House (płyta główna) i Room (chip)). Koduję w Object Oriented Perl i naprawdę doceniam wszelkie alternatywne sugestie dotyczące projektu.

Dzięki

Odpowiedz

19

dlaczego nie korzystać role do osiągnięcia tego celu:

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 

Najłatwiej dostać roles jest użycie Moose.

+1

Czy Role jest takie samo jak Mixin w Ruby? – rpattabi

+1

@ ragu.pattabi, role są podobne do mixin. Główna różnica polega na tym, że role mają kontrolę nad tym, kiedy można je zastosować - role mogą wymagać, aby pewne metody były dostępne w klasie konsumującej. Są też inne różnice. Perl wykorzystanie terminu rola mapy do "cech" w szerszym świecie badań OO. W Perlu/Łosie cecha jest rolą stosowaną w metodzie wykorzystującej protokół meta-obiektu, która wykracza poza zakres tej odpowiedzi. Podnoszę kwestię, aby uniknąć pojawiania się niesekwencjonujących, gdy kieruję cię do zasobu o cechach w ogólności: http://scg.unibe.ch/research/traits/ – daotoad

+0

Oznacza to, że role zapewniają mechanizm taki jak metoda szablonu wzór bez bagażu dziedziczenia. To całkiem interesujące. – rpattabi

Powiązane problemy