Допустимо ли иметь параметр в конструкторе класса? - PullRequest
5 голосов
/ 09 июля 2010

Рубин, который я пишу, и это полезно для подсчета вхождений слов в тексте, я решил поместить 3 параметра в конструктор класса.

Код работает, но я хочу реорганизовать его для удобства. По вашему опыту, легче читать / поддерживать / использовать в качестве API класс с конструктором без параметров и множеством методов setters / getters или с кодом, подобным этому, со всеми параметрами в конструкторе?

ТИА

Paolo

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 ]

3 голосов
/ 09 июля 2010

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

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

3 голосов
/ 09 июля 2010

Вы можете сделать это так, как указано в хэше:

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)
0 голосов
/ 09 июля 2010

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

...