Özellikle bazı bilimsel analiz çalışmaları için C# ile karmaşık bir masaüstü istemcisi geliştiriyorum. Projemin sınıf hiyerarşisi çok karmaşık. Sorun şu ki, büyük miktarda parametre kullanıcısı tarafından kullanıcı tarafından istemcisinin girişinde değiştirilebiliyor. Bununla birlikte, birçok parametre, sınıf hiyerarşisinde çok derindir (kompozisyon hiyerarşisi, kalıtım değil). Sonuç olarak, üst düzeylere kapatılmış sınıflar yapıcıda çok fazla argüman almalıdır, çünkü alt seviyedeki farklı sınıflardan tüm yollardan geçerler.Karmaşık bir sınıf hiyerarşisi ile büyük miktarda param nasıl işlenir?
Bunun gibi sorunların üstesinden gelmek için en iyi yöntemler nelerdir?
Küresel statik değişkenler: Ben 3 fikirleri var sadece
Constants
sınıf oluşturmak ve,Constants.FOO
gibi, statik alanlar olarakConstants.BAR
bu params saklayın.Singleton sınıfı: Bir singleton sınıfı oluşturun ve bunu programın girişinde başlatın. Bu paramları
Constants.GetInstance().FOO
gibi alın.Her sınıf için, kurucudaki imza düzeyini daha karmaşık ve karmaşık hale getiren alt düzey paramları alın. Örneğin, orta düzeyde sık kullanılan bir sınıf, kurucuda 15 argüman alabilir.
Genel değişkenleri veya tekil sık sık kullanırsam, kod çok eşleşir. Fakat eğer onları kullanmazsam, tekrar tekrar sınıf hiyerarşisi boyunca birçok paramın geçilmesi ve alınması gerekir. Peki bu sorunu çözmek için karmaşık bir ticari yazılım nasıl olurdu?
Örneğin, program en üst düzeyde bir LevelOne
nesne oluşturur. LevelOne
, LevelTwoA
ve LevelTwoB
gibi alanları içerir. Ve LevelTwoA
nesnesi, LevelThree
gibi alanları içerir. Sonra kullanıcı, LevelOne
oluştururken LevelTen
alanının değerini belirtmek isterse, LevelTen
değeri LevelOne
yapıcıdan LevelNine
'a geçirilmelidir. Bir Car
oluştururken
Ve bir örnek olarak bir Car
almak, hangi kullanıcı certian Gear
ait Radius
belirtmek istiyorsanız? Gear
nesnesi, tüm hiyerarşinin alt düzeyinde olmalıdır. Ancak, Car
yapıcıda bir argüman olarak double radiusOfACertianGear
almamalıdır, çünkü çok önemsizdir.
"Sonuç olarak, üst düzeylerde kapatılan sınıflar yapıcıda çok fazla argüman almalıdır, çünkü bunlar alt sınıflardaki farklı sınıflardan tüm yollardan geçerler" Temel tasarımın bir gözden geçirme gerektirdiği gibi görünüyor. Mevcut yaklaşım KATILMAZ ve Demeter Yasasını ihlal ediyor. – dbugger
Daha az bağımlılık istiyorsanız, @dbugger öneriyi izlemelisiniz ve nesne aktivasyonlarını yönetebilecek bir Bağımlılık Enjeksiyon çerçevesini kullanmayı düşünebilirsiniz. Yapmam gereken şey, birden fazla parametreyi POCO'lara dönüştürmektir, ki bunlar basitçe sınıf kurucularınıza enjekte edilebilir (daha sonra tekil veya tek bir performans seçeneği haline gelir). –
Bu yanıt benim için tıklattı [Bağımlılık grafiğinde derin bir iç içe geçmiş bir sınıfa bir dizi bağımlılık kümesi] (http://stackoverflow.com/questions/9295312/getting-a-set-of-dependencies-to-a -class-iç içe geçmiş-in-the-bağımlılık grafik/9295632 # 9295632). Her şey ön tarafa yaratılmıştır (yapıcılarınızı aydınlatmayın). Ve bir IOC çerçevesine göre beyanınız büyük ölçüde basitleştirilmiştir, çünkü bunu anlayabileceği sınıfları manuel olarak kaydetmeniz gerekmez. Sadece yaratılacak ilk sınıfın bağımlılıklarını da bağımlılıklar olarak aldığından emin ol. Sinek oluşturmak için gereken şeyler için, fabrikaları var. – Tone