是否可以在类构造函数中使用参数?

我正在写一个rubygem,它对于计算文本中的单词出现很有用,我选择在类构造函数中放入3个参数。

代码正在运行,但我想重构它以获得好处。 根据您的经验,更容易阅读/保护/使用API​​作为一个类,其中包含没有参数和许多setter / getters方法的构造函数或类似这样的代码,构造函数中包含所有参数?

TIA

保罗

def initialize(filename, words, hide_list) if ! filename.nil? @filename = filename @occurrences = read else @filename = STDIN @occurrences = feed end @hide_list = hide_list @sorted = Array(occurrences).sort { |one, two| -(one[1]  two[1]) } @words = words end 

您可以通过rails方式执行此操作,其中选项以散列forms给出:

 def initialize(filename = nil, options = {}) @hide_list = options[:hide_list] @words = options[:words] if filename @filename = filename @occurrences = read else @filename = STDIN @occurrences = feed end @sorted = Array(occurrences).sort { |one, two| -(one[1] <=> two[1]) } end 

然后你可以像这样调用它:

 WC.new "file.txt", :hide_list => %w(a the to), :words => %w(some words here) 

或这个:

 wc = WC.new wc.hide_list = %w(a the is) wc.words = %w(some words here) 

根据我的经验,我可以说,除了增加类实例化的容易性之外,在大多数语言中允许构造函数参数的原因是使API易于使用。

偏向于构造函数,而不是getter / setter实例化,也有助于不变性,即通过其构造函数创建对象,并且不允许任何人稍后修改其属性。

我不知道它在Ruby中是怎么回事,但在其他语言中,您通常会将这些参数放在构造函数签名中,以便将对象初始化为有效状态。 所有其他状态都可以通过setter设置。