Pokročilé vlastnosti skiptovacích jazykov

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání


Tnu wiki.png
Trenčianska Univerzita Alexandra Dubčeka v Trenčíne
Fakulta Mechatroniky
Fm wiki.png
Pokročilé vlastnosti skiptovacích jazykov

Bakalárska práca


Autor:
Pedagogický vedúci: Ing. Juraj Ďuďák
Študijný odbor: Mechatronika

Akademický rok

2008/2009

Abstrakt

Popis jazyka Ruby a porovnanie syntaxe Ruby s jazykom PHP. Charakterizácia frameworku Ruby on Rails a jeho základné moduly pre prácu s databázami. Teoretický popis vytvárania relácií v Rails. Praktická ukážka pomocou zobrazenia rozvrhu podľa zvolených požiadaviek a ukážkový benchmark porovnávajúci Rails a PHP. Informácie o iných porovnávacích benchmarkoch.

Abstract

Description of Ruby language and comparision Ruby syntax with syntax of PHP language. Characterization of Ruby on Rails framework and it’s embedded modules working with databases. Theory of creating relations in Rails. Practical use in application showing timetable in dependence on taken conditions. Benchmark Rails vs. PHP and informations about other benchmarks.

Úvod

Informačné technológie zaznamenávajú už od svojho vzniku rýchlo sa meniaci, dynamický rozvoj vo všetkých smeroch, vrátane algoritmizácie a programovacích jazykov, ktorých neustály vývoj súvisí aj s rozmachom internetu, jeho rozširujúcej sa dostupnosti a stále sa zvyšujúcimi požiadavkami na webdeveloperov. Aj z týchto príčin hľadajú programátori nové možnosti, ako čo najefektívnejšie programovať aplikácie, č sa dostávajú do pozornosti aj menej známe programovacie jazyky. Určitú pozornosť si získavajú aj frameworky, ktoré sa snažia poskytnúť prehľadnejší kód, skracujúci proces tvorby aplikácií. Populárnejším sa stáva aj framework Ruby on Rails, o ktorom je ale v slovenskom jazyku veľmi málo publikácií. Preto je teoretická časť zameraná na popis jazyka Ruby a frameworku Ruby on Rails, kde podrobnejšie opisujeme prácu Rails s databázami pomocou jeho modulov. V práci sú zahrnuté tiež teoretické informácie o tvorbe relácií medzi tabuľkami, ktoré sa následne využili v praktickej časti. Praktická časť má za úlohu prezentovať nadobudnuté informácie o jazyku Ruby a frameworku Rails. Úlohou bolo vytvoriť schému databázových tabuliek školského rozvrhu, ktorá má byť predlohou pre aplikáciu s názvom Rozvrh on Rails. Táto aplikácia má generovať výpis záznamov rozvrhu, zodpovedajúcich zadaným podmienkam vyhľadávania. Poslednou časťou je vytvorenie porovnávacieho testu, kde sa má skúmať rýchlosť vykonania požiadavky aplikáciou vytvorenou v jazyku PHP a vo frameworku Rails.

Úvod do Ruby on Rails

Pojem Ruby on Rails

Ruby on Rails je open-source framework na vytváranie webových aplikácií v jazyku Ruby. Napriek tomu, že Ruby on Rails bol oficiálne spustený len pred nedávnom v roku 2004, odvtedy zaznamenal tento framework obrovský ohlas. Ruby on Rails, Rails alebo v skratke RoR sa stal z neznámej „hračky“ svetovým fenoménom rekordnou rýchlosťou. Získal mnohé ocenenia,a čo je ešte dôležitejšie, stal sa vhodnou voľbou pre implementáciu širokého okruhu takzvaných Web 2.0 aplikácií.

Dôvodov, prečo je tomu tak, je viacero. V prvom rade tu bolo mnoho vývojárov, ktorí už boli unavení a znechutení z technológií a postupov, ktoré používali pri tvorbe webových aplikácií. Nezáleží na tom, či išlo o Javu, PHP alebo .NET – častokrát mali pocit, že veľká množina ich práce je jednoducho strata času. A zrazu prišiel Rails a ponúkol jednoduchosť a efektivitu.

