JRuby on Rails: Силата на Java, простотата на Ruby on Rails

Ruby, пълнофункционалният обектно-ориентиран динамичен (скриптов) език, със силна подкрепа за функционално програмиране и метапрограмиране, наскоро привлече вниманието за своята гъвкавост и лекота на разработка. JRuby, базиран на JVM интерпретатор за Ruby, съчетава лекотата на езика Ruby с изпълнението в мощния JVM, включително пълна интеграция към и от библиотеките на Java.

От предишната ми статия на JavaWorld по темата („JRuby за света на Java“), имаше някои вълнуващи разработки за JRuby. Sun Microsystems нае двамата водещи разработчици на JRuby, Чарлз Натър и Томас Енебо, в знак на подкрепа за Ruby в JVM. Java Platform, Standard Edition 6 (Java SE 6) бе пусната с нов стандартен API за включване на интерпретатори за динамични езици. Усъвършенстват се плановете за Java 7 VM да поддържа динамични езици директно с нов байт код "извикване на динамичен" и горещо размяна на дефиниции на класове по време на изпълнение. Междувременно екипът на JRuby пусна версия 0.9.2 с по-широка поддръжка за Ruby on Rails, а следващото голямо издание на JRuby, очаквано през февруари, ще включва пълна поддръжка за Ruby on Rails.

Ruby on Rails, лесна за използване, но мощна уеб рамка, изградена на езика Ruby, бързо набира популярност за новите уеб приложения, подкрепени с бази данни, особено в света Web 2.0. Ще ви насоча другаде за подробности за Ruby on Rails, наричан още Rails. Въпреки че проектът е само на 3 години, за него са написани много статии и книги, а документацията му е изключителна за проект с отворен код (вижте уеб сайта Ruby on Rails). По същия начин ви насочвам към по-ранната ми статия за въведение в JRuby.

В тази статия разглеждам кръстовището между Rails и Java. Сравнявам Rails и Java Web framework, описвам предимствата на стартирането на Rails с JRuby и преглеждам някои уроци, които разработчик на Java - дори и този, който не използва Rails - може да научи от тази иновативна рамка.

Мощност плюс простота

Rails радикално ускорява и опростява разработването на уеб приложения, но страда от образ на незрялост, особено при високи възможности за корпоративна сила.

От друга страна, платформата Java, с нейните виртуални машини, библиотеки и сървъри за приложения, набира скорост, стабилност и функционалност до точката, в която обикновено се смята за водеща платформа за сървърни приложения от висок клас. И все пак, докато остане обвързана с езика Java, платформата Java рискува да изостане, тъй като новите езици придобиват популярност.

JRuby свързва взаимно допълващите се силни страни на всички тези технологии, обещавайки добавена популярност както за Ruby, така и за Rails, като същевременно дава на платформата Java нова роля в управлението на езици, които не са Java.

Rails: Където се насочват рамките на Java

За разработчика на Java Rails изглежда като естествената кулминация на тенденциите в еволюцията на Java Web framework: по-малко ненужен код, повече абстракция и динамика и по-пълна функционалност.

Конвенция за конфигурация

Ранните версии на Java Platform, Enterprise Edition (Java EE) изискват обширна конфигурация и код за всеки компонент. Enterprise JavaBeans, например, имаше множество изходни кодове и XML конфигурационни файлове за всеки компонент. Тази сложност превърна EJB в нарицателно за развитие в тежка категория и в крайна сметка доведе до завъртане на 180 градуса в EJB 3, който се стреми към POJO (обикновени стари обекти на Java) с минимална резервираност и конфигурация. Въпреки това, тежките Java EE приложения все още изискват от разработчиците да разработват код, за да изразяват едни и същи бизнес обекти в множество софтуерни нива - GUI, бизнес логика и постоянство. След това, въпреки излишъка и сходството между слоевете, разработчиците трябва да залепят слоевете заедно с конфигурационни файлове. За разлика,по-новите Java Web рамки Seam и Spring излагат бизнес обекти с много по-малко конфигурация и код.

