Благодаря некоторым особенностям Ruby, код на нем можно писать значительно более лаконичный, чем вы можете себе это представить. Например, благодаря тому, что Ruby возвращает значение последнего выражения, можно сократить количество кода не только за счет отказа от использования return, там, где это возможно, но и за счет написания простых методов, которые в итоге своей работы возвращают только true или false не используя при этом логический конструкций типа if..else, и т.д.
Пример:
Данный код мы можем переписать следующим образом:
Мы сократили код в 2 раза! И не потеряли при этом его ясности.
Давайте представим, что у нас есть следующий код:
3 | breakfast = "глазунья с беконом" |
Как его можно улучшить? Давайте попробуем воспользоваться методом nil? вместо сравнения с объектом nil:
2 | breakfast = "глазунья с беконом" |
Можно ли еще улучшить код? – Конечно!
2 | breakfast = "глазунья с беконом" |
Конструкция if !… – это то же самое, что и unless:
2 | breakfast = "глазунья с беконом" |
Можно ли сделать еще лучше? – Делаем!
1 | breakfast = "глазунья с беконом" unless breakfast |
Хотите еще лучше?! Получите!
1 | breakfast || = "глазунья с беконом" |
Уже устали? А ведь это только начало статьи об оптимизации кода!
Допустим у нас есть следующий код:
2 | if val == 1 || val == 12 || val == 42 |
Сразу видно, что мы повторяемся, а именно повторяме операцию сравнения. Терпеливый программист может позволить себе написать 10 и 20 и 100 проверок, но ленивый и умный программист сделает следующим образом:
1 | if [ 1 , 12 , 42 ].include?(val) |
С помощью вышеописанных приемов мы можем сделать код еще более лаконичным, например:
1 | puts "е-ху!" if [ 1 , 12 , 42 ].include?(val) |
Еще один пример оптимизации кода. Допустим, нам необходимо добавить в массив уникальное значение, для этого, разумеется, необходимо сделать проверку, имеется ли в массиве такой же элемент, как тот, что мы хотим добавить, в результате мы пишем следующий код:
1 | fruits = [ 'apple' , 'banana' , 'apricot' ] |
2 |
fruits << 'apple' unless fruits.include?( 'apple' ) |
|
Оказывается можно сделать проще! пример:
Метод | присоединяет к первому массиву второй удаляя при этом повторяющиеся элементы.
Давайте представим, что у нас имеется следующий монстро-код, с которым срочно необходимо что-то сделать:
5 | user_id = comments.first.user.id |
Этот код можно легко уложить в одну строку и не повторять надоедливые блоки if…end:
1 | user_id = comments && Comments.first && comments.first.user && comments.first.user.id |
Логические операции производятся в порядке слева направо и возвращается значение последнего выражения – значит все отлично!
Вы можете вставлять код непосредственно в строку при этом сам код в итоге будет заменен на результат его выполнения, но для этого сам код необходимо поместить в “магические” скобки.
Пример без магических скобок:
1 | puts "User name:" + name.capitalize + "\n user last name:" + lastname.capitalize + "\n user father name:" + ... |
Делаем как лучше:
1 | puts "User name: #{name.capitalize}\n user last name: #{lastname.capitalize}\n user father name: ..." |
Нельзя сказать, что код вышел короче, зато нет путаницы с кавычками!
Представьте, что у нас есть массив:
1 | a = [ 'ant' , 'bee' , 'cat' , 'dog' , 'elk' ] |
Существует более короткий способ создания подобных массивов:
1 | a = %w{ ant bee catdog elk} |
Не стоит забывать об итераторах. Код:
Используя итератор times мы можем записать тот же функционал более изящно:
Еще один пример того, как итераторы делают жизнь лучше:
1 | for i in 0 ...people.size |
Используя итератор each мы добиваемся совершенства:
1 | people. each {|p| puts p.name} |
Благодарю Karmen Blake (karmenblake) за предоставление большинства примеров кода к этому посту.
источник:
http://rubydev.ru/2010/10/ruby-and-beautiful-code/
Жестко, у меня голова кругом идет когда я пытаюсь представить такой код =)
ОтветитьУдалитьА мне нравится рубин, но Си всё же надежней!
ОтветитьУдалить