Demeter yasasına göre, bir sınıf üyelerinden birini iade edebilir mi?
Evet kesinlikle.
Ana noktalara bakalım :
- Her birim diğer birimler hakkında sadece sınırlı bilgiye sahip olmalıdır: sadece mevcut birim ile ilgili "yakından" birimler.
- Her birim sadece arkadaşlarıyla konuşmalıdır; yabancılarla konuşma.
- Sadece yakın arkadaşlarınızla konuşun.
Bunların üçü de size bir soru soruyor: Arkadaş kim?
Ne döneceğine karar verirken, Demeter Yasası veya en az bilgi ilkesi (LoD), onu ihlal etmekte ısrar eden kodlayıcılara karşı savunmanızı gerektirmez. Kodlayıcıları ihlal etmeye zorlamamanızı gerektirir.
Bunların kafasını karıştırmak, birçoğunun neden bir ayarlayıcının her zaman geçersiz kalması gerektiğini düşünmesidir. Hayır. Sistemin durumunu değiştirmeyen sorgular (alıcılar) oluşturmanın bir yolunu kullanmalısınız. Bu temel komut sorgusu ayırmasıdır .
Bu, istediğiniz herhangi bir kod zincirini araştırmakta özgür olduğunuz anlamına mı geliyor? Hayır. Birlikte zincirleme sadece zincirleme kastedilen şeydi. Aksi takdirde zincir değişebilir ve aniden eşyalarınız bozulur. Arkadaşlar tarafından kastedilen budur.
Uzun zincirler için tasarlanabilir. Akıcı arayüzler, iDSL, çoğu Java8 ve iyi eski StringBuilder, uzun zincirler oluşturmanıza izin vermek içindir. LoD'yi ihlal etmezler çünkü zincirdeki her şey birlikte çalışmak içindir ve birlikte çalışmaya devam edeceğine söz vermiştir. Birbirinizi hiç duymayan şeyleri birbirine zincirlediğinizde demeter ihlal ediyorsunuz. Arkadaşlar zincirinizi çalışmaya devam edeceğine söz veren kişilerdir. Arkadaşların arkadaşları yoktu.
Fabrika ve inşaatçı sınıfları gibi nesneleri döndürmek için özel olarak atanan sınıflar dışında, bir nesnenin, örneğin sınıfın özelliklerinden biri tarafından tutulan bir nesnenin veya demeter yasasını ihlal eden bir nesnenin döndürülmesi uygun mudur (1) ?
Bu sadece demeti ihlal etme fırsatı yaratır. Bu bir ihlal değil. Bu hiç de fena değil.
Demeter yasasını ihlal ederse, geri döndürülen nesnenin bir veri parçasını temsil eden ve bu veriler için alıcılardan başka bir şey içermeyen değişmez bir nesne olması önemli midir?
Değişmez iyidir ama burada önemsizdir. Daha uzun bir zincirden geçmek, onu daha iyi yapmaz. Onu daha iyi yapan şey, kullanımı elde etmekten ayırmaktır. Kullanıyorsanız, parametre olarak neye ihtiyacınız olduğunu sorun. Yabancıların avcılarına girerek bunun için avlanmayın.
Sahte kodda:
Demeter yasasının yukarıdaki gibi bir modeli yasakladığından şüpheleniyorum. Yasayı ihlal etmeden (3) doSomethingElse () yönteminin çağrılmasını sağlamak için ne yapabilirim?
Konuşmak önce yaklaşık x.doSomethingElse(a)
sen ikonların yazdım anlıyoruz
b.getA().doSomething()
Şimdi, LoD nokta sayma egzersizi değildir . Ancak bir zincir oluşturduğunuzda, A
(kullanarak B
) nasıl alacağınızı ve nasıl kullanılacağını bildiğinizi söylüyorsunuz A
. Peki şimdi A
ve B
yakın arkadaş olsan iyi olur çünkü onları bir araya getirdin.
Sen sadece edecek bir şeyler istedi olsaydı bir A
şey gibi kullanmak olabilir A
ve geldiği ve nerede bakım olmazdı B
alma ile hayat mutlu ve saplantı serbest yaşayabilir A
dan B
.
Gelince x.doSomethingElse(a)
nerede ayrıntıları olmadan x
geldi LoD bu konuda söylenecek hiç bir ilgisi yoktur.
LOD kullanımı inşaattan ayırmayı teşvik edebilir . Ama ben dinsel olarak her nesneye dostça davranırsanız, statik yöntemlerle kod yazmaya sıkışıp kalacağınıza dikkat çekeceğim. Bu şekilde ana olarak harika karmaşık bir nesne grafiği oluşturabilirsiniz, ancak sonunda çalışmayı başlatmak için üzerine bir yöntem çağırmanız gerekir. Sadece arkadaşlarınızın kim olduğuna karar vermelisiniz. Bundan kaçmak yok.
Yani evet, bir sınıfın LoD kapsamında üyelerinden birini iade etmesine izin verilir. Bunu yaptığınızda, o üyenin sınıfınızla dost olup olmadığını açıkça belirtmelisiniz çünkü eğer değilse, bazı müşteriler kullanmadan önce onu almak için sizi bu sınıfa bağlamayı deneyebilir. Bu önemlidir, çünkü şimdi geri döndüğünüz şey her zaman bu kullanımı desteklemelidir.
Bunun sadece bir endişe olmadığı birçok durum var. Koleksiyonlar bunu görmezden gelebilir, çünkü onları kullanan her şeyle arkadaş olmak içindir. Benzer şekilde değer nesneleri herkesle dosttur. Ancak, bir çalışan nesnesinin bir adresden çıkarılmasını isteyen bir adres doğrulama yardımcı programı yazdıysanız, sadece adresi isteyin, çalışanın ve adresin aynı kütüphaneden gelmesini umarsınız.