2011-03-24 35 views
6

Örnek bir kompozit sınıf şemasında yaygın olarak gördüğünüz iki işlem hakkında bir sorum var.
* GetDescendents
* GetChild (int)kompozit desen tasarım soruları

Dosya ve Dizinler olmanın yaygın bir örnek, bunu çakacağım. İlgilenen işlemin Boyut olduğunu varsayalım, bu nedenle Dosya'nın gerçek bir boyutu vardır ve Dizin, GetDescendents'ın yinelemeli yinelemesinden türetilen bir Bedene sahiptir. Çok uzak çok iyi. Sorum, müşterinin GetDescendents'ı kullanmasıyla ilgili. Belirli bir işlem için resimler olan bir dizinde dosyalara ihtiyacınız olduğunu varsayalım. Yani pratikte, GetDescendents ve Children'ın bazı kombinasyonlarını kullanarak imageFiles'i (istemcinin tüm nested imageFiles veya yalnızca root düzeyinde olmasını istediklerine göre) döndürürsünüz.

Yani bir numaralı soru, istemcinin bunu anlamasını sağlamak yerine, bir kompozit üzerinde GetImageFiles yöntemine sahip olmaz mı? Ve kabul ederseniz, GetDescendents kompozisyonun dışındaki istemci arayanlara (ImageViewer gibi) maruz kalmak için hiç pratik değil mi?

GetChild (int) hakkında ikinci soru; int tek bir çocuğu döndürmek için bir sıra pozisyon indisidir? GetDescendents içine derinlik düzeyi? Bir müşterinin bu yöntemi nasıl kullanacağıyla ilgili bir örnek ne olurdu?

Alkış,
Berryl

cevap

4

Bu sorular kompozit desen hakkında başına değil, ancak API tasarımını yapmak ve bir sınıf geliştirici olarak açık bir şekilde amacınızı iletecek nasıl büyük sorunu hakkında. Örneğin, GetChild(int) numaranızın dizine eklenmiş çocuğu vermesini istiyorsanız, GetChildAtIndex(int index); Çocuklara hiyerarşide belirli bir düzeyde vermesini istiyorsanız, bunu GetChildrenAtLevel(int level) olarak adlandırabilirsiniz (bunun çoğul olduğunu ve bir koleksiyon döndürdüğünü unutmayın).

Sınıfınızı anlaşılabilir ve kullanılabilir hale getirmek için yeterli işlemleri ortaya koymak için bir sınıf tasarımcısı olarak size kalmıştır. Resim dosyalarını dizin yapınıza almak için çok yaygın bir işlem olacağını düşünüyorsanız, bir GetAllImageFiles() yöntemini ortaya çıkarabilirsiniz. Yine de daha genel bir dizin sınıfı için, bu seçenek keyfi görünüyor ve yanlış soyutlama seviyesinde. Görüntü dosyaları neden bu kadar özel? Bunun yerine, tüm dosyaları uzantılarına dayalı olarak alabilecek daha genel bir yöntem veya sonuçları istemci tarafından sağlanan ölçütlere göre filtrelemek için bir yüklem yapan bir yöntem sağlayabilirsiniz.

+0

Tam olarak. Benim sorum şu ki * hiç * kompozisyonların bir parçası olmayan ya da en azından onunla çok yakın bir ilişkiye sahip olan müşterilere çocuk operasyonlarını ifşa etmek anlamındadır - yani, onlar GetFilesOfType gibi bir istemci sarf malzemesi üretmek için dahili operasyonlardır(). – Berryl

+0

@Berryl: sınıfınızın temsil ettiği şeye bağlıdır. "Desen" sadece bir uygulama detayıdır, önemli olan "kavram" dır. –