2017-05-04 68 views
0

在這裏,我想向你展示一個演示代碼:塊運行的代碼只有在一定的條件

if ENV["PRODUCTION"] 
    user.apply_discount! 
    product.update! 
else 
VCR.use_cassette(vcr_cassette) do 
    user.apply_discount! 
    product.update! 
end 
end 

所以基本上兩次我也有同樣的代碼:

user.apply_discount! 
    product.update! 

如何我可以防止這種代碼重複嗎?你會怎麼做? 我正在考慮將代碼放在一個Block中,然後直接或者在塊中調用它。這裏有一個例子:

actions = Proc.new do 
    user.apply_discount! 
    product.update! 
end 

if ENV["PRODUCTION"] 
    actions.call 
else 
VCR.use_cassette(vcr_cassette) do 
    actions.call 
end 
end 

你有其他的想法?解決方案更好謝謝

回答

3

您的版本是明確和可讀的。

我唯一要做的是將它移動到一個通用的方法:

def do_env_specific_stuff(stuff) 
    ENV('PRODUCTION') ? stuff.call : VCR.use_cassette(vcr_cassette) { stuff.call } 
end 

然後:

stuff = proc do 
    user.apply_discount! 
    product.update! 
end 

do_env_specific_stuff(stuff) 
+0

這很酷。但是'ENV('PRODUCTION')'在方法中可以訪問,所以我們需要將它作爲參數傳遞? – SteveTurczyn

+0

@SteveTurczyn良好的通話。無需通過無處不在的可變變量:) –

2

安德烈的回答是優秀的,應該被接受。

但只是想指出的是您可以將PROC轉換成塊的,而不是調用塊中的處理...

VCR.use_cassette(vcr_cassette, &actions) 

我認爲顯式調用比較好,但只是想點出一種替代技術。