作为一名python工程师,学会编写DRY样式代码;不是因为它是一个流行语,而是让你的代码更清晰,更容易被其他人阅读。
任何读过前同事代码的人都能理解这一点。
使用清漆,没有变量赋值,那么如何才能尝试编写DRY样式规则?
请考虑以下事项:
我有一个后端实例集群,运行apache超过10 vhosts
。需要根据vhost
重新编写前端实例。
我坚持这个:
if ( req.url ~ "^/amp/" ) {
# vhost's AMP code == xyz
if (req.http.host = "host1.com") {
set req.url = regsub(req.url, "/amp/", "/nps/$host1-brand-code/");
}
if (req.http.host = "host2.com") {
set req.url = regsub(req.url, "/amp/", "/nps/$host2-brand-code/");
}
...
}
这里令人沮丧的是重复regsub
"/nps/$host1-brand-code/"
如果发布商决定将下个月更改为/new-nps-url/$host1-brand-code
,该怎么办?我将被迫为一个集群更新许多if语句,并且我们有许多集群!
答案 0 :(得分:1)
因此,如果您不想使用VMOD的路径(尽管@ cory-shay建议的Index
vmod是一个很好的选项),那么一个选项是使用自定义子例程然后使用HTTP像在Python中一样传递参数的变量。
在你的情况下:
var
这可以让你在理论上用品牌代码做多件事。但是如果你只是做一次替换,你可以将sub ourcompany_amp_code {
set req.url = rebsub(req.url, "/amp/", "/nps/" + req.http.BRAND_CODE);
// Cleanup so it does not get passed to upstream
// Though the "_" in the name will generally prevent that
// in any case
unset req.http.BRAND_CODE;
}
sub vcl_recv {
if (req.http.host = "host1.com") {
set req.http.BRAND_CODE = "$host1-brand-code";
} else if (req.http.host = "host2.com") {
set req.http.BRAND_CODE = "$host2-brand-code";
}
call ourcompany_amp_code;
}
的主体移动到你的一系列if语句之后。
使用ourcompany_amp_code
vmod,您只需将var
的使用替换为req.http.BRAND_CODE