Buna pratik olarak bakalım
Obj 3
artık Obj 4
var olduğunu biliyor . Ne olmuş yani? Neden önemsiyoruz?
DIP diyor
"Yüksek seviyeli modüller, düşük seviyeli modüllere bağlı olmamalı. Her ikisi de soyutlamalara bağlı olmalıdır."
Tamam ama, tüm nesnelerin soyutlamaları değil mi?
DIP ayrıca
"Soyutlamalar detaylara, detaylar soyutlamalara bağlı olmalıdır."
Tamam ama, nesnem düzgün bir şekilde kapsüllenmişse, bu herhangi bir ayrıntıyı gizlemiyor mu?
Bazı insanlar her nesnenin bir anahtar kelime arayüzüne ihtiyaç duyduğunu körü körüne ısrar etmeyi sever. Ben onlardan biri değilim. Eğer onları şimdi kullanmayacaksanız, daha sonra onlar gibi bir şeye ihtiyaç duymak için bir plana ihtiyacınız olduğunu körü körüne ısrar etmek istiyorum.
Kodunuz her sürümde tamamen yeniden oluşturulabiliyorsa, daha sonra ihtiyacınız olduğunda arayüzleri ayıklayabilirsiniz. Yeniden derlemek istemediğiniz bir kod yayınladıysanız ve kendinizi bir arayüz üzerinden konuşmak istediğinizi düşünüyorsanız, bir plana ihtiyacınız olacaktır.
Obj 3
Obj 4
var olduğunu bilir . Ama somut Obj 3
olup olmadığını biliyor Obj 4
mu?
İşte bu yüzden, new
her yere yayılmaması çok güzel . Eğer somut Obj 3
olup olmadığını bilmiyorsa Obj 4
, muhtemelen yaratmadığı için, o zaman daha sonra Obj 4
sokulur ve soyut bir sınıfa Obj 3
dönerseniz umursamazsınız.
Eğer bunu yapabilirseniz, o zaman Obj 4
boyunca tamamen soyut oldu. Başından itibaren aralarında bir arayüz oluşturan tek şey, birisinin yanlışlıkla şu Obj 4
anda somut olan kodu veren kod eklemeyeceğinin güvencesidir . Korumalı inşaatçılar bu riski azaltabilir, ancak bu başka bir soruya yol açar:
Obj 3 ve Obj 4 aynı pakette mi?
Nesneler genellikle bir şekilde gruplandırılır (paket, ad alanı vb.). Akıllıca gruplandırıldığında, gruplar arasında değil, bir grup içindeki olası etkiler daha olasıdır.
Özelliğe göre gruplamayı seviyorum. Eğer Obj 3
ve Obj 4
aynı grupta ve katmanda vardır o bir tane yayınlanmış ve sadece diğeri değiştirmeye gerek ederken refactor istiyorum gelmiş olacak çok düşüktür. Bu, bu nesnelerin, açık bir ihtiyacı olmadan aralarına bir soyutlama getirmekten yararlanma olasılıklarının daha düşük olduğu anlamına gelir.
Bir grup sınırını geçiyorsanız, her iki taraftaki nesnelerin bağımsız olarak değişmesine izin vermek iyi bir fikirdir.
Bu kadar basit olmalı, ancak ne yazık ki hem Java hem de C #, bunu karmaşıklaştıran talihsiz seçimler yaptı.
C # 'da her anahtar kelime arabirimini bir I
önekle adlandırmak geleneğidir . Bu, istemcileri bir anahtar kelime arayüzüyle konuştuklarını bilmeye zorlar. Bu yeniden düzenleme planına karışıyor.
Java'da daha iyi bir adlandırma kalıbı kullanmak geleneği vardır: FooImple implements Foo
Ancak, Java yalnızca anahtar kelime arabirimlerini farklı bir ikili dosyaya derlediğinden, bu yalnızca kaynak kodu düzeyinde yardımcı olur. Bu, somuttan Foo
soyut kodlara değiştiğinizde, tek bir kod karakterine ihtiyaç duymadığınızda, hala derlenmelidir.
İnsanların gerçekten ihtiyaç duyuncaya kadar resmi soyutlamayı ertelemelerini engelleyen bu belirli dillerde bu HATALAR. Hangi dili kullandığınızı söylemediniz, ancak bu sorunları olmayan bazı diller olduğunu anladınız.
Hangi dili kullandığınızı söylemediniz, bu yüzden her yerde anahtar kelime arayüzleri olacağına karar vermeden önce dilinizi ve durumunuzu dikkatlice analiz etmenizi tavsiye edeceğim.
YAGNI prensibi burada kilit bir rol oynamaktadır. Ama "Lütfen kendimi ayağımı vurmayı zorlaştır".