Ohjelmointi

JRuby on Rails: Java-voima, Ruby on Rails -sovelluksen yksinkertaisuus

Ruby, monipuolinen olio-orientoitu dynaaminen (komentosarjakieli), jolla on vahva tuki toiminnalliselle ohjelmoinnille ja metaohjelmoinnille, on viime aikoina kiinnittänyt huomiota sen joustavuuteen ja helppoon kehitykseen. JRM, JVM-pohjainen tulkki Rubylle, yhdistää Ruby-kielen helppouden tehokkaan JVM: n suorittamiseen, mukaan lukien täydellinen integrointi Java-kirjastoihin ja niistä.

Edellisestäni lähtien JavaWorld artikkeli aiheesta ("JRuby Java-maailmalle"), JRuby on kehittänyt mielenkiintoisia tapahtumia. Sun Microsystems palkkasi kaksi johtavaa JRuby-kehittäjää, Charles Nutterin ja Thomas E. Enebon, merkiksi tuesta Rubylle JVM: ssä. Java Platform, Standard Edition 6 (Java SE 6) julkaistiin uudella vakiosovellusliittymällä tulkkien liittämistä varten dynaamisille kielille. Suunnitelmat ovat vahvistamassa Java 7 VM: ää tukemaan dynaamisia kieliä suoraan uudella "dynaamisen kutsun" tavukoodilla ja luokan määritelmien vaihdolla ajon aikana. Samaan aikaan JRuby-tiimi on julkaissut version 0.9.2 laajemmalla tuella Ruby on Railsille, ja seuraava helmikuussa odotettavissa oleva suuri JRuby-julkaisu sisältää täyden tuen Ruby on Railsille.

Ruby on Rails, helppokäyttöinen, mutta tehokas, Ruby-kielelle rakennettu verkkokehys, on nopeasti saavuttanut suosiota uusien tietokantatukea olevien verkkosovellusten suhteen, etenkin Web 2.0 -maailmassa. Viitan sinut muualle saadaksesi lisätietoja Ruby on Rails -nimestä, jota kutsutaan myös Railsiksi. Vaikka projekti on vasta 3 vuotta vanha, siitä on kirjoitettu runsaasti artikkeleita ja kirjoja, ja sen dokumentaatio on erinomainen avoimen lähdekoodin projektille (katso Ruby on Rails -sivusto). Samoin viittaan sinut aikaisempaan artikkeliini esittelyyn JRubyyn.

Tässä artikkelissa tarkastelen Railsin ja Java: n risteystä. Vertailen Rails- ja Java-verkkokehyksiä, kuvailen Railsin käytön etuja JRubyyn ja tarkastelen joitain oppitunteja, jotka Java-kehittäjä - jopa se, joka ei käytä Railsia - voi oppia tästä innovatiivisesta kehyksestä.

Teho ja yksinkertaisuus

Rails nopeuttaa ja yksinkertaistaa verkkosovellusten kehitystä radikaalisti, mutta se kärsii epäkypsästä kuvasta etenkin huippuluokan yritystoiminnassa.

Toisaalta Java-alustan virtuaalikoneiden, kirjastojen ja sovelluspalvelimien nopeus, vakaus ja toiminnallisuus ovat kasvaneet siihen pisteeseen asti, että sitä pidetään yleensä johtavana alustana huippuluokan palvelinsovelluksissa. Niin kauan kuin Java-foorumi pysyy sidoksissa Java-kieleen, Java-foorumi saattaa jäädä jälkeen, kun uudemmat kielet suosivat.

JRuby yhdistää kaikkien näiden tekniikoiden täydentävät vahvuudet, lupaamalla sekä Rubyn että Railsin suosiota ja antaen samalla Java-alustalle uuden roolin muiden kuin Java-kielten käytössä.

Kiskot: Mihin Java-kehykset ovat menossa

Java-kehittäjälle Rails näyttää olevan luonnollinen huipentuma trendille Java-verkkokehysten kehityksessä: vähemmän tarpeetonta koodia, enemmän abstraktiota ja dynaamisuutta ja täydellisempiä valmiita toimintoja.

Kokous kokoonpanosta

Java Platform, Enterprise Editionin (Java EE) varhaiset versiot vaativat kattavan määrityksen ja koodin jokaiselle komponentille. Esimerkiksi Enterprise JavaBeansilla oli useita lähdekoodi- ja XML-määritystiedostoja kutakin papua kohden. Tämä monimutkaisuus muutti EJB: n raskaan painon kehityksen avainsanaksi ja johti lopulta 180 asteen käännökseen EJB 3: ssa, jonka tavoitteena on POJO-pavut (tavalliset vanhat Java-objektit), joilla on minimaalinen redundanssi ja kokoonpano. Silti raskaat Java EE -sovellukset vaativat edelleen kehittäjiä kehittämään koodin ilmaisemaan samat liikeobjektit useilla ohjelmatasoilla - käyttöliittymä, liiketoimintalogiikka ja pysyvyys. Sitten tasojen välisestä redundanssista ja samankaltaisuudesta huolimatta kehittäjien on liimattu kerrokset yhteen kokoonpanotiedostoilla. Sitä vastoin uudemmat Java-verkkokehykset Seam ja Spring paljastavat liikeobjektit paljon vähemmän kokoonpanolla ja koodilla.

