Diyelim ki, denilen yaygın olarak paylaşılan bir sınıfla bir uygulamanız var User
. Bu sınıf, kullanıcı, kimliği, adı, her modüle erişim düzeyleri, saat dilimi vb. Hakkındaki tüm bilgileri gösterir.
Kullanıcı verilerine açıkça sistem genelinde geniş bir şekilde atıfta bulunulmaktadır, ancak her ne sebeple olursa olsun, sistem bu kullanıcı nesnesini ona bağlı sınıflara aktarmak yerine, sadece ondan ayrı özelliklere sokacağımız şekilde kurulur.
Kullanıcı kimliğini gerektiren bir sınıf, GUID'yi userId
bir parametre olarak basitçe gerektirir , bazen ayrı bir parametre olarak iletilmek üzere kullanıcı adına da ihtiyacımız olabilir. Bazı durumlarda, bu bireysel yöntemlere iletilir, bu nedenle değerler sınıf düzeyinde hiç tutulmaz.
Her seferinde, Kullanıcı sınıfından farklı bir bilgiye erişmem gerektiğinde, parametreler ekleyerek değişiklikler yapmalıyım ve yeni bir aşırı yük eklemenin uygun olmadığı yerlerde, metoda veya sınıf yapıcısına her başvuruyu da değiştirmeliyim.
Kullanıcı sadece bir örnek. Bu kodumuzda geniş çapta uygulanmaktadır.
Bunun Açık / Kapalı prensibinin ihlali olduğunu düşünmekte haklı mıyım? Sadece var olan sınıfları değiştirme eylemi değil, aynı zamanda ilk etapta onları kurmak, böylece yaygın değişikliklerin gelecekte yapılması çok muhtemeldir?
User
Nesneye yeni geçersek, birlikte çalıştığım sınıfta küçük bir değişiklik yapabilirim. Bir parametre eklemem gerekirse, sınıfa yapılan referanslarda onlarca değişiklik yapmak zorunda kalabilirim.
Bu uygulama tarafından çiğnenmiş başka ilkeler var mı? Belki de bağımlılık inversiyonu? Bir soyutlamaya atıfta bulunmasak da, sadece bir tür kullanıcı var, bu yüzden bir Kullanıcı arayüzüne sahip olmak için gerçek bir ihtiyaç yok.
Temel savunma programlama ilkeleri gibi, diğer katı olmayan ilkeler ihlal edildi mi?
Yapıcım şöyle görünmeli:
MyConstructor(GUID userid, String username)
Veya bu:
MyConstructor(User theUser)
Onu gönderdi:
Sorunun "Pass ID or Object?" İçinde cevaplanması önerildi. Bu, her iki yoldan gitme kararının, bu sorunun özünde olan SOLID ilkelerini takip etme girişimini nasıl etkilediği sorusuna cevap vermez.
I
içeri SOLID
? MyConstructor
temelde şimdi "bir Guid
ve bir ihtiyacım var" diyor string
. Öyleyse neden bir sağlayan bir arayüze sahip değildir Guid
ve bir string
, let User
o arabirimini uygulayan ve let MyConstructor
o arayüzü uygulayan bir örneği bağlıdır? Ve eğer MyConstructor
değişim ihtiyaçları varsa , arayüzü değiştirin. - Sağlayıcıdan ziyade , tüketiciye “ait” arayüzleri düşünmek için bana çok yardımcı oldu . Öyleyse, "bir tüketici olarak bunu yapan ve bunu yapan bir şeye ihtiyacım var" yerine " sağlayıcı olarak bunu ve bunu yapabilirim " düşünün .