Я выполняю рефакторинг своего DSL-сценария Jenkins Job, чтобы сделать его более понятным, и одна из основных его частей - разбиение кода на несколько файлов.Чтобы сделать это, часть того, что мне нужно сделать, это переместить мои «строительные блоки» замыкания, которые я использую для построения модульных заданий, из области действия сценария в класс.Если я оставляю их как замыкания, я не могу получить правильную сигнатуру метода или способ его правильного вызова, и если я просто превращаю их в методы, то они ломают то, что ожидает замыкание, связанное с местом вызова.Я бы предпочел иметь возможность его рефакторинга таким образом, но трудности, с которыми я столкнулся, также заставляют меня думать, что это не совсем осуществимый проект.
Я создал новый класс и переехалмои глобально определенные замыкания в нем как статические методы и свойства, а также попытались изменить способ их вызова с помощью .call ().Я также пытался явно увидеть, поможет ли изменение аргумента delegate
, который я передал для использования this
, решить эту проблему, поскольку я могу неправильно понимать вложенные замыкания, но это также не так.
Первоначальный образец, на котором я основывал то, что у меня было сначала, был эта статья .Я прочитал все ответы на эти вопросы один два , а также некоторые другие сайты, и хотя они дали мне лучшее понимание замыканий (наряду с чтениемотличные документы), я не смог успешно диагностировать проблемы с этим конкретным отношением области действия
Оригинал:
base_emailNotification = {
PublisherContext publisherContext -> publisherContext.with {
extendedEmail {
disabled()
}
}
}
}
def createDemoJob() {
return job("jobname") {
publishers {
base_emailNotification delegate
}
}
}
createDemoJob()
Новое (попытка):
class Blocks {
static emailNotification(publisherContext) {
publisherContext.with {
extendedEmail {
disabled()
}
}
}
}
def createDemoJob() {
return job("jobname") {
publishers {
Blocks.emailNotification delegate
}
}
}
createDemoJob()
(Кроме того, вариации на эту тему, такие как не использование статических методов, попытка установить замыкание как свойство)
Я хочу скопировать имеющуюся у меня функциональность с замыканием, определенным в области действия сценария, то есть эти два будутбыть функционально эквивалентным:
publishers {
Blocks.emailNotification delegate
}
publishers {
extendedEmail {
disabled()
}
}