Метод или константа класса Ruby, лучшая практика

#ruby #class-constants

#ruby #класс-константы

Вопрос:

Один из моих классов ruby извлекает данные из довольно большого локального XML-файла, который будет меняться только при новом развертывании.

В этом случае лучше всего сохранить документ как константу, например:

 class Product 
  XML_DOC = Nokogiri::XML(open("#{Rails.root}/myxmlfile.xml"))
end
  

или для доступа к документу через метод класса, например:

 class Product 
 self.xml_doc
    Nokogiri::XML(open("#{Rails.root}/myxmlfile.xml"))
  end
end
  

Я думаю, что метод класса может быть правильным решением, поскольку его будет легче имитировать в тестах, но что считается лучшей практикой для хранения такого файла в памяти?

Комментарии:

1. Мне нравится ответ Джоэла на ваш конкретный вопрос, но мне не нравится ваш вопрос. 🙂 Скорее создайте экземпляр объекта product как часть настройки программы. «Мне нужен только один» не является веской причиной выбрасывать ориентацию объекта из окна.

Ответ №1:

Это наиболее распространенная идиома:

 class Product 
    def xml_doc
       @@xml_doc ||= Nokogiri::XML(open("#{Rails.root}/myxmlfile.xml"))
       return @@xml_doc
    end
end
  

||= Оператор говорит: «если переменная есть nil , вычислите результат выражения и сохраните его, в противном случае ничего не делайте». Эта идиома называется «запоминание».

Не думайте о константах как о способе оптимизации вашего кода, в Ruby они все равно не являются постоянными.

Комментарии:

1. вы можете удалить вторую строку с возвратом, она не нужна.

2. В зависимости от вашей реализации Ruby, неявный возврат может быть быстрее.