2016-05-16 64 views
0

作爲一名Python工程師,學習寫DRY風格的代碼;不是因爲它是一個流行詞,但它使您的代碼更清晰,更易於閱讀。清漆變量和DRY代碼

任何忍受閱讀前同事代碼的人都能理解。

隨着清漆,沒有變量分配,所以如何甚至可以嘗試編寫DRY風格規則?

考慮以下幾點:

我有後端實例的集羣有十vhosts運行的Apache。有一個前端實例需要根據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

更換使用req.http.BRAND_CODE的你看着[清漆模塊(https://github.com/varnish/varnish-modules)?看起來他們有'vmod-var',它可以讓你設置一個你想要的變量。他們有一些[測試](https://github.com/varnish/varnish-modules/tree/master/src/tests/var)用法,[test02.vtc](https://github.com/varnish /varnish-modules/blob/master/src/tests/var/test02.vtc)可能會對你特別感興趣。 –

+0

@CoryShay這是一個很好的解決方案,非常感謝您的鏈接!我必須小心處理,因爲清漆是通過廚師在這些集羣上安裝/更新的,並且引入一個新的'so'需要注意。 –

回答

1

所以如果你不想走VMOD的路線(儘管@ cory-shay建議的var vmod是一個很好的路線),那麼一種選擇是使用自定義的子例程,然後使用HTTP變量來傳遞你的參數就像你在Python中一樣。

你的情況:

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; 
} 

這將讓你做多件事情在理論上該品牌的代碼。但是如果你只是做單一替換,你可以將ourcompany_amp_code的主體移動到你的一系列if語句之後。

使用var VMOD你可以簡單地用var.set