Действительно ли это - приемлемый параметр наличия в конструкторе класса?

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
5
задан JasonMArcher 23 July 2015 в 06:24
поделиться

3 ответа

Вы могли бы сделать это по рельсам, где параметры задаются в хэше:

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)
3
ответ дан 14 December 2019 в 13:25
поделиться

По своему опыту могу сказать, что сама причина разрешения параметров конструктора на большинстве языков, помимо факта повышения простоты создания экземпляров класса, состоит в том, чтобы упростить использование API.

Отдача предпочтения конструктору по сравнению с созданием экземпляра получателя / сеттера также способствует неизменности, то есть созданию объекта с помощью его конструктора и не позволяет никому изменять его свойства позже.

3
ответ дан 14 December 2019 в 13:25
поделиться

Я не знаю, как обстоит дело в Ruby, но в других языках вы обычно помещаете в сигнатуру конструктора те аргументы, которые необходимы для инициализации объекта в действительное состояние. Все остальное состояние может быть установлено с помощью сеттеров.

0
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: