我写的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
答案 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设置。