Итак, мы все стремимся уменьшить дублирование (DRY) и другие неприятные запахи, и сделать наш код максимально красивым и чистым. Для кода на Ruby существует множество инструментов для обнаружения запахов, например, довольно приятный сервис Caliber .
Однако, похоже, что у меня есть другое определение дублирования кода, чем у инструментов. Я думаю, что это может быть связано с тем, как работает Ruby, когда вы почти никогда не обращаетесь к переменной напрямую, а через вызов метода. Рассмотрим этот фрагмент из контроллера Rails:
def update_site_settings
SiteSettings.site_name = params[:site_name]
SiteSettings.site_theme = params[:site_theme]
expire_fragment('layout_header')
flash[:notice] = t(:Site_settings_updated)
redirect_to :controller => 'application', :action => 'edit_site_settings'
end
Это помечено предупреждением о дублировании кода из-за двух вызовов метода "params". Итак, мой вопрос: действительно ли было бы лучше назначить params
локальной переменной? Я считаю, что способ написания этой статьи является наиболее понятным и лаконичным способом сделать это, а тот факт, что params
- это метод, а не переменная, представляет собой простую «стоимость ведения бизнеса» в Ruby.
Я вижу это неправильно?
РЕДАКТИРОВАТЬ: В этом случае, более красивым способом может быть обновление стиля SiteSettings.update_attributes(params)
. Рассмотрим, если хотите, ту же проблему в другом фрагменте:
def update
@mailing_list = MailingList.find(params[:id])
if @mailing_list.update_attributes(params[:mailing_list])
flash[:notice] = t:Mailing_list_updated
redirect_to(mailing_lists_path)
...