Hlavní navigace

Seaside (1)

21. 2. 2005
Doba čtení: 7 minut

Sdílet

Seaside je vysokoúrovňový framework pro tvorbu objektově orientovaných webových aplikací podporující snadnou kontrolu toku řízení, komponentní model, dekorátory, transakční zpracování, backtracking, modifikaci aplikací za běhu přímo z webového rozhraní, XMLHttpRequesty, snadné zpracování výjimek, přizpůsobivé konfigurační prostředí a řadu dalších vlastností, dozajista si tedy zaslouží nemalou pozornost.

Běžné frameworky kopírují model protokolu HTTP. Oddělují proces tvorby HTML stránky posílané klientovi od zpracování dat zaslaných uživatelem. Poté se rozhodují, jakou stránku mají dále generovat. U tohoto přístupu je poměrně obtížné definovat složitější procesy webové aplikace. Je prakticky nemožné oddělit logiku jednotlivých komponent stránky od aplikační logiky jako takové.

Jako příklad si představte stránku obsahující seznam firem, na níž chcete dát uživateli možnost stisknout tlačítko „Hledej“, po kterém se mu zobrazí nová stránka s vyhledávacím formulářem. Po jeho vyplnění a odeslání se uživateli nabídne seznam firem odpovídajících vyhledávaným kritériím. Uživatel zvolí kýženou společnost a vrátí se zpět na původní stránku se seznamem, ve kterém nyní bude o vyhledanou firmu více. Obecné řešení této jednoduché úlohy je ve skutečnosti značně komplikované. Programátor musí velmi neintuitivně zajišťovat, aby se uživatel z vyhledávací stránky vrátil tam, kam má – a to především v případě, že stejný vyhledávací mechanismus potřebuje využít na více místech aplikace v různých kontextech. Řízení takové aplikace totiž není nepodobné příkazu skoku GOTO. Nikdy není možné se vrátit jednoduše na původní pozici. To se ještě dále značně komplikuje v případě, že potřebujeme na jedné stránce mít třeba seznam firem s vyhledávacím tlačítkem obsažen vícekrát.

Nad bezestavovým protokolem HTTP s jeho modelem požadavek/odpověď je obtížné kontrolovat tok řízení. Webové aplikace z principu nemají lineární charakter. Prohlížeče umožňují uživateli duplikovat náhledy a pohybovat se nekontrolovatelně tam a zpět. Formuláře tak mohou být odesílány vícekrát a s neaktuálními daty.

Aby toho nebylo málo, jsou možnosti jak předávat informace o aktuálním stavu omezené. Na první pohled vypadá nejschůdněji varianta ponechávat stav klienta na serveru, ovšem zde rychle narazíme na to, že uživatel si může okno se stránkou snadno zduplikovat a s novými okny pracovat paralelně.

Proto se frameworky často snaží ukládat stavové informace do obsahu stránky (skryté formulářové vstupy) nebo do její adresy. Ovšem v případě, kdy životnost modelu, jehož stav do stránky kódujeme, trvá přes více stránek, měla by každá stránka kódovat stav všech předchozích stavů, jimiž model prošel. Při tom je třeba dávat dobrý pozor na nejednoznačnosti, což komplikuje tvorbu snadno znovupoužitelného kódu.

Při tom všem ještě musíme dávat pozor na to, aby uživatel nemohl díky nelineárnosti práce s naší aplikací provádět nekalé kousky jako přidávat další zboží do nákupního vozíku, když už jej zaplatil.

Všechny dnešní frameworky pro tvorbu webových aplikací se snaží tyto problémy více či méně úspěšně řešit. Například ASP.NET dokáže elegantně využívat kontinuací (view states) k rekonstrukci objektové struktury zobrazované stránky a oproti většině dalších frameworků se jí daří slušně zpracovávat násobný tok řízení v rámci jedné stránky pomocí controls. S řešením dalších obtíží, především pak GOTO sémantiky, to už ale tak slavné není.

