2016-04-07 33 views
0

Ö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?

  1. Küresel statik değişkenler: Ben 3 fikirleri var sadece Constants sınıf oluşturmak ve, Constants.FOO gibi, statik alanlar olarak Constants.BAR bu params saklayın.

  2. 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.

  3. 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 Gearait 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.

+1

"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

+0

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). –

+0

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

cevap

1

Soruma ait tüm yorumlar ve cevaplar için teşekkürler. Bağımlılık enjeksiyonu tam çözümdür. Bağımlılık enjeksiyonunun nasıl çalıştığını öğrendiğim bir öğleden sonra geçirdim. Bir sınıf, yapıcıda başka sınıflar (bağımlılıklar) üretmemeli, bunun yerine argümandan bir tane almalıdır.

Ayrıca, tüm parametrelerin değerlerini sağlamak için bir veya daha fazla yapılandırma dosyasına/sınıfına da ihtiyacınız vardır.Ardından, yapılandırmaları temel alan tüm gerekli nesneleri/bağımlılıkları oluşturmak için bir enjektör/fabrika oluşturun.

0

Oluşturma parçalarını oluşturmak ve güzelce birbirine sığdırmak için builder numaralı ürününü oluşturabilirim.