Hızlı Genel Bakış
Çözüm 3: "Paralel Sınıf Hiyerarşisi" Yazılım Tasarım Düzeni arkadaşın.
Uzun Genişletilmiş Cevap
Tasarımınız DOĞRU BAŞLADI. Optimize edilebilir, bazı sınıflar veya üyeler kaldırılabilir, ancak bir sorunu çözmek için uyguladığınız "paralel hiyerarşi" fikri SAĞDIR.
Aynı kavramla, genellikle kontrol hiyerarşilerinde birçok kez ilgilenin.
Bir süre sonra, bazen "Paralel Hiyerarşi" Tasarım Deseni veya "İkili Hiyerarşi" Tasarım Deseni olarak adlandırılan AYNI ÇÖZÜMÜ DİĞER GELİŞTİRİCİLERDEN YAPIYORUM.
(1) Hiç tek bir sınıfı tek bir sınıf hiyerarşisine böldünüz mü?
(2) Tek bir sınıfı hiyerarşi olmadan birkaç sınıfa ayırdınız mı?
Bu önceki çözümleri ayrı olarak uyguladıysanız, bazı sorunları çözmenin bir yoludur.
Ancak, bu iki çözümü aynı anda birleştirirsek ne olur?
Onları birleştirin, ve bu "Tasarım Deseni" alacak.
uygulama
Şimdi, "Paralel Sınıf Hiyerarşisi" Yazılım Tasarım Desenini kendi durumunuza uygulayalım.
Şu anda çok benzer, benzer ilişkilendirmelere veya amaçlara sahip, benzer özelliklere veya yöntemlere sahip 2 veya daha fazla bağımsız sınıf hiyerarşisine sahipsiniz.
Yinelenen kod veya üyelere ("tutarlılık") sahip olmaktan kaçınmak istersiniz, ancak aralarındaki farklar nedeniyle bu sınıfları doğrudan tek bir sınıfta birleştiremezsiniz.
Yani, hiyerarşileriniz bu rakama çok benziyor, ancak yine de birden fazla var:
................................................
...............+----------------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
...............+-------+--------+...............
...............| Common:: |...............
...............| Viewee |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Common:: |........| Common:: |..
..| Visual |........| Structural |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 1
Bu, henüz belgelendirilmemiş, Tasarım Deseni, AŞIRI BENZER HİZMETLER, BİRLEŞTİRİLMİŞTİR, TEK BİR HEDEFE GİRİLİR ve her bir ortak veya ortak sınıf alt sınıflandırma ile genişletilir.
Bu çözümün karmaşık olduğunu unutmayın, çünkü zaten birkaç hiyerarşiyle uğraşıyorsunuz, bu nedenle karmaşık bir senaryodur.
1 Kök Sınıfı
Her hiyerarşide paylaşılan bir "kök" sınıfı vardır.
Sizin durumunuzda, her bir hiyerarşi için bazı benzer özelliklere ve bazı benzer yöntemlere sahip olabilen bağımsız bir "Kompozit" sınıfı vardır.
Bu üyelerden bazıları birleştirilebilir, bu üyelerin bazıları birleştirilemez.
Yani, bir geliştiricinin yapabileceği şey, bir temel kök sınıfı yapmak ve her hiyerarşi için eşdeğer durumu alt sınıf yapmaktır.
Şekil 2'de, sadece bu sınıf için, her sınıfın ad alanını koruduğu bir diyagram görebilirsiniz.
Üyeler şimdiye kadar çıkarıldı.
................................................
...............+-------+--------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 2
Dikkat edeceğiniz gibi, her "Kompozit" sınıf artık ayrı bir hiyerarşide değil, tek bir paylaşılan veya ortak hiyerarşide birleştiriliyor.
Sonra, aynı olan üyeleri, üst sınıfa ve farklı olanları her temel sınıfa ekleyelim.
Ve bildiğiniz gibi, temel sınıfta "sanal" veya "aşırı yüklenmiş" yöntemler tanımlanır, ancak alt sınıflarda değiştirilir. Şekil 3 gibi.
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Composite |.............
.............+--------------------+.............
.............| [+] void AddChild()|.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 3
Bazı üyeleri olmayan bazı sınıflar olduğunu ve bu sınıfları kaldırmak için cazip olabilir DONT unutmayın. Bunlara "İçi Boş Sınıflar", "Sayısal Sınıflar" ve diğer isimler denir.
2 Alt Sınıflar
İlk şemaya geri dönelim. Her "Kompozit" sınıf, her hiyerarşide bir "Viewee" alt sınıfına sahipti.
İşlem her sınıf için tekrarlanır. Şekil 4'ten ziyade, "Common :: Viewee" sınıfı "Common :: Composite" ten aşağı iner, ancak basitlik için "Common :: Composite" sınıfı diyagramdan çıkarılır.
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Viewee |.............
.............+--------------------+.............
.............| ... |.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 4
"Canvas :: Viewee" ve "SVG :: Viewee" ifadelerinin, daha uzun olan ilgili "Kompozit" tan değil, ortak "Common :: Viewee" den indiğini göreceksiniz.
Şimdi üyeleri ekleyebilirsiniz.
......................................................
.........+------------------------------+.............
.........| Common:: |.............
.........| Viewee |.............
.........+------------------------------+.............
.........| [+] bool Validate() |.............
.........| [+] Rect GetAbsoluteBounds() |.............
.........+-------------+----------------+.............
.......................|..............................
.......................^..............................
....................../.\.............................
.....................+-+-+............................
.......................|..............................
..........+------------+----------------+.............
..........|.............................|.............
..+-------+---------+........+----------+----------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+-----------------+........+---------------------+..
..| |........| [+] Viewee Element |..
..+-----------------+........+---------------------+..
..| [+] void Paint()|........| [+] void addChild() |..
..+-----------------+........+---------------------+..
......................................................
Figure 5
3 İşlemi Tekrarlayın
Süreç devam edecek, her sınıf için "Canvas :: Visual" "Canvas :: Viewee" den aşağı inmeyecek, "Commons :: Visual" dan, "Canvas :: Structural" dan aşağı inmeyecektir "Canvas :: Viewee "," Commons :: Structural "dan buit.
4 3D Hiyerarşi Şeması
Birkaç katman, üst katman, "Ortak" hiyerarşisi ve alt katmanlar, her ek hiyerarşiye sahip bir 3D diyagramı almayı bitireceksiniz.
Buna benzer bir şeyin olduğu orijinal bağımsız sınıf hiyerarşileriniz (Şekil 6):
.................................................
..+-----------------+.......+-----------------+..
..| Common:: |.......| SVG:: |..
..| Composite |.......| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Viewee |.......| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Visual |.......| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Rect |.......| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 6
Bazı sınıfların atlandığını ve tüm "Canvas" hiyerarşisinin basit bir şekilde atlandığını unutmayın.
Son entegre sınıf hiyerarşisi buna benzer bir şey olabilir:
.................................................
..+-----------------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Composite |...\+..| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Viewee |...\+..| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Visual |...\+..| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Rect |...\+..| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 7
Bazı sınıfların atlandığını ve tüm "Canvas" sınıflarının basit bir şekilde atlandığını, ancak "SVG" sınıflarına benzer olacağını unutmayın.
"Ortak" sınıflar, 3B diyagramın tek bir katmanı, başka bir katmandaki "SVG" sınıfları ve üçüncü bir katmandaki "Canvas" sınıfları olarak temsil edilebilir.
Her katmanın, her sınıfın "Ortak" hiyerarşisinin üst sınıfına sahip olduğu ilk katmanla ilişkili olup olmadığını kontrol edin.
Kod uygulaması, Programlama Dilinizin desteklediğine bağlı olarak, arabirim devralma, sınıf devralma veya "mixins" öğelerinin kullanılmasını gerektirebilir.
özet
Herhangi bir programlama çözümü olarak, optimizasyona acele etmeyin, optimizasyon çok önemlidir, ancak kötü bir optimizasyon, orijinal problemden daha büyük bir sorun haline gelebilir.
"Çözüm 1" veya "Çözüm 2" nin uygulanmasını önermiyorum.
"Çözüm 1" de geçerli değildir, çünkü her durumda kalıtım gereklidir.
"Çözüm 2", "Mixins" uygulanabilir, ancak sınıflar ve hiyerarşiler tasarlandıktan sonra uygulanabilir.
Mixins, arayüz tabanlı miras veya sınıf tabanlı çoklu miras için bir alternatiftir.
Benim önerdiğim Çözüm 3, bazen "Paralel Hiyerarşi" Tasarım Deseni veya "Çift Hiyerarşi" Tasarım Deseni olarak adlandırılır.
Birçok geliştirici / tasarımcı buna katılmayacak ve var olmaması gerektiğine inanacak. Ancak, miself ve diğer geliştiriciler tarafından, sorunuz gibi sorunlara ortak bir çözüm olarak kullandım.
Başka bir eksik şey. Önceki çözümlerinizde ana sorun, "mixins" veya "arayüzler" kullanmak için daha uygun değil, ilk olarak sınıflarınızın modelini düzeltmek ve daha sonra mevcut bir Programlama Dili özelliğini kullanmaktı.