Если мы кэшируем параметры в локальную переменную в действии, это поможет или это то же самое?

StackOverflow https://stackoverflow.com/questions/1164472

Вопрос

Итак, мы запускаем инструмент контроля качества кода под названием вонять время от времени в рамках нашего проекта.Инструмент в основном ищет запахи кода и сообщает о них.Здесь мы заметили, что каждый раз, когда мы пытаемся получить доступ к ключу в 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, Это означает, что вы можете получить доступ к любому ключу с помощью строки или символа.

Я считаю, что каждый раз, когда вы вызываете параметры, происходит этап инициализации, который генерирует вызовы методов. Я полагаю, вы можете попробовать создать параметры и проверить количество вызовов.это может быть слепое предположение.:-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top