2016-03-15 46 views
0

我有很多的命名參數,一些使用默認值的方法:方式重構命名參數使用默認值

def myClass 
    def initialize(a:, b:, c:, d:, e:, f:, g: nil, h: nil, i: nil) 
    ... 
    end 
end 

名單是有點硬來看待和理解。我正在尋找更簡單的方法。

使用了ARGS哈希,

myClass.new(**args) 

的作品,但我不能有和沒有價值的兩個符號。

有沒有辦法讓這個更簡單?

+0

命名參數可以提高質量。爲什麼要刪除它們如果很難查看,只需在參數列表中使用換行符。還要看看是否有些參數屬於一起,應該收集在一個結構或對象中。 – Meier

回答

0

你可以試試這個

def myClass 
    def initialize(args) 
    [:a, :b, :c, :d, :e, :f].each do |a| 
     raise ArgumentError.new unless args.has_key?(a) 
    end 
    ... 
    end 
end 

args是一個哈希對象。

0

可能有些情況下函數需要大量的參數,但通常這表明函數在一個地方做了太多事情。

好吧,如果你想這樣做,我想將其移動到一個特殊的私有方法:

class MyClass 
    def initialize(*args) 
    args = set_defaults(args) 
    end 

    private 

    def set_defaults(args) 
    # step 1: extract the options hash and check the keys, 
    # if a key doesn't exist so put it in with the default value 
    options = args.extract_options! 
    [g: :state, h: 'a name', i: 5].each do |key, value| 
     options[key] = value unless options.key?(key) 
    end 
    # step 2: check the other array elements 
    [:a, :b, :c, :d, :e, :f].each do |element| 
     raise ArgumentError.new unless args.include?(element) 
    end 
    # step 3: put them all together again 
    args << options 
    end 
end 

BTW:​​不起作用。這是class ClassName。另外請看看美麗的ruby style guide - naming

+0

'options [key]'如果'key'不存在則總是返回'nil',因此明確地將其設置爲'nil'是不必要的。 – engineersmnky

+0

沒錯。其意圖是展示一種設置默認參數的方法。我將編輯代碼並設置一些不同的參數。 – guitarman