rubygem, который я пишу и это полезно для подсчета встречаемостей слова в тексте, я принимаю решение поместить 3 параметра в конструктора класса.
Код работает, но я хочу осуществить рефакторинг его для правильности. По вашему опыту, это легче к read/mantain/use как API класс с конструктором без параметрических усилителей и большого количества метода методов set/методов считывания или кода как этот со всеми параметрическими усилителями в конструкторе?
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
Вы могли бы сделать это по рельсам, где параметры задаются в хэше:
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.
Отдача предпочтения конструктору по сравнению с созданием экземпляра получателя / сеттера также способствует неизменности, то есть созданию объекта с помощью его конструктора и не позволяет никому изменять его свойства позже.
Я не знаю, как обстоит дело в Ruby, но в других языках вы обычно помещаете в сигнатуру конструктора те аргументы, которые необходимы для инициализации объекта в действительное состояние. Все остальное состояние может быть установлено с помощью сеттеров.