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
Rol, Ruby'de Mixin ile aynı mı? – rpattabi
@ 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
Bu, rollerin şablon yöntemi gibi mekanizma sağladığını gösterir. kalıtım bagajsız desen. Bu oldukça ilginç. – rpattabi