Зачем вам частная инкапсуляция частной константы? - PullRequest
0 голосов
/ 26 февраля 2019

Я столкнулся с этим кодом:

class Foo < Bar
  SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
  private_constant :SM_CONSTANT

  private

  def some_constant
    SM_CONSTANT
  end

Я не могу понять цель инкапсуляции частной константы в закрытом методе .Зачем мне это делать?

1 Ответ

0 голосов
/ 26 февраля 2019

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

some_constant может вернуть константу сегодня, но это не обязано делать это.Если программирование по контракту, то оно обязано возвращать хеш в той форме, происхождение которой не имеет значения.

Например, у вас есть этот код сегодня, но как насчет завтра он развивается в:

class Foo < Bar
  SM_CONSTANT = {
    a: { name: 'A', priority: 2 },
    b: { name: 'B', priority: -1 }
  }.freeze
  private_constant :SM_CONSTANT

private
  def some_constant
    SM_CONSTANT.map { |k,o| [ k.to_s, o[:name] ] }.to_h
  end
end

Если внутренние компоненты полностью изменились, но для внешнего кода ничего не изменилось, одни и те же вызовы дают одинаковые результаты.Вот почему инкапсуляция важна.Это дает вам свободу перебирать и переделывать код в определенном контексте, не беспокоясь о том, чтобы ломать другие вещи.

Если бы код обращался к SM_CONSTANT напрямую, его пришлось бы переписать, чтобы принять эту новую структуру.

...