Rails aplikácie sú písané v Ruby – modernom objektovo-orientovanom skriptovacom jazyku. Ruby je stručný, ale nie nečitateľne strohý, myšlienky sa v ňom dajú vyjadriť prirodzene a jasne. Toto je hlavným dôvodom jednoduchosti písania programov v Ruby, a (čo je nemenej dôležité) programy sú jednoducho čitateľné aj mnoho mesiacov neskôr.

Čo je framework

Framework vo všeobecnosti je prostredie, v ktorom je organizovaná určitá ďalšia aplikácia. Je to súbor knižníc a kódu usporiadaných tak, aby pokrývali čo najviac funkčných požiadaviek spoločných pre rôzne aplikácie. Pri webových aplikáciách to môžu byť napríklad validácia vstupov, prístup k databázi, cachovanie údajov, správa užívateľských práv. Framework má za úlohu ušetriť programátorovi čas tak, aby sa pri vývoji venoval len špecifickým požiadavkám pre aplikáciu, ktorú práve vyvíja, a ktorú nejde zovšeobecniť. V súčasnosti sa často využívajú MVC Frameworky. MVC architektúra oddeľuje dáta aplikácie (model), spôsob zobrazenia (view) a spôsob nakladania s modelom (controller). Tieto tri dôležité časti každej aplikácie sú oddelené do samostatných knižníc tak, aby zmena v jednej neovplyvnila ostatné.

Existuje množstvo frameworkov pre rôzne jazyky, pričom medzi najznámejšie patria:

Ruby

Ruby on Rails, Merb, Nitro, Himle...

PHP

vyše 40 frameworkov: CakePHP, Zend Framework, ThinkPHP, Symfony...

Java

Apache Cocoon, Ext GWT, Flexive, Hamlets, ItsNat, JavaServer Faces...

Perl

Catalyst, Interchange, Maypole, Mason, Squatting, WebGUI

Python

CherryPy, DjangoNevow, Pylons, Spyce, TurboGears, Web2py, Zope


Filozofia Ruby on Rails

Otázkou ostáva, prečo je Ruby on Rails tak píťažlivé pre programátorov, keď podobný spôsob tvorby webových aplikácií je prezentovaný aj inými frameworkami postavenými na iných jazykoch. Dôvodom je základná filozofia Ruby on Rails, ktorá je alfou a omegou tohto frameworku a spája všetko do harmonického celku. Táto filozofia je zhrnutá do hlavných myšlienok a to:

DRY (Don’t Repeat Yourself) – Neopakuj sa

Convetion over configuration – Konvencia nad konfiguráciou

DRY (Don’t Repeat Yourself) – Neopakuj sa – Každá duplikácia kódu v programe predlžuje čas strávený programovaním a okrem toho spôsobuje mnoho komplikácií – pri následných úpravách vzniká neprehľadnosť a zvyšuje sa riziko výskytu chýb v kóde. Preto by mal byť každý kód na jedinom mieste. Rails využíva Ruby aby túto myšlienku aplikoval v praxi, preto je duplikácia kódu minimálna.

Convention over Configuration – Konvencia nad konfiguráciou – Ide o jednu z rozhodujúcich čŕt Ruby on Rails. Hlavným zámerom je, aby programátor nemusel zakaždým písať pre novú aplikáciu ten istý kód, ktorý je konvenčne rovnaký pre drvivú väčšinu aplikácií. Nasledovaním konvencií tak môže pomocou pár príkazov jednoducho vytvoriť základnú kostru aplikácie, ktorú potom nakonfiguruje podľa svojich potrieb.

Ruby

Ruby ako interpretovaný objektovo orientovaný jazyk

Ruby je programovací jazyk, ktorý vytvoril Yukihiro Matsumoto, s cieľom poskytnúť tvorivý spôsob programovania. Matsumuto chcel vytvoriť jazyk, s ktorým bude radosť pracovať a ktorý bude čo najprirodzenejší. Typickým príkladom je výpis pozdravu hello world:

puts Hello world!

