Как обработать тривиальное “дублирование кода”, пахнут в направляющих/Ruby

Так, все мы стремимся уменьшить дублирование (DRY) и другие запахи, и сохранить наш код максимально хорошим и чистым. Для кода Ruby существует много инструментов для обнаружения запахов, например, довольно хороший сервис Калибра.

Однако кажется, что у меня есть другое определение дублирования кода, чем инструменты. Я думаю, что это могло бы быть подключено к Ruby способ сделать вещи, где Вы почти никогда не получаете доступ к переменной непосредственно, но через вызов метода вместо этого. Рассмотрите этот отрывок от контроллера направляющих:

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.

Я вижу это неправильный путь?

Править: В этом случае более симпатичный путь мог бы состоять в том, чтобы сделать a 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)
    ...

5
задан Bhargav Rao 30 April 2019 в 04:58
поделиться

2 ответа

В список добавлен онлайн-преобразователь ( XSD - > RNG ) по адресу http://relaxng.org/#conversion . Я попытался конвертировать maven-v4_0_0.xsd для проверки файлов pom.xml в emacs, без какой-либо удачи, хотя. Сайт также содержит таблицу стилей XSL, которую можно использовать с xsltproc , не может поручиться за качество результата...

-121--3003845-

Справа. Это неправильно для классов, которые перегружают isa . Просто используйте следующую идиому:

if (eval { $obj->isa($class) }) {

Она легко понятна и общепринята.

-121--2295255-

Я полагаю, вы также можете объявить незначительный экземпляр кодового запаха Feature Envy , хотя он действительно несколько тривиален.

Возможно, можно было бы ввести метод класса в MailingList, так что метод контроллера станет чем-то вроде

def update
  if @mailing_list = MailingList.update_attributes_by_id(params)
    ...

class MailingList
  def self.update_attributes_by_id(params)
     id = params.delete(:id)
     find(id).update_attributes(params)
     ...

(не протестирован, так что обращайтесь с осторожностью)

Будет ли я беспокоиться в реальной жизни? Вероятно, нет, для одной вещи две части найти/обновить вещь настолько распространена, что люди понимают это сразу - кто-то приходит к коду, как выше, придется остановиться и подумать немного, даже если у вас есть идеально выразительное имя.

Эти анализаторы (я запускаю reek Кевина Резерфорда на моем собственном коде) великолепны, но они не понимают контекста, поэтому редко предлагают идеальную информацию. Они полезны для выявления областей, которые могут выиграть от внимания, но будет много ложных срабатываний, и они также будут пропускать вещи, поэтому они должны использоваться с осознанием.

1
ответ дан 15 December 2019 в 00:59
поделиться

О концепциях DRY и запахов кода следует помнить, что это рекомендации. Они призваны помочь вам подумать о том, как организовать и упростить ваш код с точки зрения "лес для деревьев". Хотя хорошо всегда помнить об этих концепциях, придирки к повторению кода на таком маленьком уровне часто приводят к тому, что ваш код становится излишне сложным или непонятным. Понятность вашего кода тоже должна быть важна, и, как вы говорите, иногда код, который является наиболее ясным и кратким, не то же самое, что код, в котором удалены все повторения.

3
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: