Yazdığım bazı kodlara göz atarken, beni düşündüren şu yapıya rastladım. İlk bakışta yeterince temiz görünüyor. Evet, gerçek kodda, getLocation()
yöntemin tam olarak hangi yeri aldığını açıklayan daha belirgin bir adı vardır.
service.setLocation(this.configuration.getLocation().toString());
Bu durumda, service
yöntem içinde bildirilen bilinen bir türün örnek değişkenidir. this.configuration
sınıf kurucusuna dahil olmaktan gelir ve belirli bir arayüzü (bir genel getLocation()
yöntemi zorunlu kılan ) uygulayan bir sınıf örneğidir . Dolayısıyla, ifadenin dönüş tipi this.configuration.getLocation()
bilinmektedir; Özellikle bu durumda, bir java.net.URL
, oysa service.setLocation()
bir String
. İki tür Dize ve URL doğrudan uyumlu olmadığından, bazı dönüşüm çeşit yuvarlak deliğe kare peg sığdırmak için gereklidir.
Bununla birlikte , Temiz Kod'da belirtildiği gibi, Demeter Yasasına göre , C sınıfındaki bir f yöntemi yalnızca C yöntemlerini, f ile oluşturulan veya f için argüman olarak iletilen nesneleri ve C'nin örnek değişkenlerinde tutulan nesneleri çağırmalıdır . Bunun ötesindeki herhangi bir şey ( yukarıdaki özel davamdaki son , yöntem çağrısının kendisinin bir sonucu olarak oluşturulan geçici bir nesneyi düşünmediğiniz sürece, bu durumda tüm Kanun'un tartışmasız görünmesine izin verilmez).toString()
Yukarıdaki gibi bir çağrının, listelenen kısıtlamalar göz önüne alındığında, önerilmemesi veya hatta izin vermemesi gerektiğine dair geçerli bir neden var mı? Yoksa sadece aşırı nitpicky mi oluyorum?
URLToString()
Basitçe toString()
bir URL
nesneyi çağıran (geri döndürülenler getLocation()
gibi) bir parametre olarak uyguladıysam ve sonucu döndüren bir yöntem uygulayacak olsaydım getLocation()
, aynı sonucu elde etmek için çağrıyı içine sarabilirdim ; etkili bir şekilde, dönüşümü bir adım öteye taşıdım. Bu bir şekilde kabul edilebilir yapar mı? (O görünüyor yaptığı tüm biraz etrafında hareket şeyler dolayısıyla, herhangi bir fark her iki şekilde yapmak gerektiğini, sezgisel, bana. Fakat Demeter Kanunun harfi ile gidiş atıf olarak, bu günümüze dek, kabul edilebilir o zaman doğrudan bir fonksiyona bir parametre üzerinde çalışıyor olabilir.)
Bu, toString()
standart bir tür aramaktan biraz daha egzotik bir şeyle ilgili olsaydı, herhangi bir fark yaratır mıydı ?
Cevap verirken, service
değişkenin olduğu tipte davranış veya API'yi değiştirmenin pratik olmadığını unutmayın. Ayrıca, argüman uğruna, diyelim ki, geri dönüş tipini değiştirmenin getLocation()
de pratik olmadığını diyelim .