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

2024-05-14 05:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是Jenkins groovy脚本,用于将工件推送到cloudfoundry。你知道吗

    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?因为每个推送都有自己的清单文件

如何避免else..if代码气味?你知道吗

你建议用repoName作为键的hashmap吗?你知道吗

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

enter image description here


Tags: 文件脚本ifstageelsecloudfoundry工件jenkins
3条回答

下面是与python大致对应的代码。然而,这只是把关键关闭到一个地图。。。你知道吗

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

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

registry.f1() // this will call f1

你可以用一个dispached 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

下面的代码定义伪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()只在推送到repo A时使用,为什么它需要repo名称作为参数?很可能有更好的方法来组织整个事情,包括上面没有显示的部分。你知道吗

相关问题 更多 >