В недавнем
сообщении этот блог исследовал значение делегатов 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.
и сразу перешли к вызовам методов. Это также означает, что нам не нужно устанавливать делегат замыкания, и нам не нужно явно вызывать замыкание. В результате получается код с гораздо лучшим соотношением сигнал / шум, который гораздо более выразителен. До следующего раза береги себя.