Seaside je jedno z nejsofistiko­vanějších prostředí pro vývoj webových aplikací, na které můžete v současnosti narazit, a všechny výše uvedené problémy jsou v něm elegantně řešeny. Přínos pro vývojáře je jednoznačný. Rychlejší vývoj aplikací, jejich podstatně větší jednoduchost a přehlednost, oddělení logiky od prezentace a celkově vyšší úroveň abstrakce.

Seaside

Seaside je založena na komponentním modelu využívajícím kontinuace (pojem známý spíše z funkcionálního programování). To znamená, že každá komponenta stránky si žije vlastním životem nezávisle na ostatních, má vlastní tok řízení. To samozřejmě platí i v případě, že na jedné stránce je zároveň více komponent vzniklých jako instance téže třídy.

Kromě komponent umožňuje Seaside vytvářet i dekorátory, což jsou jakési odlehčené komponenty, které obalují ty skutečné a dodávají jim nové vlastnosti. Může se jednat o změnu vzhledu nebo doplnění chování původní komponenty. Lze tak snadno komponenty obohacovat například o obalující formulář s tlačítky, dodávat autorizační mechanismy apod.

Komponenty mohou být nahrazovány nebo si mohou vzájemně předávat řízení. Nahrazování komponent je jednoduché, prostě na místo, kde se nalézala jedna komponenta, vložíme jinou. Stav ostatních zůstane nedotčen.

Předávání řízení pak není nic menšího, než že zavoláte komponentu jako libovolnou jinou metodu, přičemž ta má možnost předat návratovou hodnotu. To znamená, že v příkladu s výběrem firem si vytvoříte jednoduchou komponentu obsluhující vyhledání firmy. Aplikace pak po stisknutí tlačítka „Hledej“ pouhopouhým zavoláním jediné zprávy může získat firmu vyhledanou uživatelem a přidat ji do seznamu. Princip a použití je tedy prakticky stejné jako u běžné desktopové aplikace.

Další milá vlastnost vychází z předchozí. Workflow komponenty nebo třeba celé aplikace lze definovat jako sekvenci příkazů, která může být provedena i v rámci jedné metody. Stačí postupně volat patřičné komponenty (např. vyhledání zboží, potvrzení obsahu košíku, zadání osobních údajů, výpis potvrzení) a podle postupně obdržených výsledků pracovat dále.

seaside

Příklad použití komponentního modelu:

  1. kořenová komponenta rozdělená na komponenty s obsahem stránky a hlavičkou
  2. komponenta pro zobrazení harmonogramu
  3. komponenta pro zobrazení informací o kongresu včetně stromu navázaných akcí
  4. komponenta pro zobrazení základních informací o kongresu (světle šedá). Tato komponenta je použita např. i na stránce s týdenními rozpisy
  5. hierarchický strom komponent s informacemi o akcích
  6. prostor pro umístění editační komponenty pro vybraný kongres/akci
  7. odkaz „Najít“, který zavolá dialog pro vyhledání firmy. Ten se zobrazí v prostoru komponenty 6. Stav ostatních komponent zůstane nedotčen. Po potvrzení výběru firmy je firma přidána do seznamu 8
  8. seznam firem realizovaný komponentami pro editaci údajů o firmě
  9. seznam osobních kontaktů v editované firmě realizovaný zarolovanými komponentami pro editaci údajů o osobách
  10. dekorátor pro zobrazení popisu modelu vnořené komponenty umožňující komponentu skrýt či dle potřeby editovat nebo smazat
  11. servisní ladící panel nástrojů Seaside

Uživatel má v prohlížečích možnost vracet se v historii zobrazovaných stránek zpět. To může často vést k nekonzistentnímu chování, obzvláště pokud se spoléháme na data uložená na straně serveru. Pro tyto případy umožňuje Seaside vybrané vlastnosti komponent backtrackingu přizpůsobit. Zároveň dává možnost požadované sekvence toku řízení jednoduše izolovat, tedy omezit backtracking tak, aby uživatel nemohl schválně či omylem pracovat s nevalidními daty.

