Groovy'de def ne zaman kullanılır?


23

Groovy'de bir süredir gelişiyorum ve dinamik dökümde ne sıklıkla kullanmam gerektiğini merak ediyorum def? Bir meslektaşım, Groovy'ye anlamadığım bir şekilde yardımcı olduğu için onu her zaman kullanmamız gerektiğine inanıyor.

Şu anda, yöntem geri dönüş türlerini ve argümanlarını bildirirken, hangi nesnelerin alınması gerektiğini ve tükürülmesi gerektiğini kasıtlı olarak belirtmeyi seviyorum (kod okunabilirliği için ve bir Java arkaplanından bana geliyor).

String doSomething(String something){
    //code
}
// vs
def doSomething(def somthing){
    //code
}
// vs 
def doSomething(somthing){
    // code
}

Öyleyse benim sorum benim ne zaman kullanacağımın bir tercihi defmi, yoksa her zaman kullanmanın gerçek bir avantajı mı? (Son örneği ekledim, çünkü Groovy için uygun bir seçenek olarak soruya uyduğunu hissettim)


3
İş arkadaşınızın neye inandığını görmek için buraya bakınız: stackoverflow.com/questions/184002/… .
Remigijus Pankevičius

Bu soruyu gördüm ve bu soruyu sormaya karar vermeden önce yanıtladım. "Büyük betiklerde iyi uygulama yapmak her zaman" def "anahtar sözcüğünü kullanmaktır; böylece tuhaf kapsam belirleme sorunlarıyla karşılaşmazsınız veya istemediğiniz değişkenlere müdahale etmezsiniz.” -Ted Naleid. Herhangi bir türü atlamakla veya komut dosyalarında def kullanmak arasında karar verirken hangisi bana iyi gelir, ancak yöntem dönüş türlerini ve argüman türlerini bildirmekten ne haber? İyi bir uygulama nedir?
PJT

1
Tamam, şimdi amacını anlıyorum. Bu, dinamik bir şekilde vs dinamik programlama ile ilgili bir soru.
Gelecekteki

Yanıtlar:


20

İyi programlama (hatta komut dosyası oluşturma) uygulaması olarak, her zaman bir değişken için kesin (mutlaka somut olmasa da) bir tür belirtmeyi düşünün. defYalnızca değişken için geçerli bir tür yoksa, kullanın .

OP, Java'yı bildiğinden, bir tür belirtmekten farklı değildir Object( küçük bir fark var gibi görünmektedir ). Bu sorunun cevabı o zaman şöyle bir soruyu cevaplamaktan farklı olmayacaktır: "neden her zaman ObjectJava'yı kullanmıyorsun ?"

Türler hakkında olabildiğince kesin olmak hata olasılığını azaltır ve hatta kendi kendini belgeleme işlevi görür. Oysa eğer biri bilerek dinamik bir mantık uyguluyorsa, o zaman kullanımı defçok mantıklı olabilir. Bu aslında Groovy'nin en büyük güçlü yanlarından biri; program olması gerektiği gibi dinamik veya statik olarak yazılmış olabilir! Tembellik kullanımının sebebi olmasına izin verme def;-)

Örneğin, bu yöntem belirli bir argüman tipi ve dönüş tipi ile anlamlıdır:

// def val or Object val, opens up the possibility
// of the caller sending a non-numeric value 
Number half(Number val) {  
    val/2
}

bu yöntem türü ile mantıklı def

// I'd let them pass an argument of any type; 
// type `Object` makes sense too
def getIdProperty(def val) {   
    if(val?.hasProperty('id')) {
        // I don't know the type of this returned 
        // value and I don't really need to care 
        return val.id            
    }
    else {
        throw new IllegalArgumentException("Argument doesn't have an 'id' property")
    }
}

-1

Yazdığınız kod başkaları tarafından herkese açık bir API olarak kullanılacaksa, her zaman güçlü yazma kullanımını tercih etmelisiniz, sözleşmeyi daha güçlü hale getirmeye yardımcı olur, muhtemel argümanlar yazılan hataları önler, daha iyi belgeler sağlar ve ayrıca yardımcı olur kod tamamlamalı IDE. Kod yalnızca kullanımınız için olduğunda, özel yöntemler gibi veya IDE türü kolayca çıkarsa, ne zaman yazıp yazmayacağınıza karar vermekte daha özgürsünüz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.