Böyle bir tasarımda dikkat edilmesi gereken birkaç husus vardır:
- yapısal bağımlılıklar
- mülkiyet ilişkisi (birleşme veya diğer birleşme türleri)
- navigasyon ihtiyacı
Sınıflar arasındaki yapısal bağımlılık:
Bileşen sınıflarını yeniden kullanmayı amaçlıyorsanız, gereksiz bağımlılıktan kaçınmalı ve bu tür kapalı dairesel yapılardan kaçınmalısınız.
Bununla birlikte, bazen iki sınıf kavramsal olarak güçlü bir şekilde birbirine bağlıdır. Bu durumda, bağımlılıktan kaçınmak gerçek bir seçenek değildir. Örnek: bir ağaç ve yapraklar, veya daha genel olarak bir kompozit ve bileşenleri .
Nesnelerin mülkiyeti:
Bir nesne diğerine sahip mi? Ya da başka türlü ifade edilirse: Bir nesne imha edilirse diğeri de imha edilir mi?
Bu konu Snowman tarafından derinlemesine ele alındı, bu yüzden burada ele almayacağım.
Nesneler arasında gezinme ihtiyacı:
Son bir konu navigasyon ihtiyacıdır. En sevdiğim örnek, alalım kompozit tasarım deseni ait dört Gang .
Gama ve ark. Açık bir ana referansa sahip olma potansiyelinin açıkça belirtilmesi: “ Çocuk bileşenlerinden ana babalarına referansın muhafaza edilmesi, kompozit bir yapının geçişini ve yönetimini kolaylaştırabilir ” Tabii ki sistematik bir yukarıdan aşağıya geçişi düşünebilirsiniz, ancak çok büyük bileşik nesneler için işlemleri önemli ölçüde yavaşlatabilir ve üstel bir şekilde. Doğrudan bir referans, hatta dairesel bile, bileşiklerinizin manipülasyonunu önemli ölçüde kolaylaştırır.
Örnek bir elektronik sistemin grafik modeli olabilir. Kompozit bir yapı elektronik panoları, devreleri, elemanları temsil edebilir. Modeli görüntülemek ve değiştirmek için GUI görünümünde bazı geometrik proxy'lere ihtiyacınız olacaktır. Bu durumda, kullanıcı tarafından seçilen GUI öğesinden bileşene gitmek, hangisinin ebeveyn ve kiminle ilişkili olduğunu bulmak, yukarıdan aşağıya bir arama başlatmaktan çok daha kolaydır.
Elbette, Gamma’nın da belirttiği gibi, döngüsel ilişkinin değişmezlerini sağlamak zorundasınız. Bahsettiğiniz SO sorusunun göstermiş olduğu gibi, bu zor olabilir. Ama mükemmel şekilde yönetilebilir ve güvenli bir şekilde.
Sonuç
Navigasyon ihtiyacı anlaşılmayacaktır. UML'nin modelleme notasyonunda açıkça dile getirilmiş olması sebepsiz değildir. Ve evet, dairesel referanslara ihtiyaç duyulan tamamen geçerli bir durum var.
Tek nokta bazen insanların çabucak böyle bir yöne gitme eğiliminde olmalarıdır. Bu nedenle, karar almaya karar vermeden önce dahil olan tüm 3 yönü göz önünde bulundurmaya değer.