Коли використовувати def в Groovy?


23

Я вже трохи розвиваюся в Groovy зараз і мені цікаво, як часто мені слід використовувати динамічний кастинг def? Мій співробітник вважає, що ми повинні використовувати його завжди, оскільки це допомагає Гроуві якимось чином не розумію.

В даний час, коли декларується метод повернення типів і аргументів, я люблю навмисно заявляти, які об’єкти слід брати і виплюнути (для читабельності коду, а я надходжу з фону Java, це має сенс для мене) приклад:

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

Тож я гадаю, що моє запитання - це просто перевага, коли користуватися, defчи є реальна перевага користуватися ним постійно? (Я додав останній приклад, тому що вважав, що він відповідає питанню як життєздатний варіант для Groovy)


3
Дивіться тут , що ваш колега вірить в: stackoverflow.com/questions/184002 / ... .
Remigijus Pankevičius

Я бачив це запитання і відповідь фактично ще до того, як вирішив задати це питання. "Доброю практикою у великих сценаріях є завжди використовувати ключове слово" def ", щоб ви не стикалися з дивними проблемами визначення масштабів або не втручалися в змінні, яких ви не збираєтеся". -Тед Налейд. Що добре звучить для мене, коли я приймаю рішення про опущення будь-якого типу або використання def у скриптах, а як щодо оголошення типу повернення методів та типів аргументів? Яка хороша практика?
PJT

1
Гаразд, зараз я бачу вашу думку. Це питання про сильно набране та динамічне програмування. Тип дискусії, яку я намагаюся уникати через
вогненні

Відповіді:


20

Як хороша практика програмування (навіть сценаріїв), завжди слід враховувати певний (хоча і не обов'язково конкретний) тип змінної. Використовуйте defлише якщо певного типу не застосовується до змінної.

Оскільки ОП знає Java, вона не відрізняється від визначення типу Object(хоча, здається, є незначна різниця ). Тоді відповідь на це питання не відрізнятиметься від відповіді на запитання типу "чому б не завжди використовувати Objectтип на Java?"

Будучи максимально визначеним щодо типів, це знижує шанси помилок і навіть слугує самодокументацією. Якщо, якщо навмисно впроваджується динамічна логіка, то використання defможе мати багато сенсу. Це насправді одна з найбільших сильних сторін Groovy; програма може бути настільки динамічно або статично набрана, як і потрібно! Просто не дозволяйте лінощі бути причиною для використання def;-)

Наприклад, цей метод має сенс із певним типом аргументу та типом повернення:

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

в той час як цей метод має сенс для типу 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

Кожного разу, коли код, який ви пишете, буде використовуватися іншими як публічний API, ви завжди повинні надавати перевагу використанню сильних текстів, це сприяє посиленню контракту, уникає можливих помилок типу аргументів, надає кращу документацію, а також допомагає IDE з заповненням коду. Щоразу, коли код використовується лише для використання, як приватні методи, або коли IDE може легко зробити висновок про тип, тоді ви можете вільніше вирішувати, коли вводити чи ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.