Pokročilé vlastnosti skiptovacích jazykov: Rozdiel medzi revíziami
Riadok 249: | Riadok 249: | ||
</source> | </source> | ||
− | == | + | ===Break, redo a next v cykloch=== |
+ | Existujú 3 kľúčové slová využiteľné v súvislosti s cyklami a iterátormi: ''break, redo'' a ''next''. | ||
+ | ''Break'' okamžite ukončuje daný cyklus (ten, v ktorom sa nachádza). | ||
+ | ''Redo'' opakuje iteráciu aktuálneho cyklu (bez toho aby došlo k novému vyhodnoteniu podmienky cyklu alebo prevzatiu nasledujúcej položky z nejakého iterátora) | ||
+ | ''Next'' preskakuje na koniec aktuálnej iterácie (tkaže cyklus alebo iterátor preskočí na ďalšiu iteráciu alebo položku). | ||
+ | |||
===Prístup k objektom jazyka Ruby=== | ===Prístup k objektom jazyka Ruby=== | ||
Jazyk Ruby ponúka 3 úrovne prístupu k metódam: | Jazyk Ruby ponúka 3 úrovne prístupu k metódam: |
Verzia zo dňa a času 23:35, 29. december 2009
![]() |
Trenčianska Univerzita Alexandra Dubčeka v Trenčíne
Fakulta Mechatroniky |
![]() |
Pokročilé vlastnosti skiptovacích jazykov Bakalárska práca |
Autor: | Ivana Zuzinová |
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. |
Obsah
- 1 Úvod
- 2 Úvod do Ruby on Rails
- 3 Ruby
- 4 Porovnanie Ruby a PHP
- 5 Ruby on Rails
- 6 Praktická aplikácia využívajúca Rails
- 7 Záver
- 8 Použitá literatúra
Ú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
V nasledujúcich príkladoch je zobrazený obecný syntax príkazov vrátane voliteľných klauzulí (tieto nepovinné klauzule sú ohraničené hranatými zátvorkami): if :
if logický_výraz [then | :]
kód1
[elseif
kód2]
[else
kód3]
end
unless:
unless logický_výraz [then | :]
kód1
[else
kód2 ]
end
case:
case hodnota
when výraz [, porovnanie]… [then | :]
kód1
when výraz [, porovnanie]… [then | :]
kód2
...
[else
kód]
end
Ternárny operátor:
výsledok = podmienka ? pravdivá_hodnota : nepravdivá_hodnota
while:
while podmienka [do | :]
kód
end
until:
until podmienka [do | :]
kód
end
for:
for premenná [, premenná...] in kolekcia [do | :]
kód
end
Break, redo a next v cykloch
Existujú 3 kľúčové slová využiteľné v súvislosti s cyklami a iterátormi: break, redo a next. Break okamžite ukončuje daný cyklus (ten, v ktorom sa nachádza). Redo opakuje iteráciu aktuálneho cyklu (bez toho aby došlo k novému vyhodnoteniu podmienky cyklu alebo prevzatiu nasledujúcej položky z nejakého iterátora) Next preskakuje na koniec aktuálnej iterácie (tkaže cyklus alebo iterátor preskočí na ďalšiu iteráciu alebo položku).
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
Pri väčšom počte tried je užitočné zoskupovať ich do modulov. Modul sa vytvára kľúčovým slovom module. Modul s kódom možno vložiť do jedného súboru:
module Matematika
def Matematika.sucet(cislo_jedna, cislo_dva)
return cislo_jedna + cislo_dva
end
end
Takýto modul uložený napríklad do súboru matematika.rb je možné použiť v iných súboroch príkazom include alebo skráteným príkazom (bez potreby zápisu prípony .rb) require:
include `matematika.rb` / require `matematika`
puts ”2 + 3 = ” + Matematika.sucet(2,3).to_s #výstup: “2 + 3 = 5“
Do modulov je možné ukladať aj triedy, ktoré môžu obsahovať vlastné metódy. K takýmto metódam vnútri tried modulov sa pristupuje pomocou operátora rozlíšenia oboru názvov jazyka Ruby (::) :
module Matematika
class Scitac
def Scitac.sucet(cislo_jedna, cislo_dva)
return cislo_jedna + cislo_dva
end
end
end
require `matematika`
puts ”2 + 3 = ”+ Matematika::Scitac.sucet(2,3).to_s
Výsledok bude totožný ako v predošlom príklade.