2009-10-21 39 views
15

Bunu kısa tutmak isterim. Her ikisi de Room adında bir temel sınıftan türeyen BedRoom ve StudyRoom diyelim iki odadan oluşan bir HouseA yapıyorum. BedRoom ve StudyRoom, House adlı bir üst öğeye sahiptir. Ayrıca, bir evdeki herhangi bir oda sadece ebeveynleri aracılığıyla diğer odalara erişebilir. BedRoom, StudyRoom'un herhangi bir özelliğine erişmek zorundaysa, yalnızca House (örn. Ebeveyn) ve tersi olmalıdır. Miras veya kompozisyon kullanmalı mıyım?

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

Şimdi Sorun: yukarıdaki gibi bir tam olarak aynı olduğunu, ancak bir değişiklikle başka bir ev (diyelim HouseB), inşa diyelim. İki ayrı oda istemiyorum (yani, BedRoom ve StudyRoom), ancak bu iki özelliği de olan tek bir oda ( MasterRoom). kod yeniden kullanılabilirliği uğruna , aşağıdaki tasarım seçenekleri düşünebildiğim: Burada

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

Ben BedRoom ve ben HouseA için oluşturulan StudyRoom niteliklerini yeniden yeteneğini kaybedebilir. BedRoom ve StudyRoom özelliklerinin çoğunun zaten MasterRoom'da yeniden uyarlanması gerektiğine dikkat edin, böylece kod çoğaltmasıyla sonuçlanır.

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

Bu şekilde, benim kod çoğunu yeniden böylece (ı yeniden verebilecek kod birkaç bin hatları var), ama sorun BedRoom somut bir sınıf olması ve logicalBedRoom bulabilir kompozisyonunu kullanmak Bazı özellikler uygun değildir ve hiçbir şeyi yapmamak için yöntemleri geçersiz kılmaya zorlanabilir. Örneğin, Bedroom->noOfSides() = 4 ve logicalBedRoom->noOfSides() = ??. Bu iyi bir miras mıdır?

Gerçek tasarımım, iki ayrı yonganın işlevselliğini birleştiren karmaşık bir çip için (Ev (anakart) ve Oda (yonga) benzetimini kullandım). Nesne Yönelimli Perl kodlarım var ve alternatif tasarım önerilerini gerçekten takdir ediyorum. Bunu başarmak için rolleri kullanmayan Neden

Teşekkür

cevap

19

: roles almak için

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 

kolay yolu Moose kullanmaktır.

+1

Rol, Ruby'de Mixin ile aynı mı? – rpattabi

+1

@ ragu.pattabi, roller mikslere benzer. Asıl fark, rollerin uygulanabilecekleri zaman üzerinde bazı kontrollere sahip olmalarıdır - roller, bazı yöntemlerin tüketici sınıfında mevcut olmasını gerektirebilir. Başka farklılıklar da var. OO araştırmasının daha geniş dünyasında rol haritalarının “özellikleri” terimiyle Perl kullanımı. Perl/Moose'da bir özellik, bu yanıtın kapsamı dışında kalan meta-nesne protokolünü kullanan bir yönteme uygulanan bir roldür. Bu noktada, sizi genel olarak özelliklerin bir kaynağına yönlendirdiğim için sekans olmayan görüntülerin oluşmasını önleyebilirim: http://scg.unibe.ch/research/traits/ – daotoad

+0

Bu, rollerin şablon yöntemi gibi mekanizma sağladığını gösterir. kalıtım bagajsız desen. Bu oldukça ilginç. – rpattabi

İlgili konular