如何避免代码气味(else..if)语法?

时间:2019-03-11 14:15:24

标签: python groovy jenkins-pipeline jenkins-groovy

下面是Jenkins常规脚本,用于将工件推送到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脚本,使用以下选项编写,并通过Web挂钩了多个GitLab存储库:

enter image description here

为什么pushA / pushB?因为每个推送都有自己的清单文件

如何避免else..if的代码异味?

您是否建议使用repoName作为键的哈希图?

如果是,如何在脚本启动期间注册pushX()方法?在python中,我们使用注册修饰符(在导入时运行)更新commands字典,如下所示:

enter image description here

3 个答案:

答案 0 :(得分:1)

这是与您的python大致对应的代码。但这只是将密钥关闭功能放入地图中……

httpURLConnection.getResponseCode()

答案 1 :(得分:0)

下面的代码定义了虚拟AfterTargets="PrepareForBuild"函数以模仿您示例中的函数,然后定义了一个闭包映射,其中每个闭包均调用相关的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) 仅在推送回购协议A时才使用过,为什么它需要回购名称作为参数?可能有更好的方法来组织这件事,包括上面未显示的部分。

答案 2 :(得分:0)

您可以模拟具有分配的dict的开关。贝娄一个愚蠢的例子:

#!/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