Príkaz znamená vypíš reťazec Hello world – v angličtine put string Hello world... Prvou a základnou vecou, ktorú treba pri jazyku Ruby pochopiť, aby sme s ním mohli plnohodnotne pracovať je to, že ide o interpretovaný a absolútne objektvo orientovaný jazyk. Interpretované (skriptovacie) jazyky sú jazyky, ktoré su prekladané pomocu interpreteru až počas behu programu. Sú pomalšie ako kompilované jazyky, ale nemajú tak veľké formálne požiadavky (nie je potreba inicializovať premennú, jej dátový typ sa môže počas behu meniť, ukazovatele sú zbytočné). Mnoho iných interpretovaných jazykov, ako napríklad PHP alebo Java podporujú objektovo-orientované programovanie, avšak nie sú absolútne objektovo orientované. Je to preto, že tieto jazyky obsahujú tzv. primitívne typy, napríklad integer, float, string, boolean, ktoré slúžia na ukladanie dát, ale nie sú objektami.

Ruby je od týchto jazykov radikálne odlišné, pretože neobsahuje žiadne z týchto primitívnych typov. Ide o čisto objektovo orientovaný jazyk, takže všetko je objekt v absolútnom slova zmysle. Základnou myšlienkou objektovo orientovaného programovania (OOP) je, že program by mal byť zložený zo samostatných entít, objektov, pričom každý z nich je schopný komunikovať s ostatnými objektami. Každý objekt je teda zložený z metód (volateľného kódu, ktorý vykonáva určitú činnosť) a interne uložených dát. Táto metóda „zabalenia“ užitočných vecí do objektu sa nazýva zapuzdrefinie. Objekty v aplikácii OOP sú často prirovnateľné k objektom reálneho sveta, čo umožňuje ľašie pochopenie funkcie a postavenia objektov v programe. A rovnako ako v reálnom svete, objekty môžu byť začlenené podľa rôznych kritérií do tried. To znamená, že triedy sú typom objektu. Tak napríklad, číslo 1 je objektom triedy Fixnum a medzi jej metódy patrí napríklad metóda + , teda súčet. Tak isto nami vytvorený objekt Trabant môže patriť do triedy auto a obsahovať metódu zapni_motor.

Pochopenie vzťahov medzi triedami, objektami a metódami umožňuje zistiť, ako OOP funguje. Objekt z jednej triedy môže napríklad vyvolať akciu iného objektu inej triedy, bez ovplyvnenia stavu ďalších objektov v tej istej triede. Tiež môžeme zmeniť určitú vlastnosť objektu bez toho, aby to malo vplyv na iné objekty tej istej triedy – keďže objekt sa správa ako samostatná entita. Každý nový objekt je vytváraný z určitej triedy, z ktorej vychádza – tento proces je nazývaný aj konktretizácia. Vytvorené objekty medzi sebou môžu komunikovať a vyvolávať metódy, spôsobom otázok a odpovedí. V prípade OOP sú otázkami inštrukcie a odpoveďami návratová hodnota, resp. stavová správa indikujúca, či bola požadovaná inštrukcia úspešne vykonaná. Tak v našom príklade môže objekt šofér požadovať inštrukciu zapni_motor od objektu Trabant, pričom návratovou hodnotou môže byť informácia o úspešnom alebo neúspešnom naštartovaní motora.

Keďže Ruby je absolútne objektovo orientovaný, čokoľvek v ňom je buď objektom, triedou alebo metódou určitého objektu a tak budeme aj pristupovať k informáciám v nasledujúcich podkapitolách, či pôjde o čísla, textové reťace alebo polia. Spomenuté výrazy si postupne rozoberieme v nasledujúcom texte.

Inštalácia a vývojové prostredie Ruby

Ruby na OS Windows nainštalujeme stiahnutím kompletného inštalátora Ruby z adresy http://rubyinstaller.rubyforge.org a jeho následným nainštalovaním. Na všetkých novších verziách Mac OS X a Linux je Ruby nainštalovaný automaticky. Pre prácu s Ruby je dostačujúci akýkoľvek textový editor, napríklad WordPad alebo Poznámkový blok, pričom výsledný Ruby program je potrebné uložiť s príponou .rb . Tento je potom spustiteľný z príkazového riadku.

Ďalšou možnosťou práce s Ruby je rozhranie IRB (Interactive Ruby Shell), pre ktorého spustenie stačí napísať irb do príkazového riadku. IRB rozhranie umožňuje interaktívne poskytnúť výsledok nášho príkazu, takže je ideálny pre testovanie jednoduchých jednoriadkových príkazov – preto ho budeme občas používať aj v nasledujúcich príkladoch.

