Если мы кэшируем параметры в локальную переменную в действии, это поможет или это то же самое?
-
18-09-2019 - |
Вопрос
Итак, мы запускаем инструмент контроля качества кода под названием вонять время от времени в рамках нашего проекта.Инструмент в основном ищет запахи кода и сообщает о них.Здесь мы заметили, что каждый раз, когда мы пытаемся получить доступ к ключу в params
более одного раза (как будто мы дважды вызываем метод с одними и теми же параметрами или дублируем условие if и т. д.).Однако, params
это просто Hash
, верно?Другие хеши не имеют запаха дублирования, когда к их ключам обращаются более одного раза.
Почему это так?Что params
точно?Имеет ли смысл кэшировать params
в локальной переменной, а затем использовать их?Поможет или это то же самое?Или что-то не так с инструментом?Помощь!
Решение
В текущей версии лучше всего запускать Reek только в папке приложения/модели, поскольку это вызывает ложные срабатывания в отношении представлений и контроллеров.
params — это своего рода DTO (объект передачи данных), расположенный близко к границе системы, поэтому его характеристики должны отличаться от обычного кода.Но Рик этого не знает (пока).В ближайшем будущем я планирую улучшить Reek, чтобы он лучше работал с Rails.Однако на данный момент лучше всего ограничить его просмотром приложений/моделей (и, возможно, приложений/помощников и библиотек).
Другие советы
params — это вызов метода, который выполняет @params ||= @request.params
Возможно, он считает, что params — это сложный метод, поэтому он хочет, чтобы вы попытались кэшировать его в переменной, но не думайте, что это того стоит, тем более, что он мемоизирован (на основе моегоrack_process.rb из Rails 2.2).
params[:foo]
это вызов метода Hash#[]
, так что вонь - это правильно.Я не знаком с reek, поэтому не могу сказать, почему другие доступы к хешу не учитываются одинаково. Hash#[]
должен быть достаточно быстрым, чтобы вам не нужно было хранить его в локальной переменной, если только вы не находитесь в очень критической части вашего кода.
Единственная разница между параметрами Hash и обычным Hash заключается в том, что он использует with_indifferent_access
, Это означает, что вы можете получить доступ к любому ключу с помощью строки или символа.
Я считаю, что каждый раз, когда вы вызываете параметры, происходит этап инициализации, который генерирует вызовы методов. Я полагаю, вы можете попробовать создать параметры и проверить количество вызовов.это может быть слепое предположение.:-)