Java рамките също се придвижват към стандартизация и интегриране на стека през нивата на уеб приложение. В най-ранните дни разработчиците на Java уеб приложения ръчно кодират HTML изход от сървлети, създават свои собствени архитектури Model-View-Controller и имат достъп до своите бази данни с SQL чрез Java Database Connectivity (JDBC). По-късно те събраха компоненти, за да изпълнят голяма част от общата функционалност, като библиотеки с маркери, Struts и Hibernate. Наскоро Spring интегрира голяма част от функционалността в един лек стек отгоре надолу.

От самото начало Rails въплъти тези принципи на простота, принципи, известни на общността на Rails като „Не се повтаряйте“ и „Конвенция за конфигуриране“. (Несъкращаването и значимите стойности по подразбиране са сред най-старите принципи на софтуерното инженерство; чудно е, че трябваше да чакаме толкова дълго за нещо като Rails.) Рамката познава връзката между различни нива въз основа на ясни конвенции. Например, няма нужда от XML, анотации или други подобни, за да се каже на рамката, че клиентският клас е подкрепен от customersтаблицата; Слоят за опаковане на база данни на Rails 'ActiveRecord познава това (като същевременно се вземат предвид плурализацията и използването на главни букви). Rails стига дотам, че имплицитно и динамично добавя атрибути, за да отразява колони на базата данни: alast_nameколона автоматично създава last_nameатрибут.

В специални случаи, когато конвенциите не отговарят на вашите нужди, все още можете да добавите конфигурация, използвайки чист Ruby код или лекия Ruby-подобен YAML формат, като и двете пропускат XML излишните скоби и затварящите тагове. Но трябва да се придържате към настройките по подразбиране, където е възможно. Rails е „опитен софтуер“, който улеснява далеч по-лесно движението.

Rails е рамка „включени батерии“ (фраза, популяризирана от Python): тя включва всичко необходимо за стандартно уеб приложение, подкрепено с база данни, от слой за достъп до данни, през модел, изглед и контролер. Тя ви позволява да се съсредоточите върху специфичното за вашето приложение, вместо да прекодирате обща функционалност или да търсите библиотеки с отворен код, които се интегрират добре заедно.

Динамичност и размисъл

Java рамките също се движат към по-широко използване на отражение и метапрограмиране. Пролетта например използва отражение, за да включи всичките си части заедно с инжектиране на зависимост, за разлика от по-статичния подход на стандартния стек на Java EE сървър. Hibernate, популярната обектно-релационна рамка за картографиране, прави своето картографиране с динамично метапрограмиране, като актуализира байт кода по време на изпълнение, за разлика от ранните рамки за достъп до данни, които изискват тромав генериране на изходен код или байт код по време на разработка.

Разработчиците на Hibernate трябваше да използват някои усъвършенствани техники, за да постигнат тази функционалност, но в Ruby метапрограмирането е толкова естествена част от езика, че Rails по време на изпълнение динамично генерира не само съпоставяния, но и дефиниции на бизнес ниво, необходими за достъп и показва основната база данни, като по този начин минимизира необходимостта от ръчно кодиране или създаване на негъвкав генериран код.

Подпомагане на процеса на развитие

Около края на 90-те години програмистите на Java се „заразиха тестово“ с JUnit рамките, но писането на тестове за сървърни приложения винаги е било трудно. Spring сега генерира тестове заедно с уеб приложението. Rails прави същото, като се възползва от динамизма и метапрограмирането, за да поддържа множество видове тестове: единични тестове, които упражняват индивидуалните методи на класовете на модела; функционални тестове, които работят на нивото на индивидуалната уеб заявка; и тестове за интеграция, които изпълняват поредица от уеб заявки в симулирана потребителска сесия.

Популярните инструменти Ant и Maven стандартизират автоматизацията на компилациите в Java. Rails също улеснява изграждането с инструмента за изграждане на рейк на Ruby ; добавя иновативна система за миграция, която автоматизира надграждането (или връщането) на схеми и данни на базата данни.