Как избежать синтаксиса запаха кода (else..if)? - PullRequest
0 голосов
/ 11 марта 2019

Ниже приведен сценарий Jenkins groovy для передачи артефактов в Cloud Foundry.

    stage('stage_1'){

        if (repoName == 'a'){

            pushA(repoName)    
        }
        else if(repoName == 'b'){

            pushB(repoName)  
        }
        else if (repoName == 'c'){

            pushC(repoName)
        }else if (repoName == 'd'){

            pushD(repoName)                
        }else if (repoName == 'e'){

            pushE(repoName)
        }
    }

Это отдельный файл сценария Jenkins groovy, написанный с использованием параметра ниже, с подключением к сети из нескольких репозиториев GitLab:

enter image description here

Почему pushA / pushB?потому что каждый push имеет свой собственный файл манифеста

Как избежать else..if запаха кода?

Предлагаете ли вы хэш-карту с repoName в качестве ключа?

, если да, как зарегистрировать метод pushX() во время запуска сценария?В python мы используем регистрационный декоратор (запускаемый во время импорта) для обновления словаря commands, как показано ниже:

enter image description here

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Вот код, который приблизительно соответствует вашему питону. Однако это просто закрытие ключа на карте ...

def registry=[:]
def register(String key, Closure c){ registry[key]=c }

register('f1'){ println 'running f1' }

registry.f1() // this will call f1
0 голосов
/ 11 марта 2019

вы можете эмулировать коммутатор с отосланным диктом.Ниже приведен глупый пример:

#!/usr/bin/env python


def case1():
    print("This is case 1")

def case2():
    print("This is case 2")

def case3():
    print("This is case 3")


token_dict = {
    "case1" : case1,
    "case2" : case2,
    "case3" : case3,
}


def main():
    cases = ("case1", "case3", "case2", "case1")
    for case in cases:
        token_dict[case]()


if __name__ == '__main__':
    main()

Вывод:

This is case 1
This is case 3
This is case 2
This is case 1
0 голосов
/ 11 марта 2019

Код ниже определяет фиктивные функции pushX() для имитации функций в вашем примере, затем определяет карту замыканий, где каждое закрытие вызывает соответствующую функцию pushX(), затем ищет соответствующее закрытие по имени и вызывает его, передавая имя в качестве параметра:

def pushA(def name) { println "In pushA() with $name" }
def pushB(def name) { println "In pushB() with $name" }

def funcMap = [
    a: { pushA(it) },
    b: { pushB(it) }
]

def repoName = 'a'

// Invoke the closure mapped to 'repoName', also passing 'repoName' as a parameter.
funcMap[repoName].call(repoName)

Может быть, что-то подобное подойдет вам. Это все еще пахнет довольно плохо, хотя; если pushA() используется только когда нажимается на репо А, зачем ему имя репо в качестве параметра? Возможно, есть лучший способ организовать всю эту вещь, включая части, не показанные выше.

...