Ruby on Rails je postavený, jak už z názvu vyplývá, na programovacím jazyku Ruby. Dlouho o něm prakticky nikdo nevěděl, protože jeho tvůrce je Japonec a anglické literatury k němu bylo minimum. Potom ale vznikly Ruby on Rails, vydavatelství The Pragmatic Programmers vydalo dvě skvělé knížky (zhruba na úrovni PHP od Jirky Koska) a máme tu nový hit. Samozřejmě ne v ČR, tady jsme tradičně trochu pozadu. Rails se snaží být agilním frameworkem a pro to se Ruby výborně hodí – jeho základní myšlenkou je totiž stát programátorovi co nejméně v cestě a umožňovat psát podobným způsobem, jakým myslí. Zkusím popsat pár věcí, které mě na něm zaujaly…

Na začátek bych chtěl říct, že v PHP programuju asi 8 let od verze 3 a nikdy mě nepřirostlo k srdci. V Javě dělám asi 3 roky a hned jsem věděl, že to byla chyba, ukecanější jazyk byste našli stěží. Jako vždy zde píšu vlastní názory, které vyplývají z určitých znalostí a neznalostí. Stejně tak jsem si vědom, že většinu věcí, které Ruby umožňuje, umožňují ostatní jazyky taky, jenom způsob Ruby se mi prostě líbí mnohem víc.

Cykly s pevným počtem opakování

Neboli klasický cyklus

for ($i = 0;$i < 5;$i++){
doSomething()
}

používám tak dlouho, že mě ani nenapadla možnost existence jiného zápisu. Potom přišlo Ruby, hned jsem si zvyknul na zápis:

5.times do
do_something
end

a původní způsob mi teď přijde dobrý leda pro kryptografy. Navíc udržovat si pořádek jaké písmenko abecedy máte zrovna použít, pokud cyklů vnoříte více do sebe, je taky otravné.

In-place metody

Neboli metody, které se provádějí přímo nad konkrétní instancí. Pokud chcete třeba v PHP otočit pole (tzn. aby poslední prvek byl první a naopak), tak použijete:

$foo = array(1, 3, 5);
$foo = array_reverse($foo);

A v Ruby:

foo = [1, 3, 5]
foo.reverse!

Vykřičník na konci metody říká, že se má výsledek rovnou uložit do instance na které je volaná. Nemluvě o tom, že array je jako všechno ostatní v Ruby objekt, což o PHP zdaleka neplatí (a ani o Javě).

Gettery a settery

Objektově orientované programování je v módě a je to každopádně dobrý nápad. Jednou z myšlenek je zapouzdření, neboli k vlastnostem objektu by mělo být přistupováno přes getVlastnost() a setVlastnost(). Má to svojí logiku, můžete provést potřebná přetypování, kontrolu atd. Bohužel když to nepotřebujete, tak je stejně musíte napsat a začátek každé větší třídy obsahuje mraky getterů a setterů.

V Javě (nebo PHP) tedy použijete:

class Foo {
private int bar;
public int getBar() {
return bar;
}
public void setBar(int bar) {
this.bar = bar;
}
}

Což 9 řádek kódu, které někdo musí ani ne tak napsat (máme tu chytrá IDE, i když pro PHP to moc neplatí), ale spíše číst, dokumentovat je a zkrátka jsou úplně zbytečné. A program by neměl obsahovat zbytečné věci. Ruby tohle dodržuje a používá:

class Foo
attr_accessor :bar
end

To je vše, 3 řádky kódu, zápis je elegantní a přehledný. Ruby getter a setter vytvoří za vás a bude je automaticky používat při každém přístupu k vlastnosti bar. Pokud později zjistíte, že například musíte doplnit do setteru nějakou kontrolu, tak jenom třídu lehce změníte:

class Foo
attr_reader :bar
def bar=(new_bar)
@bar = new_bar
end
end

Výhodou ale je, že je používat nemusíte. V PHP nebo Javě pokud definujete vlastnost jako public a později budete chtít setter přidat, tak se neobejdete bez změny kódu na všech místech, které tuto vlastnost dosud používaly jako public. V Ruby (a třeba i v Pythonu) vás tohle nečeká.

Chytrý switch (case)

Switch je v PHP moje oblíbená konstrukce. Na druhou stranu vždycky se mi na ní nelíbily dvě věci – nutnost psát všude break; (protože na to někdy zapomenu) a nemožnost mít více možností najednou nebo regulární výraz. Ruby tyhle oba problémy řeší:

case foo
when ‘something’, ‘something_else’
puts ‘It’s something!’
when /^d+$/
puts ‘It’s digit!’
end

Nemusíte si pamatovat názvy funkcí a pořadí parametrů

cože je problém hlavně v PHP. Mám rád konvence, protože šetří přemýšlení a nenutí mě pamatovat si zbytečné věci. PHP je skvělým příkladem chaotického vývoje. Některé funkce používají pro oddělení slov ve svých názvech podtržítka, jiné slova neoddělují. Některé třídy používají pro své metody opět podtržítko jako oddělovač (mysqli), jiné camel-casing (PDO). Největší úlet ovšem je přehozené pořadí parametrů ve funkcích, které dělají prakticky to samé, samozřejmě mám na mysli in_array a strpos. Tohle by zkrátka programmer-friendly jazyk neměl dělat.

Ruby je ale naštěstí velice programmer-friendly jazyk :-)

žádný komentář k “Úvod do Ruby, aneb dokážete tohle s PHP (Javou) II.”
  1. Luk@s napsal:

    Největší úlet ovšem je přehozené pořadí parametrů ve funkcích

    Tak s timhle se neda nic jineho delat, nez souhlasit. Zrovna pisu jeden skript ve kterem pristupuji jak do mysql, tak do postgres.
    A co me priserne vytocilo, je prohozene poradi argumentu.
    do mysql pristupuji pres mysql_query($sql_dotaz, $dbconn)
    a do postgresu pg_query($dbconn, $sql_dotaz)

  2.  
Zanechej komentář

K zanechání komentáře ke článku musíte být přihlášen. Přihlásit »