Причина 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
напрямую, его пришлось бы переписать, чтобы принять эту новую структуру.