2015-03-25 24 views
1

用Ruby方法名錶達意圖的最佳實踐是什麼?如何使Ruby方法顯示他們期望的類型

例如,以下內容:

class Formula 
    attr_accessor :steps 

    def find_step(key) 
    @steps.find {|s| s.name == key } 
    end 

end 

和:

class Step 
    attr_accessor :name 
end 

Formula#find_step方法需要Symbol但它可以很容易地採取Step型和檢查的名稱相匹配。我可以重新命名方法find_step_by_name,但它仍不清楚name是什麼。它是一個字符串還是一個符號?或者它是否與Step對象上的名稱相匹配?

編輯:標記爲可能的重複Does Ruby support type-hinting? 我不問是否可能,我問的是關於命名的問題。

+0

可能的重複[是否支持Ruby類型提示?](http://stackoverflow.com/questions/17685712/does-ruby-support-type-hinting) – hek2mgl 2015-03-25 01:43:49

回答

1

Ruby2.1之後我認爲以下解決方案很好。

def find_by(name:) 
    # and you can check if type of name is what you expect as you need. 
    # But that is not duck-typingy. 
end 
+0

謝謝!直到現在,我還沒有意識到Ruby所需的關鍵字參數。您定義'find_by'的方式會導致缺少關鍵字:名稱的錯誤。 – 2015-03-25 02:18:40

+0

順便說一句,你不需要引發異常。方法參數列表中的空關鍵字就足夠了。 – 2015-03-25 02:22:02

+0

是的,對,我忘記了。 – 2015-03-25 02:27:50

1

我認爲find_step_by_name明確表示name而不是step可能有一個名稱。如果您不確定是否支持字符串或符號,則允許兩者:

def find_step_by_name(name) 
    @steps.find { |s| s.name == name.to_s } 
    end 
+0

這匹配Rails的find_by_name約定來查找通過'name'屬性。 – 2015-03-25 02:15:04

+0

對不起,在我看到黃明鶴的回答之前,我標明瞭這一點。我更喜歡所需的關鍵字參數,因爲它提供了一個更簡潔的方法名稱,如果缺少必需的關鍵字,則會引發錯誤。您也可以有可選的關鍵字。 https://robots.thoughtbot.com/ruby-2-keyword-arguments – 2015-03-25 02:21:18

1

我認爲問題的最佳答案是參數名稱的好選擇。如果你打算一個符號被傳遞到您的find_by方法,爲什麼不這樣做:

def find_by(symbol) 
    @steps.find {|s| s.name == symbol } 
end 

不過,我認爲這將是最明顯的選擇:

def find_by_name(symbol) 
    @steps.find {|s| s.name == symbol } 
end 

我不同意使用關鍵字解決了這個問題。它所做的只是改變字符串或符號傳遞給方法的方式。

def find_by(name:) 
    puts name 
end 

find_by name: 'this' # name has to be passed in via hash 
find_by name: :that 

def find_by(name) 
    puts name 
end 

find_by 'this' # name is passed in directly 
find_by :that 

它並不能超過這個「名」,並不意味着在被傳遞什麼類型的對象的問題得到。

我認爲關鍵字是非常有用的,如果你傳遞多個參數到該方法,因爲它使得代碼在使用時更具可讀性。

def mass(width:, height:, density:) 
    width * height * density 
end 

mass width: 3, height: 11, density: 0.5 

這意味着你沒有它的使用制定出什麼在傳遞每次去質量法的定義。它也消除了需要得到參數順序正確。這將很好的工作:

mass width: 3, density: 0.5, height: 11 

但對於只有一個參數的方法,我覺得你只是使用關鍵字增加複雜性。

+0

我認爲@spickerman正確地指出,這個方法不應該在意它是傳遞一個字符串還是一個符號。用鴨子打字我們的方法可以更加靈活(例如,添加一個.to_s方法到Step)。但總的來說,我更喜歡使用自我記錄參數列表來縮短方法名稱。您的find_by(符號)不清楚它正在查找什麼符號,而無需查看方法定義。 – 2015-03-25 09:38:52

+0

我同意。在絕大多數情況下,參數類型應該是不相關的,我不會使用這種類型的參數命名。但在類型很重要的少數情況下,我認爲這是最明智的做法。 – ReggieB 2015-03-25 10:23:03

相關問題