Java-kehykset ovat myös siirtyneet kohti standardointia ja pinon integrointia Web-sovellustasojen yli. Aikaisin aikoina Java-verkkosovellusten kehittäjät koodaivat HTML-lähdön käsin servlet-sovelluksista, loivat omat Model-View-Controller -arkkitehtuurit ja pääsivät tietokantoihinssa SQL: llä Java Database Connectivity (JDBC) -yhteyden kautta. Myöhemmin he keräsivät komponentteja suorittamaan suuren osan yleisistä toiminnoista, kuten tag-kirjastot, Struts ja Hibernate. Äskettäin Spring integroi suuren osan toiminnoista yhteen ylhäältä alas kevyeen pinoon.

Rails on alusta alkaen sisällyttänyt nämä yksinkertaisuusperiaatteet, periaatteet, jotka Rails-yhteisö tunnetaan nimellä "Älä toista itseäsi" ja "Kokoonpano sopimuksesta". (Ei-redundanssi ja mielekäs oletusarvo ovat vanhimpia ohjelmistosuunnittelun periaatteita; on ihme, että joudumme odottamaan niin kauan jotain Railsia.) Kehys arvaa yhteyden eri tasojen välillä suoraviivaisten käytäntöjen perusteella. Esimerkiksi XML: ää, merkintöjä tai vastaavia ei tarvita kertoa kehykselle, että asiakasluokan takana on Asiakkaat pöytä; Railsin ActiveRecord-tietokannan päällystyskerros arvaa tämän (ottaen huomioon moniarvoisuus ja isot kirjaimet). Rails menee niin pitkälle, että se lisää implisiittisesti ja dynaamisesti attribuutteja tietokannan sarakkeiden heijastamiseksi: a sukunimi sarake tuo automaattisesti a sukunimi määritteeksi.

Erityistapauksissa, joissa käytännöt eivät vastaa tarpeitasi, voit silti lisätä kokoonpanoa käyttämällä puhdasta Ruby-koodia tai kevyttä Ruby-tyyppistä YAML-muotoa, joissa molemmissa jätetään XML: n turhat suluet ja sulkevat tunnisteet pois. Mutta sinun on pidettävä kiinni oletusarvoista, jos mahdollista. Rails on "mielipidettä tuottava ohjelmisto", joka tekee siitä paljon helpompaa, kun menet mukana virtauksessa.

Rails on "paristoihin sisältyvä" kehys (Pythonin suosima lause): se sisältää kaiken, mitä tarvitset tavalliseen tietokantatukea käyttävään verkkosovellukseen, tiedonsiirtokerroksesta malliin, näkymään ja ohjaimeen. Sen avulla voit keskittyä sovelluksesi erityispiirteisiin sen sijaan, että koodaat yleisiä toimintoja tai etsit avoimen lähdekoodin kirjastoja, jotka integroituvat hyvin yhteen.

Dynaamisuus ja pohdinta

Java-kehykset ovat myös siirtyneet kohti reflektoinnin ja metaprogrammien käyttöä. Esimerkiksi Spring käyttää heijastusta kaikkien kappaleidensa liittämiseen riippuvuusinjektioon, toisin kuin tavallisen Java EE -palvelinpinon staattisempi lähestymistapa. Hibernate, suosittu objektisuhdekartoituskehys, tekee kartoituksensa dynaamisella metaprogrammilla päivittämällä tavukoodin ajon aikana, toisin kuin varhaiset datakäyttöympäristöt, jotka vaativat hankalaa lähdekoodin tai tavukoodin luomista kehityshetkellä.

Hibernate-kehittäjien oli käytettävä joitain kehittyneitä tekniikoita tämän toiminnon saavuttamiseksi, mutta Ruby-ohjelmassa metaprogrammointi on niin luonnollinen osa kieltä, että Rails tuottaa ajon aikana dynaamisesti kartoitusten lisäksi myös yrityskerroksen määritelmiä, joita tarvitaan pääsyyn ja Näytä taustalla oleva tietokanta minimoiden siten manuaalisen koodauksen tai joustamattoman generoidun koodin luomisen tarpeen.

Kehitysprosessin tukeminen

Noin 1990-luvun lopulla Java-ohjelmoijat saivat "testitartunnan" JUnit-kehyksistä, mutta palvelinpuolen sovellusten testien kirjoittaminen on aina ollut vaikeaa. Spring tuottaa nyt testit yhdessä verkkosovelluksen kanssa. Rails tekee samoin hyödyntämällä dynaamisuutta ja metaprogrammointia tukeakseen useita testityyppejä: yksikkötestit, joissa harjoitetaan malliluokkien yksittäisiä menetelmiä; toiminnalliset testit, jotka toimivat yksittäisen verkkopyynnön tasolla; ja integraatiotestit, jotka suorittavat sarjan Web-pyyntöjä simuloidussa käyttäjäistunnossa.

Suositut Ant- ja Maven-työkalut standardoivat Java-rakennusten automatisoinnin. Myös kiskot tekevät rakentamisesta helppoa Rubyn kanssa harava rakennustyökalu; se lisää innovatiivisen siirtojärjestelmän, joka automatisoi tietokantamallien ja tietojen päivityksen (tai palautuksen).