2009-11-24 55 views
1

我正在爲正在爲Ruby中使用的工具編寫一些API的組中工作。編寫API方法時,我的許多團隊成員使用散列表作爲方法的唯一參數,而我用指定的每個值編寫我的方法。使用哈希表作爲函數輸入

例如,一個類蘋果的定義爲:

class Apple 
    @commonName 
    @volume 
    @color 
end 

我會實例化類方法:

Apple.new(commonName, volume, color) 

我的隊友們會寫這樣的方法看上去像:

Apple.new({"commonName"=>commonName, "volume"=>volume, "color"=>color) 

我不喜歡使用散列表作爲輸入。對我來說似乎不必要的龐大,並沒有增加任何清晰的代碼。雖然在這個例子中看起來並不算什麼大問題,但我們的一些方法有超過10個參數,並且通常會有哈希表嵌套在其他哈希表中。我還注意到以這種方式使用哈希表在公共API中非常少見(net/telnet是我現在能想到的唯一例外)。

問題:我可以給我的團隊成員什麼樣的參數,以便不使用散列表作爲輸入參數。代碼的龐大程度並不充分(他們不害怕編寫200-400字符行),並且過多的內存/處理開銷將不起作用,因爲它不會成爲我們的工具使用方式的問題。

+0

你已經碰到了後期語言的一個問題:約束參數的唯一方法是命名它們。在ruby中命名參數的唯一方法是發送一個大的舊的blobby哈希表。你有我的同情心。 – 2009-11-24 20:37:02

回答

4

實際上,如果你的方法需要超過10個參數,你應該重新設計你的課程,或者吃掉污垢並使用哈希值。對於任何需要4個以上參數的方法,使用典型參數在調用方法時可能會違反直覺,因爲您必須正確記住順序。

我認爲最好的解決方案是簡單地重新設計這樣的方法,並使用像建設者或流利的模式。

3

首先,你應該讓他們使用字符串而不是符號來表示散列鍵。

使用散列的一個問題是,您必須檢查所有適當的鍵是否在其中。這對於可選參數非常有用,但對於強制性參數,爲什麼不使用該語言的內置功能呢?例如,用自己的方法,如果我這樣做,會發生什麼:

Apple.new({"commonName"=>commonName, "volume"=>volume}) 

然而,隨着Apple.new(commonName, volume),你知道你會得到一個ArgumentError。

0

命名參數使更多的自我記錄代碼,這是很好的。但除此之外,沒有太大的區別。哈希允許更多的靈活性,特別是如果你開始做任何方法別名。此外,ActiveSupport中的各種哈希方法使設置默認值和驗證輸入非常輕鬆。我想這可能不是你正在尋找的答案。