Düzenlenebilir bir modeli veya dokümanı olan hemen hemen her projenin hiyerarşik bir yapısı olacaktır. 'Hiyerarşik düğümü' farklı varlıklar için bir temel sınıf olarak uygulamak kullanışlı olabilir. Çoğunlukla bağlantılı liste (çocuk kardeş, 2. model) birçok sınıf kütüphanesinin büyümesinin doğal yoludur, ancak çocuklar farklı tiplerde olabilir ve muhtemelen bir " nesne modeli " genel olarak ağaçlar hakkında konuşurken düşündüğümüz şey değildir.
İlk modelinizin bir ağacının (düğümünün) en sevdiğim uygulaması, bir astar (C # 'da):
public class node : List<node> { /* props go here */ }
Kendi türünüzün genel Listesinden miras alın (veya kendi türünüzün başka herhangi bir genel koleksiyonundan miras alın). Yürüyüş bir yönde mümkündür: kökü aşağı doğru oluşturun (öğeler ebeveynlerini bilmez).
Yalnızca ebeveyn ağacı
Bahsetmediğiniz başka bir model, her çocuğun ebeveynine referans verdiği modeldir:
null
|
+---------+---------------------------------+
| parent |
| root |
+-------------------------------------------+
| | |
+---------+------+ +-------+--------+ +--+-------------+
| parent | | parent | | parent |
| node 1 | | node 2 | | node 3 |
+----------------+ +----------------+ +----------------+
Bu ağacın sadece tersi yönde yürümesi mümkündür, normalde tüm bu düğümler bir koleksiyonda (dizi, karma, sözlük vb.) Saklanır ve koleksiyonda, genellikle birincil öneme sahip olmayacak bir ağaçtır.
Bu yalnızca ebeveyn ağacı genellikle veritabanı uygulamalarında görülür. Bir düğümün alt öğelerini "SELECT * WHERE ParentId = x" ifadeleriyle bulmak oldukça kolaydır. Ancak bunların nadiren ağaç düğüm sınıfı nesnelere dönüştüğünü buluruz. Durum bilgisi olan (masaüstü) uygulamalarda bunlar mevcut ağaç düğümü denetimlerine sarılabilir. Vatansız (web) uygulamalarda bile bu mümkün olmayabilir. Gördüm ki ORM-haritalama sınıf-jeneratör araçları kendileri ile bir ilişkisi olan (kıkırdama) tablolar için sınıflar oluştururken yığın taşma hataları atmak gördüm, bu yüzden belki de bu ağacın sonuçta yaygın değildir.
çift yönlü gezilebilir ağaçlar
Bununla birlikte, çoğu pratik durumda, her iki dünyanın en iyisine sahip olmak uygundur. Çocuk listesi olan ve ek olarak ebeveynlerini bilir: çift yönlü gezilebilir ağaçlar.
null
|
+--------------------+--------------------+
| parent |
| root |
| child1 child2 child3 |
+--+------------------+----------------+--+
| | |
+---------+-----+ +-------+-------+ +---+-----------+
| parent | | parent | | parent |
| node1 | | node2 | | node3 |
| child1 child2 | | child1 child2 | | child1 child2 |
+--+---------+--+ +--+---------+--+ +--+---------+--+
| | | | | |
Bu, dikkate alınması gereken daha birçok yönü beraberinde getirir:
- Ebeveynlerin bağlantılarını ve bağlantılarını kaldırma nerede uygulanır?
- iş mantığının ilgilenmesine izin verin ve yönü düğümün dışında bırakın (unutacaklar!)
- düğümleri çocuk oluşturma yöntemlerine sahiptir (yeniden sipariş vermeye izin vermez) (System.Xml.XmlDocument DOM uygulamasında Microsofts seçimi, ilk karşılaştığımda beni neredeyse çıldırdı)
- Düğümler yapıcılarında bir üst öğe alır (yeniden sıralamaya izin vermez)
- tüm add (), insert () ve remove () yöntemlerini ve düğümlerin aşırı yüklenmelerini (genellikle benim seçimim)
- sürekliliği
- Devam ederken ağaçta nasıl yürüyebilirim (örneğin ebeveyn bağlantılarını dışarıda bırakın)
- Diziselleştirmeyi kaldırdıktan sonra iki yönlü bağlantı nasıl yeniden oluşturulur (tüm ebeveynleri yeniden serileştirme sonrası eylem olarak ayarlama)
- Bildirimler
- Statik mekanizmalar (IsDirty bayrağı), özyinelemelerde özyinelemeli olarak işliyor mu?
- Olaylar, ebeveynlerden, çocuklardan aşağıya veya her iki yoldan da patlar (örneğin, Windows mesaj pompasını düşünün).
Şimdi soruyu cevaplamak için , çift yönlü gezilebilir ağaçlar (şimdiye kadar kariyerimde ve tarlamda) en yaygın kullanılan olma eğilimindedir. .Net çerçevesindeki System.Windows.Forms.Control veya System.Web.UI.Control öğelerinin Microsofts uygulamasıdır, ancak aynı zamanda her DOM (Belge Nesne Modeli) uygulamasında üst öğelerini ve bir numaralandırmayı bilen düğümler bulunur Çocuklarının Nedeni: uygulama kolaylığı üzerinde kullanım kolaylığı. Ayrıca, bunlar genellikle daha spesifik sınıflar için temel sınıflardır (XmlNode, Tag, Attribute ve Text sınıflarının tabanı olabilir) ve bu temel sınıflar, jenerik serileştirme ve olay işleme mimarileri koymak için doğal yerlerdir.
Tree, birçok mimarinin kalbindedir ve serbestçe dolaşabilmek, çözümleri daha hızlı uygulayabileceğiniz anlamına gelir.