O co jde?
Merb je webový framework silně inspirovaný slavným Ruby on Rails. Původně byl Merb pouhým handlerem webového serveru Mongrel, který se používá právě s Rails a měl za cíl zrychlit nahrávání souborů. Postupem času se rozrostl a stal se z něho plnohodnotný webový framework.
Merb je stejně jako většina dnešních moderních frameworků založen na MVC architektuře. To znamená, že práce s daty se děje v modelech, kontroléry obsahují zpracování dat z pohledů a konečně pohledy obsahují zobrazovací logiku.
Zcela zásadní vlastností Merbu je jeho modularita – Merb je pouze webový framework, to umí, a o jiné věci se již nestará. Neobsahuje žádné defaultní ORM, nepřikazuje, jaký se má použít testovací framework, ani s sebou nenese nějaký konkrétní javascriptový framework – to vše za něj dělají ostatní knihovny.
Kdo používá Merb?
Merb je vyvíjen společností Engine Yard, což je poměrně velká a rozhodně dosti dobře prosperující firma zaměřená na Ruby technologie, hosting Ruby aplikací, jejich vývoj, a podobně. Krom Merbu a DataMapperu, ke kterému se dostaneme dále, stojí Engine Yard také za projektem Rubinius, což je velmi slibný smalltalkovský virtuální stroj pro Ruby.
Je pochopitelné, že když Engine Yard Merb vyvíjí, že jej bude také používat. To je pravda, již dnes mají produkčně nasazeny desítky aplikací běžící na Merbu.
Engine Yard ale není jedinou společností, která používá Merb – ten totiž velmi hojně nasazuje i Apple, který jistě není třeba představovat. Abych byl konkrétnější – Merb je obsažen v javascriptovém frameworku SproutCore, ve kterém Apple poslední dobou dělá snad všechny své weby, včetně poměrně známého MobileMe.
Inovace a výhody Merbu
Disclaimer: Merb je hodně inspirován Rails, takže tato část je míněna především jako srovnání, co nového Merb oproti Railsům přináší. Netvrdím, že podobné věci neobsahují jiné webové frameworky.
Hackovatelnost Merbu
Mezi jednu z nejužitečnějších vlastností Merbu patří velmi snadná hackovatelnost. Kdo se někdy blíže seznamoval se zdrojáky Rails, jistě tuto vlastnost ocení.
Ona hackovatelnost je nejlépe vidět na Merbových pluginech. Dobrou ukázkou může být například Merb Slices. Dělá v zásadě přesně to, co Rails Engines, tedy umožňuje tvorbu vysokoúrovňových modulů aplikace jako například přihlašování nebo třeba rovnou blogovací systém či e-shop, ale na rozdíl od Rails Engines je to malý, jednoduše napsaný plugin, který nepoužívá žádné hacky.
Merb má v sobě defaultně zabudovaný Rack, což je nadstavba nad webovými servery. Umožňuje pro ně psát handlery a řešit některé věci, které není nutné řešit přes aplikaci, jako je například nastavení Content-Type souborů v public/downloads a podobně. Velmi užitečná věcička.
Mnohdy potřebujete pouze drobnou aplikaci, která nemusí mít žádný model. V takovém případě vám Merb umožňuje vygenerovat tzv. flat aplikaci, která obsahuje pouze jediný kontrolér, soubory s konfigurací a složku s pohledy (views). Pokud máte opravdu hodně miniaturní aplikaci, můžete použít také tzv. very flat aplikaci, což je jediný soubor se vším potřebným.
Renderování
Zajímavým nápadem jsou part controllers, což je rozvinutá myšlenka part templates. Part templates jsou větší, opakující se části kódu pohledů. Příkladem může být formulář, který je stejný pro akci vytvoření nové entity i pro její editaci. Part controllers obsahují krom šablony i kontrolér, a dají se tak úplně ideálně použít na takové věci, jako je přehled tagů, výpis zpráviček, nejčtenějších článků a podobně, prostě k sobě patřících částí stránky. Musím říct, že to dramaticky zpřehlednilo můj kód, zejména v layoutu a ApplicationController
, resp. Application
, což je railsová, resp. třída ve vaší aplikaci, od níž jsou zděděny veškeré kontroléry.
Šikovná je také práce Merbu s renderováním. V Rails se renderuje automaticky po provedení dané metody kontroléru, v Merbu musíte pro totéž použít metodu render
, případně display @object
. To není samoúčelné – pokud žádnou z těchto metod nepoužijete, Merb vrátí klientovi návratovou hodnotu metody. Stačí vrátit stream či soubor a ten je automaticky poslán na klienta.
Oproti Rails, které doslova zamořují kontroléry metodou provides určující, jaké formáty daná metoda podporuje, zvolil Merb elegantější řešení: provides je metoda třídy a definuje se na jednom místě:
class Posts < Application provides :yaml, :xml, :html def index @posts = Post.all display @posts end def show @post = Post.get(params[:id]) raise PostNotFound unless @post display @post end def feed only_provides :rss @posts = Post.latest render end end
Pokud uvnitř metody zavoláme only_provides
, budou formáty definované pomocí provides
ignorovány a použijí se pouze ty, které zadáme metodě only_provides
. Pokud vám vrtá hlavou, jak se to vykreslí, když máme stále pouze jednu šablonu, která je zpravidla dělaná pro HTML, tak napovím – pokud objekt předaný metodě display
disponuje metodou to_xml
, to_yaml
a podobně, vykreslí se výsledek této metody. Teprve pokud taková metoda neexistuje, renderuje se šablona.
Výjimky zděděné od některé z tříd definovaných v modulu Merb::ControllerExceptions
zachytává kontrolér Exceptions, přičemž daná akce se jmenuje stejně jako dotyčná třída výjimky, akorát je převedena na podtržítkovanou verzi, tedy místo na výjimku třídy PostNotFound
bude směrována na metodu post_not_found
.
def show @post = Post.get(params[:id]) raise PostNotFound unless @post display @post end
Rychlost Merbu
Rychlost a značná paměťová náročnost je velkým problémem Rails. Je to způsobeno především zamykáním threadů na nepřiměřeně dlouhou dobu, což Merb nedělá. Merb se také snaží zůstat malý a nepřehánět to s metaprogramováním. To je sice dobré, ale časté používání takových věcí, jako je method_missing
nebo define_method
, nemá dobrý vliv na rychlost a mnohdy ani na čitelnost kódu.
Samozřejmě co se týče paměťové náročnosti, zde záleží především na samotném Ruby a jeho vazbě na webový server, zde nějaký zázračný rozdíl oproti Rails čekat nemůžeme, ale určitý rozdíl tu přeci jenom je. Nejméně paměťově náročná by měla být alternativa s mod_rails
pro Apache, často se používá Nginx nebo mongrelový cluster.
Stadardy dokumentace Merbu
Merb je jedním z nejlépe dokumentovaných projektů v Ruby světě. Programátoři v Ruby se zpravidla s komentováním příliš neobtěžují, protože Ruby je velmi přehledný a samovysvětlující jazyk. Merb je mnohem důslednější a nepopisuje pouze, co daná metoda dělá, jak je zvykem při dokumentování pomocí RDoc, ale také co vrací, jaké bere parametry, jaké výjimky hází a zda patří do veřejného, poloveřejného nebo privátního API. To se liší v tom, zda je určeno pro používání vývojáři pluginů, či zda je to interní záležitost Merbu. Vývojáři slibují maximálně stabilní veřejné API.
DataMapper
Ačkoliv je Merb ORM–agnostický, převážná většina merbových vývojářů používá DataMapper ORM. DataMapper je bratříčkem Merbu, stojí za ním stejná společnost i podobná filosofie. DataMapper je totiž zase agnostický k typu úložiště – můžete si vybrat, zda chcete ukládat do databáze, na disk do souborů nebo kamkoliv jinam. Stejně jako Merb, i DataMapper je modulární a skvěle dokumentovaný.
Co se týče podpory databází, momentálně je podporována MySQL, SQLite, PostgreSQL. Všechny jsem testoval, s DataMapperem fungují bez problémů. Lze doinstalovat také podporu CouchDB z balíčku dm-more, tu jsem zatím netestoval.
Podobně jako Merb, i DataMapper se snaží být co možná nejrychlejší a nejúspornější. Oproti ActiveRecordu umožňuje například volit, zda chceme použít lazy-loading a podobně, nicméně úspornost je vidět především na úrovni jeho implementace.
Osobně DataMapper používám velmi rád, nicméně není to jediná možnost. Lze použít také railsový ActiveRecord nebo Sequel, což je lehké ORM zaměřené na snadné dotazování v Ruby.
Současný stav vývoje Merbu
Merb je momentálně právě ve verzi 0.9.4, přičemž zhruba od verze 0.9 je dokonale stabilní a změny v API jsou pouze občasné. V nejbližších týdnech se chystá vydání stabilní verze 1.0, po které vývojáři slibují, že by veřejné API do verze 2.0 měněno být nemělo.
Poněkud horší situace je ohledně DataMapperu, který je sice také ve verzi 0.9.4, ale změny jsou zatím poměrně časté a sem tam se vyskytne i nějaká ta chybka. Vývoj jde ale dobředu velmi rychle a v nejbližší době se také chystá stabilní 1.0 verze. Kdybyste přesto DataMapperu stále nevěřili, připomínám, že v Merbu můžete použít libovolné ORM – třeba časem ověřený ActiveRecord z Rails.
Shrnutí
Merb je příjemný, jednoduchý a mocný webový framework. Již dnes za ním stojí velmi silná komunita i komerční subjekty, což mu dává skvělou perspektivu do budoucna. Merb je také přínosem pro prosazování lepší dokumentovanosti Ruby knihoven a v neposlední řadě z něj těží samotné Rails, které má konečně konkurenci a inspiraci.
Odkazy
Zdroje v češtině
- Merb: Rails po odtučňovací kůře
- DataMapper: chytřejší než ActiveRecord
- Merb-fixtures: můj první merbový plugin
- Případová studie: [zadání, návrh, první krůčky, resources]
- Další články budou postupně přibývat pod tagem Merb a DataMapperna BotaBlogu. V současné době je to bohužel jediný český zdroj informací o Merbu.
Zdroje v angličtině
- Domovské stránky Merbu
- Domovské stránky DataMapperu
- Merb wiki
- Oficiální Merb blog
- Merb planet
- Blog Yehudy Katze (core vývojář Merbu)
- Blog Ezry Zygmuntowicze (otec Merbu)