Fri 11 Jul 2008
200 cлов о стиле
Posted by Alex Lebedev under программирование, ruby, рефакторинг
[7] Comments
Небольшой пример рефакторинга 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
