Я не в восторге от использования Rails глобальных переменных для всего. Классы моделей находят соединение с базой данных через глобальную переменную (ActiveRecord::Base.connection
), существует класс Rails
, который является глобальной точкой доступа для таких вещей, как регистратор, текущая среда, для кэширования и т. Д. ActionMailer
создает глобальные переменные из ваших почтовиков и так далее и тому подобное. Rails построен на использовании глобальных переменных, поэтому, что бы вы ни делали на любом уровне приложения, вы всегда можете найти глобальную переменную.
Это делает тестирование уродливым. Если бы Rails был построен на Java, это сделало бы тестирование очень, очень трудным, но, поскольку это Ruby, оно просто становится уродливым. Тесты должны заглушить большую часть глобального контекста, чтобы работать в изоляции, и это может легко сделать тесты бессмысленными. Нередко встречаются пять или десять строк кода, которые заглушают различные глобальные переменные, за которыми следуют одна или две строки реального теста. Дело не в том, что пять или десять строк настройки для теста представляют собой проблему, но без чтения тестируемого кода вы не сможете легко увидеть, какое влияние окажет глобальное состояние и насколько оно значимо. Это делает многие тесты излишне уродливыми.
Мне кажется несколько ироничным, что сообщество Rails наиболее опытно из всех, в которых я принимал участие.
Сказав, что я не буду обменивать Rails на все, что доступно в данный момент. Скорость, с которой вы можете делать вещи, и огромное количество плагинов и драгоценных камней, которые убирают всю утомительную работу, просто поражают меня каждый день.