Как я могу вызвать делегата в классе из другой области? - PullRequest
0 голосов
/ 18 апреля 2019

Я выполняю рефакторинг своего 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()
      }
    }
...