Так, все мы стремимся уменьшить дублирование (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)
...
В список добавлен онлайн-преобразователь ( XSD - > RNG ) по адресу http://relaxng.org/#conversion
. Я попытался конвертировать maven-v4_0_0.xsd для проверки файлов pom.xml в emacs, без какой-либо удачи, хотя. Сайт также содержит таблицу стилей XSL, которую можно использовать с xsltproc
, не может поручиться за качество результата...
Справа. Это неправильно для классов, которые перегружают 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 Кевина Резерфорда на моем собственном коде) великолепны, но они не понимают контекста, поэтому редко предлагают идеальную информацию. Они полезны для выявления областей, которые могут выиграть от внимания, но будет много ложных срабатываний, и они также будут пропускать вещи, поэтому они должны использоваться с осознанием.
О концепциях DRY и запахов кода следует помнить, что это рекомендации. Они призваны помочь вам подумать о том, как организовать и упростить ваш код с точки зрения "лес для деревьев". Хотя хорошо всегда помнить об этих концепциях, придирки к повторению кода на таком маленьком уровне часто приводят к тому, что ваш код становится излишне сложным или непонятным. Понятность вашего кода тоже должна быть важна, и, как вы говорите, иногда код, который является наиболее ясным и кратким, не то же самое, что код, в котором удалены все повторения.