Čísla, reťazce, premenné a konštanty

Ruby podporuje ako celé čísla (integer), tak i čísla s desatinnou čiarkou(float), pričom veľkosť celých čísel v ňom nie je nijako obmedzená – jediným obmedzením je teda voľná pamäť počítača. Čísla v rozmedzí od -230 do 230-1 alebo -262 do 262-1 sú zaradené do triedy Fixnum, ostatné presahujúce daný rozsah sú triedy Bignum. Presvedčiť sa o tom môžeme jednoduchým príkazom:

irb> 1
=> 1

V tomto príklade sa môže zdať, že sme dostali identický výstup od vstupu. A predsa tomu nie je tak. Výstupom je novovytvorený plnohodnotný Ruby objekt. Volaním metódy class môžeme ľahko zistiť, do ktorej triedy patrí naše číslo 1:

irb> 1.class
=> Fixnum

Výsledok je jasný, každý objekt je priradený do svojej triedy. Ruby sa o to najnutnejšie postará sám, okrem toho umožňuje veľké čísla zapísať oddelené podtržítkami pre sprehľadnenie, napríklad:

irb>100_111_222_333_444
=>100111222333444

Desatinné čísla sa dajú písať s vložením desatinnej čiarky, napríklad 3,1415, alebo s exponentom 31415.0e-4. Môžeme písať aj čísla binárne, zapísaním 0b na začiatok, osmičkové s 0 na začiatku a hexadecimálne s pomocou predpony 0x. Zadané vstupy teda odpovedajú nasledovným výstupom:

irb>0b10101
=>21
irb>0134
=>668
irb>0xa321c
=>668188

Reťazce

Reťazce sa môžu uzavrieť do apostrofov (``) alebo úvodzoviek (””),takže výrazy ”Ahoj” a `Ahoj` sú identické. Ak chceme použiť apostrofy alebo úvodzovky v texte, môžeme ich kombinovať, alebo môžeme v texte miesto nich vložiť %q (apostrofy) alebo %Q (úvodzovky) spolu s jediným znakom a na mieste ukončenia daný znak. Rovnaký efekt bude mať použitie dvojice znakov { a }, popr. < a >, dokonca môžeme vypustiť znak Q. Takže nasledujúce výrazy sú ekvivalentné:

irb>Povedal: `Ahoj!`
irb>Povedal: %q/Ahoj!/
irb>Povedal: %q{Ahoj!}
irb>Povedal: %q<Ahoj!>    # výpis bude vždy: Povedal: `Ahoj!`

Reťazce sa spájajú znakom +, napríklad:

irb>jedna,  + dva,  + tri
=>jedna, dva, tri

Volaním metódy length zistíme dĺžku daného reťazca – objektu:

irb>jedna, dva, tri.length
=>15

Výsledok určitého matematického výpočtu v reťazci zobrazíme jeho ohraničením do znakov #{ a }, napríklad:

 irb>5+7 je po scitani #{5+7}”
=>5+7 je po scitani 12

Premenné

Ruby dokáže ukladať dáta v premenných, čo sú pomenovaní zástupcovia predstavujúci nejaké čísla, reťazce a ďalšie údaje. Na tieto dáta uložené v premennej na odkazuje použitím názvu danej premennej. Premenné začínajú malým znakom a-z alebo podčiarkovníkom _ , potom nasleduje ľubovoľný počet znakov názvu – môže to byť malé i veľké písmeno, číslo, podčiarkovník. Jedinou podmienkou je nepoužívať slová, ktoré pre seba rezervuje jazyk Ruby, napríklad výrazy vyjadrujúce podmienky (if, then, when, else, elseif..), pravdivostnú hodnotu (true, false) alebo ohraničenie skupiny príkazov (begin, end).

Krátky príklad definovania a práce s premennou teplota:

irb>teplota=20
=>20
irb>Teplota je +String(teplota)
=>Teplota je 20
irb>teplota=teplota+5
=>25
irb>Aktualna teplota je #{teplota}”
=>Aktualna teplota je 25

Z príkladu vidno, že ak chceme k reťazcu priradiť číslo, je potrebné použiť metódu String, alebo ohraničiť prennú znakmi #{ a }. Ekvivalentom metódy String je metóda to_s:

