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

时间:2010-07-09 15:23:38

标签: ruby constructor refactoring

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

代码正在运行,但我想重构它以获得良好的效果。 根据您的经验,使用没有参数和许多setter / getters方法的构造函数或类似这样的代码,使用构造函数中的所有参数来读取/保留/使用API​​作为API更容易吗?

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

你可以使用rails方式,其中选项以散列形式给出:

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)

答案 2 :(得分:0)

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