Velmi šikovnou vlastností je možnost použití tzv. live actions pomocí XMLHttpRequestů. V praxi nachází uplatnění tam, kde potřebujete obnovit pouze část stránky za pomoci serveru. Tedy v případech, na které samotný Javascript nestačí nebo by jeho použití bylo příliš komplikované. Díky tomu lze jednoduše omezit znovunačítání stránky spojené často s nepříjemnou změnou pozice posuvných lišt. Zároveň se tím může výrazně omezit množství dat, která je nutné přenášet mezi serverem a klientem. Seaside pracuje nativně s XHTML a CSS2.

Pro důsledné automatizované otestování funkčnosti vašich komponent je k dispozici kvalitní programová základna. Vytváření automatizovaných testů pro jakékoliv aplikace s uživatelským rozhraním je vždy problém, takže každá podobná výpomoc je jen a jen vítána.

Veškeré zásahy do vzhledu, chování a konfigurace aplikace lze dělat v případě potřeby přes webové rozhraní, k čemuž jsou k dispozici základní nástroje. O plnohodnotné vývojové prostředí se samozřejmě nejedná, ale i tak můžete přes webové rozhraní např. analyzovat časovou náročnost vykreslování jednotlivých komponent, modifikovat jejich stávající kód bez nutnosti restartovat aplikaci, nechat si zobrazit aktuální stav objektů apod.

Celý framework je velmi kompaktní a jeho jádro tvoří pouze několik málo desítek tříd. Seaside je šířena pod liberální MIT licencí, takže při rozumné práci s ní i pro uzavřené komerční nasazení se do křížku s autorským právem určitě nedostanete.

Seaside má samozřejmě i pár vlastností, které nemusí vyhovovat pro každou aplikaci. Např. na rozdíl od ASP.NET se snaží maximum dat uchovat na straně serveru a jinou možnost nenabízí. Tvořit v ní jednoduché aplikace typu webové ankety je jako střílet vrabce kanónem (ač to nelze označit za neúčinný způsob). Ze své podstaty nachází nejlepší uplatnění v komplexních internetových a intranetových aplikacích opírajících se o robustní objektový návrh, kde je potřeba rychle reagovat na potřeby zákazníka.

Díky silně objektově orientované architektuře Seaside výrazně odděluje prezentaci, logiku a datový model. To se může velmi kladně odrazit na produktivitě vývoje aplikace, pokud je vytvářena týmem více osob, protože není problém rozčlenit implementaci na ucelené kompaktní logické celky a rozdělit práci mezi jednotlivé členy pracovních skupin.

Kvůli komponentnímu modelu Seaside implicitně nepoužívá systém šablon, jako je tomu například u PHP, takže skloubit grafický návrh s logikou není tak jednoduše přímočaré. Princip generování stránek koresponduje se snahou maximální možné separace formy a obsahu. Tedy i lepšího vymezení úloh programátora a grafika.

Pro některé aplikace může být nevýhodný fakt, že způsob adresace stránek není pro vyhledávače zrovna přátelský. Nicméně tento problém do jisté míry řešit lze.

UX DAy - tip 2

Seaside není žádná horká novinka a v praxi je již nějakou dobu úspěšně nasazována. Dočkala se zatím implementace ve čtyřech vývojových prostředích a dvou jazycích. Původně byla napsána ve Squeaku (Smalltalk) a portována do VisualWorks (Smalltalk) a Dolphin Smalltalku. Pod jménem Borges ji najdeme také portovanou do jazyka Ruby. Tyto jazyky do triumvirátu PHP/Java/C# přece jenom nepatří a Seaside se tak pohybuje mimo rozlišovací schopnost většiny vývojářů. Jejich škoda.

V následující sérii několika článků si popíšeme základy programování aplikací pomocí Seaside ve Squeak Smalltalku, kde má Seaside nejširší vývojářskou základnu a největší podporu autorů. Smalltalk nepochybně bude asi pro mnoho lidí překážkou, ale Seaside je sama o sobě dostatečně zajímavým důvodem pro studium toho programovacího jazyka.

Odkazy

Byl pro vás článek přínosný?