irb>Teplota je +teplota.to_s
=>Teplota je 25

Globálne premenné

Globálne premenné sú premenné platné v celom programe a začínajú znakom $:

$x, $datum, $abc_DEF

Premenné inštancií

Premenné začínajúce znakom @ sú premenné inštancií (inštancie) :

@x, @datum, @abc_DEF

Premenné inštancií na rozdiel od lokálnych premenných zachovávajú hodnoty do nich uložené, pokiaľ existuje ich príslušný objekt.

Konštanty

V Ruby je tiež možné vytvárať konštanty. Konštanta obsahuje určitú hodnotu, ktorá ostáva časovo nemenná. Každá konštanta začína veľkým písmenom, ktorým Ruby rozpozná, že sa jedná o konštantu. Konštanty umožňuje Ruby zmeniť, v takom prípade sa zobrazí upozornenie o tom, že daná konštanta bola už inicializovaná.

irb>TRPASLIKOV= 7
=>7

Symboly, polia a hash

Symboly

(v iných jazykoch nazývané atómy) sú podobné reťazcom. Môžu obsahovať znaky, čísla, podčiarkovník, ale začínajú dvojbodkou:

:a, :b2, :agent_007

Symboly sa používajú na ukladanie raťazcov, keď nie je požadovaný výstup na obrazovku; v kóde nedochádza k ich náhrade.

Polia

Polia predstavujú skupiny premenných rôznych typov ku ktorým je možné pristupovať prostredníctvom indexu:

pole=[a,b,14,zelena]
puts pole[2]                 # vypíše 14
pole[3,1]=modra            #nahradí 1 element od pozície 3 reťazcom modrá
puts pole                    #výpis bude: [”a”, ”b”, 14, ”modra”]

Hash (asociačné polia)

Hash je pole, ku ktorého premenným možno pristupovať namiesto indexov prostredníctvom textových reťacov. K jeho vytvoreniu sa používajú zložené zátvorky:

kolko_dni_ma_mesiac = { januar => 31, februar => 28, marec =>31}
kolko_dni_ma_mesiac[februar]        # vypíše 28

Podmienené výrazy, cykly, metódy a bloky

Prístup k objektom jazyka Ruby

Jazyk Ruby ponúka 3 úrovne prístupu k metódam: Verejné metódy je možné volať z každého miesta kódu, nemajú žiadne obmedzenia. Chránené metódy možno volať iba vnútri objeku tej triedy, ktorá dané metódy definuje alebo objektov tried odvodených z danej triedy. Súktormné metódy je možné voleť len vnútri aktuálneho objektu. Ruby definuje kľúčové slová (public, protected, private), označované ako modifikátory prístupu.

Vytváranie premenných triedy

Premenné inštancií sa vytvárajú pridaním predpony @ pred ich názov. Premenné triedy sa dajú vytvoriť pripojením @@ pred názov. Takúto premennú triedy zdieľajú všetky jej inštancie, takže zmena tejto hodnoty v jednom objekte spôsobí zmenu vo všetkých objektoch danej triedy (naproti tomu premenné inštancií sú v objektoch interné).

class Ovocie
   @@pocet_ovocia = 0
   attr_accessor:farba
   def initialize(farba)
        @farba=farba
        @@pocet_ovocia += 1        
    end
end

Definovaná premenná triedy @@pocet_ovocia pri každom vytvorení nového objektu triedy Ovocie zvýši hodnotu o 1.

Vytváranie metód triedy

Metódy triedy sa volajú pomocou mena danej triedy, pred jej použitím nie je potrebné vytvárať žiadny objekt. Toto je výhodné a užitočné najmä v prípadoch, keď nepotrebujeme ukladať dáta, s ktorými pracujeme, keďže v metóde triedy nemožno používať dáta inštancií .

Vytváranie modulov

Porovnanie Ruby a PHP

Ruby on Rails

MVC architektúra

MVC v Rails

Práca s databázami v Rails – CRUD

Vzorová aplikácia v Rails

Asociácie

Migrácie

Praktická aplikácia využívajúca Rails

Rozvrh on Rails

Návrh schémy

Vytvorenie databázy Rozvrh on Rails

Zobrazenie rozvrhu

Benchmark

Záver

Použitá literatúra