Как я могу гарантировать, что зарезервированное слово не будет конфликтовать с Ruby, Rails 4 или драгоценным камнем в моем списке драгоценных камней?

У меня есть приложение Rails4, к которому я хочу добавить модель с именем «Параметры». Это хороший выбор с точки зрения назначения моделей, но я беспокоюсь, что это также распространенный термин программирования.

Какова наилучшая практика (отдельные шаги) для обеспечения того, чтобы:

Parameters  
parameter.thing

... не будет конфликтовать с зарезервированным словом в Ruby, Rails или в моем конкретном списке Gem?


person Perry Horwich    schedule 30.07.2016    source источник


Ответы (2)


В Ruby есть концепция открытых классов. Тем не менее, когда класс MyClass где-то определен, вполне допустимо иметь в коде следующее:

class MyClass
  def another_method
    # do something useful
  end
end

Тем не менее, для этого действия не существует «подобного отражению» механизма, поскольку именно так должен работать Ruby.

Можно построить сложную логику следующим образом:

  • запустить приложение без загрузки нового класса Parameters;
  • позвони $defined = const_get('Parameters') || true rescue false;
  • используйте $defined global (здесь оно сделано глобальным для примера), чтобы определить, свободно ли имя.

or:

  • используйте TracePoint#new(:class) на Parameters, чтобы определить, загрузился только твой.

or

  • используйте ObjectSpace#each для обнаружения других классов.

или даже

  • разбирать исходники.

Но я бы не пошел ни с одним из решений выше. Просто назовите свой класс MyAppParameters и живите с этим именем.

person Aleksei Matiushkin    schedule 30.07.2016
comment
Спасибо. Это было то понимание, которое я искал. Я понимаю, что это хорошие подходы для определения того, какие классы загружаются при выполнении проверки. Я так понимаю, это не означает, что рассматриваемый класс не будет загружен когда-нибудь позже. Я использовал ScanParameters, хотя это избыточно, поскольку родительский класс подразумевает Scan - person Perry Horwich; 30.07.2016
comment
«Это не означает, что рассматриваемый класс не будет загружен когда-то позже» — подход с TracePoint можно использовать для обнаружения загрузки/повторного открытия класса в любой момент жизни приложения. пользуюсь, т. g., когда мне нужно явно дождаться загрузки некоторого класса, чтобы исправить его. Но здесь это все же выглядит перебором. - person Aleksei Matiushkin; 30.07.2016
comment
Интересно. Спасибо еще раз. Я понимаю, что это уведомит меня, когда будет загружен определенный класс, но все же кажется, что я не могу предвидеть или предсказать, что такой случай возможен. Я полагаю, это «стоимость» архитектуры открытого класса Ruby? - person Perry Horwich; 30.07.2016
comment
Да, точно. Хотя я бы не назвал это «стоимостью». У нас так все работает :) В любом случае, добро пожаловать. - person Aleksei Matiushkin; 30.07.2016

IDE, такая как RubyMine, должна предупреждать вас, окрашивая текст всякий раз, когда вы используете зарезервированное слово, но для таких людей, как я, которые используют прославленные текстовые редакторы, вы всегда можете проверить этот список Зарезервированные слова, связанные с Rails, если вы не уверены.

person MarsAtomic    schedule 30.07.2016
comment
Это позаботится о Rails и Ruby, но как насчет драгоценных камней? - person Perry Horwich; 30.07.2016
comment
@PerryHorwich RubyGems в настоящее время перечисляет 7719 драгоценных камней, поэтому ваше требование к драгоценным камням кажется одновременно амбициозным и, к сожалению, маловероятным. - person MarsAtomic; 30.07.2016
comment
И... Я действительно ищу ряд шагов, которые используют отражение или какой-либо другой механизм, чтобы гарантировать, что я не буду конфликтовать с зарезервированным словом. Мне это кажется предпочтительным, так как онлайн-списки могут быть устаревшими. - person Perry Horwich; 30.07.2016