Кратко о принципе DRY в Ruby on Rails

января 2, 2011  |  Published in Ruby on Rails  |  2 Comments

C Новым Годом ув. читатели блога RubyDev.ru!

happy new year

Это краткая заметка для самых-самых новичков в программировании на Ruby и Ruby on Rails, которые еще не знакомы с таким принципом разработки как DRY.

Аббревиатура DRY расшифровывается как Don’t Repeat Yourself, что на более благозвучный русский переводится как: Не повторяйся! Согласно этому принципы программист должен оптимизировать свой код таким образом, чтобы код выполняющий какую-либо функциональность существовал в одном экземпляре. На практике это означает что общий код для нескольких моделей, представлений или контроллеров должен выносится с отдельный файл, модуль, класс, метод и т.д. Это дает нам следующие преимущества:

1. Меньше кода = больше читабельность
2. Меньше кода = меньше работы по его написанию и отладке.


Давайте допустим, что вы создали свой собственный код для добавления постраничной навигации в ваше приложение на Ruby on Rails. Вы скопипастили его в 100-500 моделей, контроллеров и представлений и все работало нормально, но вы внезапно заметили, что ваш код мог бы работать лучше, или вы придумали какую-то новую функциональность для вашего кода, которая была бы очень полезна вашим пользователям. Что же необходимо, чтобы исправить или расширить ваш код? — Правильно, вам необходимо лезть в каждую из 100-500 моделей контроллеров и представлений, чтобы внести правки… Согласитесь, гораздо удобнее было бы, если бы ваш код содержался в отдельном модуле, тогда все правки необходимо было бы вносить лишь в одном месте. Файлы вашего приложения стали бы гораздо чище после вынесения общего кода в отдельный модуль, и кроме всего-этого,вам не нужно писать тесты для тестирования постраничной навигации для каждой модели, контроллера и представления, вам достаточно написать тесты для самого модуля,который содержит код реализующий постраничную навигацию. Плюсы принципа DRY теперь очевидны!

В Ruby on Rails DRY является одним из основных принципов, который реализуется повсеместно! Во-первых Ruby on Rails имеет собственную огромную библиотеку расширений стандартной библиотеки Ruby, во-вторых Ruby on Rails содержит множество хэлперов, которые будут вам бесконечно полезны, в-третьих Ruby on Rails обладает оптимизированной под DRY архитектурой, например Ruby on Rails разделяет представления на главный шаблон страницы где содержится код общий для всех страниц, представления для экшенов — уникальные для каждого экшена представления и partial — код содержащийся в представлениях для нескольких экшенов, например код форм, который в большинстве случаев будет одинаковым для экшена создания новой записи и экшена редактирования уже имеющейся.

Иногда DRY может означать некое усложнение архитектуры приложения, например за счет абстрагирования, когда код постраничной навигации все-таки не дублируется один в один, а имеет некоторые, порой очень даже значительные отличия. В этом случае вам необходимо писать собственную библиотеку являющуюся конструктором постраничной навигации, который может становиться универсальным и создавать практически любую постраничную навигацию, которая только придет разработчику в голову. Как правило, создание таких конструкторов — весьма хлопотное дело, поэтому рекомендуется использовать уже готовые и проверенные десятками и сотнями тысячь разработчиков библиотеки и rubygems.

Tags:

Responses

  1. says:

    января 14, 2011 at 17:37 (#)

    Для общих задач — да, можно и нужно пользоваться готовыми, проверенными решениями. Но не всегда проект состоит из набора готовых решений, которые просто нужно сложить вместе.

  2. admin says:

    января 14, 2011 at 23:34 (#)

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

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.