Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Ruby on Rails? Děkuji, nechci.

Ruby je špatný jazyk. Navádí programátory k špinavým technikám, tzv. bad code smell. A framework Ruby on Rails jich plně využívá.

Nejprve – nepovažujte mě prosím za propagátora PHP, jak jsem se kdesi dočetl. Za svůj život jsem okusil celou řadu programovacích jazyků, ne proto, že bych musel, ale chtěl. Programovací jazyky mě prostě baví. Mému srdci je nejbližší asi C♯. Jde však o lásku platonickou, v Cis jsem nikdy nic nenapsal. Snad se to změní.

Pro C♯ mám možná slabost i proto, že jeho autorem je Anders Hejlsberg, člověk, který svými počiny hodně ovlivnil nejen mě, ale vývoj informatiky vůbec. A to jsem o něm donedávna ani nevěděl, teprve při čtení životopisu jsem si stále opakoval: i tohle má na svědomí on?

Dalším jazykem v žebříčku oblíbenosti by mohla být Java. A co PHP? Což o to, je to dobrý jazyk, to nemohu říct :-) Průšvih je, že na rozdíl od C♯ nebo Javy není standardizovaný a jeho podobu de facto určuje (jediný?) interpret. Ten však nemá mou důvěru. Nové verze zanáší nové chyby, takže aktualizace PHP na webových serverech způsobují programátorům bezesné noci. Jen díky své bezkonkurenční rozšířenosti na nejlepší webové platformě (Unix) se stal mým hlavním programovacím jazykem.

OOP trošku jinak

Jazyk JavaScript (nebo ECMAScript, chcete-li) bývá často kritizován za způsob implementace objektů. Jde totiž o prototypový jazyk, třídy v něm neexistují a dědičnost je nahrazena prototypováním. Což je technika, která vážně porušuje základní principy OOP, jmenovitě třeba zapouzdření. Z toho plynou problémy, které vám ozřejmí Richard Šerý na svém krátkém leč výborném blogu.

Prototypové jazyky se tak hodí pouze na jednoduché skripty, ideálně psané jediným autorem. Cizí kód totiž může ovlivnit funkčnost kódu vašeho a naopak. Hrozí, že po připojení nové knihovny přestanou fungovat kusy kódu, které přitom s novou funkcionalitou nemají nic společného. Proto jako JavaScriptový framework preferují odborníci jQuery před Prototype, neboť jQuery je ohleduplný a drží se ve svém vlastním jmenném prostoru.

Jak to souvisí s Ruby?

Velmi úzce. Ruby totiž také vychází z podobného paradigma. Je JavaScriptu velice podobné. A populární framework Ruby on Rails se chová stejně neohleduplně k prostředí, jako třeba Prototype ve světě JavaScriptu.

Pro JavaScriptové odborníky je předchozí odstaveček nejspíš dostatečným argumentem, proč se Ruby a Railsům obloukem vyhnout. Pro ostatní tu mám příklad. Velice hezky a čtivě o Ruby píše Karmi. Eleganci jazyka demonstruje na tomto příkladu:

print ["banán", "citron", "ananas"].sort.last.capitalize
// vypíše Citron

Což by se v PHP (nebo podobném jazyce) napsalo asi takto:

$a = Array("banán", "citron", "ananas");
sort($a);
print ucwords( end($a) );
// vypíše Citron

Trošku odbočím: i v PHP lze podobný přístup napodobit. Jen s tím rozdílem, že PHP postrádá ty krásné literály, kterými disponuje Ruby (tj. napíšete [1, 2, 3] a tím vytvoříte objekt). Když si nadefinuji odpovídající třídy, mohu v PHP také psát:

print MyArray::factory("banán", "citron", "ananas")->sort->last->capitalize;
// vypíše Citron

Ale zpět k Ruby. Mezi oběma příklady je jeden zcela zásadní rozdíl. Zatímco v PHP se vždy vypíše Citron, v Ruby v to lze jen doufat!

V Ruby je totiž možné, stejně jako v JavaScriptu, beztrestně změnit chování kterékoliv metody v kterékoliv třídě. A to i metody, na kterou se spoléhají další části systému. Stačí, aby se kdekoliv v kódu objevilo:

class String
    def capitalize
        return 'Tůdle nůdle';
    end
end

A ukázkový příklad bude místo Citron vracet Tůdle nůdle. Říkáte si, proč by programátor něco takového dělal? Protože tak bude činit s dobrým úmyslem. Nakonec, sami tvůrci RoR takové věci dělají a dokonce ve velkém. Vylepšují chování celé řady standardních tříd, jako je String, Array, Hash, Date, Symbol, atd…

Jejich úmysly jsou dobré. Ale… Nechám na vaší představivosti domyslet, jak zákeřné chyby mohou vznikat, jak těžko se odhalují, obzvlášť tehdy, pokud se modifikující kód vykoná podmíněně, tedy jen občas. A co teprve, když budete chtít v jedné aplikaci použít dvě knihovny, z nichž každá si prostředí (tj. vestavěné třídy) změní po svém.

Ne, Ruby v tomto ohledu není dobrý jazyk.

Špetka pozitivního

Propagace Ruby používá slova jako štěstí a radost z programování. Má dlouholetá zkušenost programátora spíš říká něco o zoufalství a bolení hlavy. Realita ale není černobílá a nadšení uživatelů z RoR chápu.

Sice pro RoR platí totéž, co jsem psal o JavaScriptu: hodí se na programování jednoduchých aplikací (z pohledu zdrojového kódu) a kombinování kódů od více autorů je téměř nemožné, na druhou stranu, píšete-li v RoR, tak:

  • kód obvykle nekombinujete, protože stavíte pouze na RoR
  • i tzv. „jednoduchá“ aplikace v RoR může být navenek dokonalá a mocná

Vzhledem k zoufalé situaci se stavem frameworků na zdejší planetě je nadšení, s jakým byly Railsy přijaty, pochopitelné. Ano, je to dobrý framework. Existují i lepší. Ale používat Railsy znamená stát se jejich otrokem, tvořit plně v jejich režii.

(Ačkoliv můj názor je hodně nepopulární, pevně si za ním stojím. Nepotřebuji o něm diskutovat. Ani jsem nechtěl nikoho popudit, ať si každý používá, co mu vyhovuje. Pokud chcete napsat komentář, využijte k tomu prosím svůj blog. Díky za pochopení.)


Související: