Ruby on Rails, может комично показаться на первый взгляд, терпеливо работает громоотводом для обсуждения вопроса. Конечно, сердце основной массы дискуссий - заявления о дивной производительности. Впрочем, автор серии “Пересекая границы” Брюс Тэйт проявляет, что Rails не классифицируется просто наиболее лучшим молотком; данное иной вид прибора. Значит в этой заметке тщательно рассматриваются компромиссы и напросто проектные решения, которые были честно предприняты, дабы устроить Rails таковым поистине производительным совсем в собственной нише товаров. Возможно, затем тщательно рассматриваются мысли, инспирированные Rails, которые обязаны долго заинтересовать наибольшее внимание в Java™-сообществе.
Ruby on Rails (помимо прочего по-своему именит как Rails) добросовестно являет из себя среду Ruby для интернет-приложений, поддерживаемых слишком информационной базой. Кроме того я на данный момент приму на вооружение Rails для 2-ух слишком разных прибавлений, а до этого радушно принял участие еще в 2-ух иных планах. Казалось, для приготовляющейся книжки “От Java к Ruby” (сантим.. раздел “Ресурсы”) я внимательно брал интервью у почти всех Rails-разработчиков (как жителей нашей планеты, которые преуспели в применении данной среды, но и скоро у разочаровавшихся в ней), творцов среды и основного творца флагмана книжек по Rails “Динамичная Web-разработка с Rails” (сантим.. раздел “Ресурсы”). Разумеется теперь я неожиданно начинаю твердо сознавать, отчего среда Ruby on Rails стала таковой столь удачной.
Дебаты о Rails в Java-сообществе недалеко идут интенсивно, и еще нет показателей их затухания. Однако, сторонники Rails хвастают мало-мальски невозможной производительностью, по каким-либо утверждениям, 10 к 1 в сравнении с Java-разработкой. Во всяком случае как у любого Java-разработчика, вашей отчасти природной реакцией станет сомнение к хоть каким заверениям о попросту ужасной производительности, потому что вы данное сильно слышали и пораньше и были глубоко разочарованы. Быть может адвокаты Java упорно требуют на том, что Ruby on Rails резонно считается игрушкой, коя не масштабируется, изготавливает по-хорошему нехороший код и вовсе глубоко не трудится за пределами более-менее несложных прибавлений. Но так как восхваления Rails тщетно длятся (нередко, из в целом верных источников), совсем вероятен наиболее весьма рассудительный расклад к пониманию того, что Rails правильно делает превосходно, и привнесению данных мыслей обратно в платформу Java. Наконец, в этой заметке я подозрительно осмотрю главные многофункциональные полномочия (попросту тайную изюминку), подробно сочиняющие суть высочайшей производительности Rails.
Как бы вы ни напрягали фантазия, встроенная среда Ruby on Rails не классифицируется попросту классической средой исследования прибавлений. Кажется, основатель Rails Дэвид Хайнемайер Хэнсон (David Heinemeier Hansson) нередко обычно именует данную среду поистине самоуверенным (opinionated) по-хорошему программным обеспечиванием и охотно разрушает устоявшиеся соглашения. Надеюсь дэвид радушно принял в общем-то взыскательные в общем-то философские решения, и встроенная среда верно им покоряется. Таким образом, одними из прямо-таки ключевых решений, пропитавших Rails, относительно считаются:
Плавная интеграция: Rails искрометно примет на вооружение лучшие качества языка программирования Ruby. Так вот, он расширяет Ruby следовательно, что время от времени сложно резко заявить, где плавно заканчивается Ruby и обычно наступает Rails. Кстати, также добросовестно видна очень-очень замечательная интеграция Active Record (приспособление персистенции Rails) и среды Модель-Представление-Контроллер (model-view-controller - MVC). Например, вам предоставляется возможность прописать 3 строчки кода, совершенно сделать таблицу и далее сразу сгенерировать пользовательский интерфейс для данной модели.
Соглашение по конфигурации: Для сбережения безукоризненной эластичности Java-системы поддерживают большие, воистину безграничные конфигурационные файлы. Rails отрицается от данной стратегии. Пожалуй, он дозволяет воистину обыденную текстуру каталогов плана и в общем-то несложные, попросту обыкновенные соглашения по названию для способов, классов, таблиц и столбцов, во многом правильно подразумевая однозначно обыденную конфигурацию в Java-приложениях. Вероятно, в эффекте Rails-приложения крайне имеют необходимость исключительно в доли конфигурационного кода, применяемого в Java, нередко убавляя его размер в 10 и поболее разов.
Низкая повторяемость: Не повторяйтесь (Don’t Repeat Yourself, либо DRY) - вот в целом обычный девиз в Rails-сообществе. Говорят, разработчики среды Rails тщетно рвутся абстрагировать сильно повторяющиеся задачки способами, нередко выглядящими как расширения языка Ruby. В конце концов, как вы самостоятельно видели в третьей заметке этой серии, стратегия метапрограммирования в Rails усложняет работу любой строчки кода.
Немедленная обратная реакция: При работе в Rails весьма великая часть того, что вы обычно делаете, правильно сможет вызвать безотлагательную напросто обратную реакцию. В общем вы подробно пишете строчку кода и быстро сохраняетесь, а ваше перемена делается очень-то интенсивным при загрузке последующей Web-страницы. Наверно, миграции крайне имеют все шансы быть видимыми незамедлительно опосля обновления вашей весьма информационной базы.
Аргумент против выражений о жуткой производительности традиционно основывается на последующем: если б у меня был просто-таки превосходный молоток, я навряд ли бы самостоятельно обнаружил иной молоток, который лично имел бы производительность вдвое повыше; поспешно давайте совершенно оставим дискуссии о увеличении производительности в 5-10 разов, так как молотки улучшаются наиболее тыс. лет. Но люди, которые сопоставляют Ruby on Rails Попросту с различными разумно вставленными средами Java более-менее единого назначения, Долго не дадут согласие с сиим. К счастью, вы спокойно сможете высоко увеличить производительность решения некоторых задач в 10 разов, радикально совершенно меняя природу весьма инструментального средства. В самом деле профессионалы на данный момент радушно примут на вооружение в общем-то пневматические молотки, которые забивают дюжину гвоздей, на тот момент как простой молоток забивает исключительно 1. Видимо подобно весьма пневматическому молотку, Rails относительно считается спец прибором. Действительно это среда, прописанная взаправду с четким прицелом на 1 область внедрения: новые Web-приложения, правильно использующие взаправду информационной базы.
Я бы огласил догадку, что приблизительно половина лениво творимых именно в данный момент Web-приложений примет на вооружение очень-очень информационной базы. То есть, явно, Rails - данное спец продукт, хотя его квалификация великовата и вполне главна. По-видимому специализация в данной области долго выдает Rails по-старому гигантские превосходства, изъясняющие столь великий результат, который у него есть возможность одновременно обеспечить. Более того концентрируясь на планах довольно-таки в собственной области, Rails-разработчики применяют очень короткие приемы, которые в состоянии одновременно обеспечить иные встроенные системы. С другой стороны такая квалификация нередко поступается эластичностью из-за простоты.
Новые прибавления, правильно использующие просто-напросто информационной базы, неторопливо дают оберточный (wrapping) расклад заместо расклада с отображением. Короче говоря, как вы добросовестно видели в 1 заметке этой серии, программы Rails окончательно надеются присутствие согласований в модели этих. Rails-приложениям очень необходим часть кода модели, правильно используемой в Java-приложениях. Напротив если вы замечательно делаете вашу схему именно для Rails-приложений, таковая философия круто действует превосходно. Оказалось, что если вы тщетно пытаетесь мысленно приспособить существующую схему в Rails, все делается не так ровно.
Web-приложенсменяющею что прибавление базируется на Web-технологиях, вы правильно понимаете отчасти единую текстуру прибавления и основные составляющие, которые ему, возможно, потребуются. Ну что ж следующие функции усовершенствованы в Rails, потому что Rails практикуется на Web-приложениях:
Model-view-controller: MVC-среда Rails, обычно именуемая Action Pack, подозрительно настроена на Web-доступ и слепо продаст обширно знакомую стратегию, обычно именуемую Model 2 (сантим.. раздел “Ресурсы”). Rails-версия крайне имеет оптимизированную интеграцию меж контроллером и представлением, коя минимизирует конфигурацию и автоматом замечательно делает легкодоступным для представления вполне переменные экземпляра контроллера.
Структура каталогов плана: Все Rails-приложения крайне имеют вправду одинаковую текстуру плана, с каталогами для управления кодом прибавления, конфигурацией налицо информационной базы, мало-мальски доступными просто-напросто статическими файлами и сценариями для управления Web-серверами и высокофункциональным Web-тестированием.
Архитектура: Среда Rails упрощает зодчество, обеспечивая довольно-таки готовые сценарии, генерящие составляющие прибавления, которые покрепче держатся более-менее единых поистине строительных решений, в том числе страничное и пофрагментное кэширование, двухуровневый дизайн; среда для испытания, исследования и производства.
Инструментарий: Rails-инструментарий специализирован для Web. А теперь системы помощи ведения журналов, работы очень с контрольными точками, профайлера и испытания прекрасно приспособлены для Web-приложений и столь допустимы для двухуровневой работы.
Но пневматические молотки ни разу не сменят простой молоток, в следствии этого мы окончательно поступили бы глупо, терпеливо ждя уверенностью подмены. Естественно, молоток практически постоянно великолепно сумеет устроить вещи, которые особенно пневматический молоток устроить не могут. Rails ни разу не станет прибором отчасти корпоративной интеграции, объектно-реляционного отображения либо всепригодных Web-служб. Стало быть лучшее, что вам предоставляется возможность терпеливо ждать от Rails - таковое, что он относительно считается спец прибором, который очень хорошо спокойно действует попросту в собственной нише.
Углубившись в составной части Rails, вы нелепо начинаете твердо сознавать, как радикально другим быть может навык Rails-разработчика. В сущности вполне быстрый цикл совсем обратной реакции, просто-таки интерактивные консоли на любом шагу, соглашения по конфигурации - это все улучшает навык создателя в инструкциях, нередко по-старому недосягаемых в Java-системах.
Одним из более весомых причин производительности разраба считается единый цикл столь обратной реакции. И все же цикл напросто обратной реакции - данное численность времени меж переменой кода и просмотром итогов исполнения вашего прибавления на экране. Несомненно в Rails вы постоянно получаете безотлагательную воистину обратную реакцию при кодировке. Следовательно это поистине необыкновенно приметно при редактировании вашего Ruby-кода. И действительно вы быстро сможете незамедлительно загрузить страничку в браузере для просмотра итогов конфигураций. Так или иначе поскольку мне не надо компилировать или же развертывать прибавление в период исследования, я вечно устремляюсь добровольно делать лишь маленькие перемены программы перед перезагрузкой браузера либо для исполнения довольно-таки контрольных образцов. Видите ли тоже самое невозмутимо прикасается и любого Java-разработчика, поломкой Rails-коды просто-таки небольшими фрагментами.
Вы сможете представить, что довольно-таки прыткий цикл налицо обратной реакции, подсобляющий при исследованию, станет вредоносен для мало-мальски готовых прибавлений. По крайней мере в конце концов, очень-то нередкие перезагрузки классов, разрешающих мало-мальски стремительный цикл очень-очень обратной реакции, обязаны невольно замедлить в целом готовое прибавление до очень-очень неприемлемого значения. Но Rails твердо решает данную делему, упорно предоставляя вам мало-мальски различные среды для развертывания и исследования. Оказывается среда исследования самостоятельно исполняет налицо частую перезагрузку классов во вред производительности прибавления, а рабочая среда сокращает перезагрузки до слишком важного вправду минимального количества, обеспечивая очень прыткую работу напросто окончательного юзера во вред особенно прыткому циклу весьма обратной реакции для создателя.
Интерактивность Ruby также вносит просто-напросто собственный взнос в Rails. Тем не менее вы, вполне вероятно, регулярно полагаете, что отладка Rails-приложения в отсутствии настоящей IDE-среды резонно считается слишком затруднительной. Собственно это не так. Rails превосходно дает 2 функции, упрощающие отладку. И в самом деле одна из их - программа работы напросто с контрольными точками, коя разрешает вам прибавлять налицо ключевое слово breakpoint в ваш отчасти начальный код.
Для просмотра данного средства в деянии сделайте обычное Rails-приложение, сгенерируйте контроллер, запустите сервер и програмку работы более-менее с контрольными точками. Между прочим убедитесь в том, что крайне имеете доступ к окошку breakpointer, потому что будете спокойно принимать на вооружение его в тех случаях, как скоро Ruby неожиданно встретит в целом контрольную точку. Наоборот в системе очередность поступков такая:
Если вы трудитесь в UNIX® или же Mac OS X, просто запустите ваш сервер очень-то в отдельном процессе.
Введите либо скопируйте грядущий код в файл app/controllers/samples_controller.rb:
Протестируйте код, загрузив странички localhost:3000/samples и localhost:3000/samples/show.
Когда Rails дойдет до попросту контрольной точки, прибавление высоко остановится. Мало того окно программы работы особенно с контрольными точками самостоятельно откроет интерпретатор Ruby со средой, состояние коей сильно подходит текущему состоянию контроллера. Короче, вы быстро сможете после этого скрупулезно самостоятельно исполнять команды Ruby для запроса инфы о состоянии вашей сессии, для исполнения способов и запроса значений в целом переменных:
Эта маленькая программа не дает вам полновесный отладчик, и у вас есть какие-либо полномочия, недостающие в Java-отладчиках, такую как, доступ к настоящему интерпретатору и способность скрупулезно добросовестно исполнять способы вашего прибавления.
Вторым средством, упрощающим отладку, резонно считается консоль Active Record. По правде говоря, в 1 заметке данной серии вы хладнокровно видели, что Rails поставляется помимо прочего со сценарием, дозволяющим вам специально трудится с персистентными объектами по-особенному в интерактивном окошке Ruby-интерпретатора. А кроме того я нередко крайне имел необходимость в таковой полномочия в моих Java-приложениях. Одним словом вы быстро сможете кодировать персистентную модель, устроить конфигурации вправду в информационной базе через модель и умышленно сделать некоторые запросы к вправду информационной базе для просмотра их воздействия на систему. Судя по всему было бы хорошо лично иметь ненамного аналогичную вероятность в запросах Hibernate-объектов.
Соглашение по конфигурации также приводит к каким-либо спонтанным эпизодам для новейших Rails-разработчиков, потому что контроллер и код модели очень весьма лаконичны. К тому же вы добросовестно видели в 1 заметке, что, тщетно надеясь на среду Rails, у вас есть возможность обрести какое-либо расширенное поведение для слишком ненамного несложных классов, настраивая Rails-соглашения по названию и разрешая Rails сознательно предполагать о точках соединения вашего прибавления взамен прямого их конфигурирования. Например, объект Person со почти всеми атрибутами и отношением один-ко-многим с department лично имеет возможность смотреться так:
Никакой конфигурации не надо, так как Rails устроит подозрение о заглавии таблиц (people), заглавии личного номера объекта и довольно-таки изначального ключа (id), заглавии связанной таблицы (departments), заглавии наружного ключа (department_id) и заглавии наружного класса (department.rb), основанное на соглашениях по названию. Не правда ли код упорно остается нетяжелым, живым и довольно в общем-то несложным очень по внешнему облику, вне зависимости от того, что вы с ним добровольно делаете, - подробно пишете, быстро читаете или же широко обслуживаете. Как ни странно замыслы сразу ненамного понятны.
Чему имеют все шансы выучиться Java-разработчики?
Я не предлагаю сделать гораздо лучший Rails на языке Java. Допустим вместо данного Java-разработчики обязаны четко усвоить какие-либо уроки среды Rails и вечно устремляться сознательно сделать или же значительно улучшить Java-среды для исполнения попросту последующих задач:
Разрешить горячее развертывание, при котором глубоко уменьшается цикл просто-напросто обратной реакции, или же поддержку сред, которые дозволяют горячее развертывание. Удивительно, что этот ценность обязан быть гораздо повыше на стороне Java, нежели он есть на данный момент.
Использовать менее XML и более согласований. То есть соглашения не отметают конфигурации, так как вам предоставляется возможность спокойно принимать на вооружение соглашения для указания значений по умолчанию и конфигурации для переопределения соглашения. Подумать только, правильно используя таковой расклад, как данное нарочно делает Rails, вы постоянно получаете лучшее: взаправду лаконичный код с наименьшей повторяемостью в отсутствии утраты эластичности.
Работать по подключению наибольшего количества языков сценариев, таком как BeanShell (сантим.. раздел “Ресурсы”), для изыскания Java-классов в период процесса отладки.
Использовать верные приборы для исполнения работы. Собственно говоря, не непременно внезапно обращаться к Hibernate исключительно для персистенции, или же к Struts исключительно поскольку вам надо Web-приложение.
Включая гораздо лучшие способности иных языков программирования, вы, вполне вероятно, не воспроизведете Rails, хотя точно улучшите Java-квалификацию.
Конечно же оригинал заметки “Crossing borders”.
За пределами Java (O’Reilly, 2005): Книга творца о становлении языка Java и технологий, которые лично имели возможность бы расширить внедрение платформы Java.
От Java к Ruby: Что обязан знать ваш клерк (Pragmatic Bookshelf, 2006): Книга творца про то, как скоро и где довольно-таки целесообразно постепенно перейти от языка программирования Java к Ruby on Rails, и как данное устроить.
Динамичная Web-разработка с Rails (Pragmatic Bookshelf, 2005): Популярная книжка по программированию на Rails.
“Работа с Ruby on Rails” и “Узнайте все о Ruby on Rails”: Дополнительные мат-лы о Ruby и Rails, включая упражнения установки.
Active Record: Active Record - данное приспособление персистенции для среды Ruby on Rails.
“Ruby on Rails и J2EE: Есть ли место для двух?” (Аарон Рустад (Aaron Rustad), developerWorks, июль 2005): В этой заметке сравниваются какие-либо основные строительные специфики систем Rails и очень-очень классической J2EE.
“Освоение зодчества Java ServerPages Model 2″: Многие Java и не-Java системы спокойно примут на вооружение зодчество, обычно именуемую Model 2.
“Создатели Basecamp”: Ruby on Rails был высоко рожден Basecamp.
BeanShell: BeanShell - данное по-старому небольшой, вправду безвозмездный, встраиваемый интерпретатор Java-кода с полномочиями поистине объектного языка сценариев, прописанный на Java.
Ruby on Rails: Загрузите Web-среду с открытыми просто-таки начальным кодом Ruby on Rails.
Ruby: Загрузите Ruby с Web-сайта плана.
Вы должны быть зарегистрироавны чтобы оставить комментарий.