Статьи

Волшебство Groovy с …


В недавнем 
сообщении этот блог исследовал значение делегатов Closures и то, как их можно изменить. Этот пост покажет, как возможность установить делегат замыкания позволяет языку стать достаточно выразительным, когда другие языки остаются громоздкими и многословными. Для примера (
и немного забавы ) рассмотрим классный объект 
drico , представляющий легендарного ирландского игрока в регби 
Брайана О’Дрисколла

Если вы не знаете, Брайан О’Дрисколл — лучший игрок в регби из Ирландии. Он может взяться за дело, сломаться, снять нагрузку, ссориться, шакал, ударить тебя по имени. Исключительно искусный спортсмен, которого многие считают одним из величайших игроков, которых игра когда-либо видела. В случае, если вы не знаете, что такое регби, вы думаете, американский футбол без шлемов, тайм-аутов и немного более длинного овального мяча. Это в основном выше во всех отношениях. В любом случае, у нас есть 
 объект
drico в нашем Groovy-коде, и мы хотим вызвать несколько методов для него. Мы могли бы сделать:

?
RugbyPlayer drico = new RugbyPlayer();
...
drico.youWereAmazing();
drico.seriouslyYouWereAmazing();
drico.sayTotsAmazeBalls();
drico.howManyTriesDidYouScore();
drico.youreTheBest();
...

Вау, это много методов, вызываемых на Drico. Должен быть какой-то Groovy трюк, который мы могли бы сделать, чтобы уменьшить текст здесь? Помните, что лучше кодировать, чем печатать.

Ну, мы могли бы поместить все методы, которые мы хотим вызвать в Drico, в Closure, а затем установить делегат этого Closure в Drico.

?
RugbyPlayer drico = new RugbyPlayer();
...
def dricoClosure = {
youWereAmazing();
seriouslyYouWereAmazing();
sayTotsAmazeBalls();
howManyTriesDidYouScore();
youreTheBest();
...
}
dricoClosure.delegate = drico
dricoClosure();

Неплохо. Мы удалили все 
drico.и просто перешли к вызовам методов, но мы также добавили некоторый код для настройки делегата замыкания. Итак, шаг вперед, шаг назад. Мы можем избавиться от 
шага назад , используя with метод Groovy 

with Метод применим к любому объекту Groovy и принимает одно замыкание. Делегатом замыкания является объект 
with , к которому вызывается. Это означает, что мы можем сделать это:

?
RugbyPlayer drico = new RugbyPlayer();
drico.with {
youWereAmazing();
seriouslyYouWereAmazing();
sayTotsAmazeBalls();
howManyTriesDidYouScore();
youreTheBest();
...
}

Использование этого подхода означает, что мы все еще удалили все 
drico. и сразу перешли к вызовам методов. Это также означает, что нам не нужно устанавливать делегат замыкания, и нам не нужно явно вызывать замыкание. В результате получается код с гораздо лучшим соотношением сигнал / шум, который гораздо более выразителен. До следующего раза береги себя.