2011-09-11 66 views
0

有沒有一個很好的辦法如何寫:安全地調用方法

a = one.two.three.four 

其中,「一」 - 分配,「二」 - 零。這個聲明是個例外。

如果「2」,「3」,「4」中的任何一個爲零,我想要有「a」零,否則在「a」中具有「四」的結果。

是否可以在不寫條件語句的情況下做到這一點?

回答

0
a = one.try(:two).try(:three).try(:four) 
+0

如何寫: a = one.two.three(param)[:c] – Jonas

+0

-1。我認爲'try'在像這樣的方法鏈中使用時是一種代碼異味。雖然它*是'*安全調用方法*'的解決方案,但安全調用像OP一樣鏈接在一起的方法已經發布的想法是不正確的,IMO。 – Swanand

+0

是不是嘗試導軌方法? –

4

首先,你需要知道這段代碼是否違反了Law of Demeter。如果是這樣的話,那麼正確的解決這個問題的辦法就是這樣寫不代碼

你會如何發現它是否被破壞? Here是一篇試圖解釋如何適用於Ruby語言的文章。

在你的情況下,你會把它分解成多個調用,其中有警戒子句。在電話one.two.three.four中,我們可以假設fourthree(而不是three返回的對象)的屬性。並且three將是two的財產。所以,你會在two添加一個方法:

# Note: This is an over-simplified example 
def three_four 
    return unless three 
    three.four 
end 

而且在one你會:

def two_three_four 
    return unless two 
    two.three_four 
end 

更相關的例子:

invoice.customer.primary_address.zipcode 

所以,你將有Customer#primary_address_zipcodeInvoice#customer_primary_address_zip_code(或更好的縮寫名稱,這會更有意義)

相關問題