При определении аксессуаров в Ruby может быть напряженность между кратностью (которую мы все любим) и лучшей практикой.Ruby private and public accessors
Например, если я хотел бы выставить значение на экземпляре, но запретить любые внешние объекты от его обновления, я мог бы сделать следующее:
class Pancake
attr_reader :has_sauce
def initialize(toppings)
sauces = [:maple, :butterscotch]
@has_sauce = toppings.size != (toppings - sauces).size
...
Но вдруг я использую сырой переменной экземпляра, что заставляет меня дергаться. Я имею в виду, если мне нужно было обработать has_sauce перед настройкой на будущую дату, мне было бы нужно сделать намного больше рефакторинга, чем просто переопределить аксессуар. И давайте, необработанные переменные экземпляра? Blech.
Я мог бы просто игнорировать проблему и использовать attr_accessor
. Я имею в виду, любой может установить атрибут, если он действительно хочет; это, в конце концов, Рубин. Но тогда я теряю идею инкапсуляции данных, интерфейс объекта менее определен, и система потенциально намного более хаотична.
Другим решением было бы определить пару аксессоров под различными модификаторами доступа:
class Pancake
attr_reader :has_sauce
private
attr_writer :has_sauce
public
def initialize(toppings)
sauces = [:maple, :butterscotch]
self.has_sauce = toppings.size != (toppings - sauces).size
end
end
Который получает работу, но это кусок шаблонного для простого аксессору и довольно откровенно: РЭБ.
Итак, есть ли лучший, более рубиновый путь?
** Что делает работу ** Неверно! has_sauce внутри метода initialize() - это локальная переменная, а не переменная экземпляра. Вы даже не проверили свой код (который также имеет другую ошибку). ** Я имею в виду, если мне нужно было обработать has_sauce перед настройкой на будущую дату, мне было бы нужно сделать гораздо больше рефакторинга, чем просто переопределить аксессуар. ** Установка переменной экземпляра путем перехода через сеттер - хорошая практика, и использование двух модификаторов доступа - это способ выполнения этого для переменной экземпляра только для чтения. – 7stud
Самые глубокие извинения за непроверенный код и хорошо заметны. Исправлено сейчас, fwiw. Кроме того, я рад, что вы согласны с тем, что это хорошая практика, но эта реализация выглядит слегка взломанной. Наверное, только я. –