Fri 11 Jul 2008
200 cлов о стиле
Posted by Alex Lebedev under программирование, ruby, рефакторинг
Небольшой пример рефакторинга ruby-кода.
Исходный вариант (взято из статьи Raking /etc/hosts For Sweeter Subdomainage)
hosts = []
# add all the site temporary domains
hosts << Site.find(:all).inject([]) do |collection, site|
collection << site.harmony_url
end
# add all the account subdomains
hosts << Account.find(:all).inject([]) do |collection, account|
collection << account.harmony_url
end
Как можно сделать лучше?
Программа-минимум:
# site and account subdomains
hosts = []
hosts << Site.find(:all).collect(&:harmony_url)
hosts << Account.find(:all).collect(&:harmony_url)
Улучшения здесь три:
Заменяем низкоуровневый
injectнаcollect. Нет смысла пользоватьсяinjectи выставлять наружу переменную-счетчик, если можно легко сделать то же самое с более высокого уровня абстракции.Используем сокращенный способ вызова метода в блоке:
(&:harmony_url)вместо{|element| element.harmony_url}. Это улучшение является частью ActiveSupport, так что вне рельс само работать не будет.Заменяем дословно повторяющие код комментарии на что-то хоть немного более высокоуровневое.
Дополнительная программа:
То же самое чуть компактнее
# site and account subdomains hosts = Site.find(:all).collect(&:harmony_url) + Account.find(:all).collect(&:harmony_url)Далее в коде нигде не используется факт, что массив хостов содержит два отдельных подмассива со значениями, поэтому можно просто запихать все в плоский массив. Что, кстати, избавит нас не только от инициализации
hosts, но и от вызоваflattenпри использовании значений.Делаем код понятным без комментариев
hosts = Site.find(:all).collect(&:subdomain) + Account.find(:all).collect(&:subdomain)… а в классах моделей пишем:
alias_method :harmony_url, :subdomain

July 11th, 2008 at 10:56
Отличная статья! После таких начинаешь понимать, что даже на Ruby можно программировать красиво.
Ещё пяток таких статей, и можно садиться за рефакторинг
July 15th, 2008 at 07:29
опечатка в паре мест
:& -> &:
July 15th, 2008 at 11:19
Спасибо, поправил.
July 17th, 2008 at 11:16
Клева, я недумал что на Ruby такое можно.
July 19th, 2008 at 02:13
На Руби можно и гораздо больше..вот только времени на его изучение и практику остается очень мало, все равно по главе угла старый пхп, да перл..
July 25th, 2008 at 04:28
Автор, а вы случайно не из Москвы?
July 27th, 2008 at 11:40
да познавательно, спасибо за исправление ошибок.