Interaktívne javascript GUI

Tiene minulosti

S kladením dôrazu na javascript sa otvárajú nové možnosti k návratu k naozaj interaktívnemu GUI, ktoré obdobie dôrazu na aplikácie s tzv. "web klientom" alebo dôrazom na "tenkosť" vo veľmi naivnom zmysle čisto server side renderu dosť podkopalo.
Ďalšie nie moc šťastné obdobie, ktoré nasledovalo, charakterizuje všakovako skloňované slovko Ajax. V praxi zväčša znamenalo kombinovanie server renderu s kowbojským klientským scriptovaním. Takto bolo možné posunúť webového klienta z hľadiska interaktivity oveľa ďalej, ale za akú cenu? Len ako paradox zabrdnem zase raz do model2 MVC fanúšikov, ktorí radi kládli dôraz na testovateľnosť, čo čisto serverovsky poňaté model2 prináša, ale kombinovanie client a server GUI logiky toto takmer úplne popieralo.(zostalo manuálne "preklikávanie" alebo automatizované GUI testy).

Výzvy

S otváraním dverí pre plné využívanie možností javascriptu sa otvárajú aj nové výzvy.(tie sú samozrejme spoločné pre všetky rich GUI platformy od js pokračujúc napr. ku silverlight, winforms alebo WPF).
A aké sú tie výzvy? Odmyslime si štandardnú požiadavku na vybavenosť frameworku kvalitnými a bohatými komponentami, hlavne ovládacími prvkami. V prípade avascriptu túto požiadavku v celkom slušnej forme (ak keď nie bez zásadných výhrad) pokrýva z môjho pohľadu napr. ExtJS. Za podstatnú výzvu považujem interaktivitu v záujme vyššej kvality práce používateľov a ich pozitívnych skúseností s GUI.

Čo je moderné GUI

Modernosť GUI by som podmienil práve dobrou odpoveďou na túto výzvu. Klasický prístup jedného zobrazeného formulára s aktuálnym taskom používateľa nestačí. Používateľ by mal mať k dispozícii v tom istom čase ďalšie pohľady, ktoré mu v efektívnej podobe umožnujú v rámci kontextu aktuálne riešeného hlavného task sledovať súvisiace informácie a tiež mu majú ponúknuť možnosť sledovať a reagovať na širšie dianie v rámci aplikačnej domény. Prvá požiadavka má obraz v medziwidgetovej komunikácii a druhá v možnosti widgetu reagovať na doménové udalosti. Tiež je dnes pomerne bežnou požiadavkou, aby si priamo používateľ (alebo to pre neho urobí dodávateľ) mohol svoju obrazovku prispôsobiť potrebám a špecifikám svojej pracovnej pozície.

Kompozitné GUI pri požiadavke vysokej interaktívnosti vyžadujú teda dobré riešenie medzikomponentovej komunikácie a modulárnosti. Toto si spájam neodlučiteľne s nízkou previazanosťou najmä preto, že iná cesta nutne vedie ku neudržiavateľnému a neflexibilnému špagety kódu, hlavne pri komplexnejších aplikáciách.(samozrejme profit z nízkej previazanosti komponentov je oveľa širší napr. v testovateľnosti, modulárnej rozširovateľnosti, flexibilite v nastavovaní oprávanení cez dynamicky definovateľné role atď.)

Objavujeme objavené

Asi neprekvapí, že snaha o riešenie tejto výzvy je obhjavovaním už objaveného. (Takto by som charakterizoval aj celé toto vývojárske obdobie :-) Hovorím napr. o zapojení messagingu/eventingu na úrovni GUI. Toto bolo v tej či onej podobe súčasťou pôvodného MVC patternu. Postupne nás však tvorcovia väčšiny GUI frameworkov od využívania messagingu a nízkej previazanosti vzďaľovali, čo bolo iste správne z pohľadu jednotlivých základných widgetov, ale nie z pohľadu celej aplikácie. Napr. v prípade model2 webovej aplikácie (a to bolo úplne pochopiteľné) sa messaging stratil úplne a vo winforms bol zabalený v ovládacích prvkoch a málokto ho využíval na vyššej úrovni a napr. MVVM tiež s medziwidgetovým messagingom nepočíta. Opačným javom bol dôraz na nízku previazanosť a testovateľnosť tam, kde nemala veľký prínos, ale znamenala veľký nárast pracnosti a komplexnosti kódu.
Udalosti resp. správy reprezentujúce udalosti však nie sú zaujímavé len z hľadiska medzikomponentovej komunikácie, ale aj z hľadiska napojenia aplikácie na doménový model. Používateľ bol často uväznený vo svojej inštancii GUI. Ak sa chcel dostať k dôležitým informáciám a udržiavať si prehľad o dianí mimo aktuálne riešenú úlohu, musel sa aktívne "preklikávať" cez aplikáciu, miesto toho, aby ho sprostredkovávala aplikácia ako "na dlani".

Multithreading a JS

Keďže sa chceme baviť o javascripte, len v krátkosti konštatujme, že okrem asynchrónneho vykonávania a spracovania(ako best practice) http requestov nám všetko (zatiaľ) pobeží v jednom vlákne. Toto je však postačujúci kompromis pre kvalitné a reponzívne GUI, ktoré samozrejme na seba neberie viac zodpovednosti, ako je nevyhnutné.

Microsoft a moderné GUI - Project Silk

Web Guidance team vyprodukoval v rámci interného vývoja niečo, čo v zámere ide presne tým istým smerom, kam som mieril v posledných mesiacoch ja. Milá náhoda, na ktorú ma včera upozornil kolega. Spomínaný projekt dostal názov Silk. Projekt využíva JQuery. V mnohom s konkrétnymi prístupmi pri designe aplikácie nesúhlasím ale pointa je dobrá.
Tiež je to ďalšia dobrá správa vo svetle pivo diskusií so Slavofom a Mirkubom, že v Microsofte sa na js frameworky v najakej miere myslí (keďže MS uspal Asp.Net Ajax a súčasné JQuery dobrodružstvo z pohľadu enterprise aplikácií neberiem vážne).
V prípade, že sa dočká framework pokračovania, autori sľubujú, že sa budú viac sústrediť na MVC prvky a uvažujú o zapojení knockout.js frameworku.

 

Netreba čakať čo a či niečo vymyslí MS

Návrhu GUI frameworku, ktorý by spĺňal už niekoľkokrát v článku zopakované kritéria som sa v poslednej dobe relatívne dosť intenzívne venoval. Uvediem schému jedného z možných prístupov. Upozorňujem, že určite nebude vyhovovať resp. zodpovedať špecifikám každej aplikácie. S architekúrou sa dá naozaj pohrať a treba ju vždy citlivo prispôsobiť. Určite prvým negatívnym pocitom väčšiny nezainteresovaných bude zložitosť návrhu. Áno, v istom zmysle je to zložité, ale pri projekte väčšieho rozsahu to môže pomocť eliminovať paradoxne iné formy neudržateľnej komplexnosti kódu, ktorá zabíja väčšie projekty a pomáhať pri dobrom zvládnutí jednotlivých častí designu produktivite, testovateľnosti, zníženiu chybovosti, rozširovateľnosti, udržovateľnosti atď. 

  

Main Presentation Model

Hlavný aplikačný presentation model, ktorý zodpovedá za klientskú aplikačnú infraštruktúru a jej stav, teda všetko, čo sa týka aplikácie ale nesúvisí s doménovou problematikou. Je zaujímavé najmä z pohľadu tých widgetov, ktoré riešia základné infraštruktúrne veci, navigáciu, kontainery iných špecializovaných widgetov, stavový riadok a pod. Tieto wigety môžu poslať PM command(zmena konfigurácie, aktivovanie iného widgetu), počúvajú na zmeny v presentation modely (napr. cez observer pattern, zmena aktuálne focusenutého tasku, zmena konfigurácie a pod.) a prípadne získavajú údaje (aktuálny používateľ, konfigurácia, zoznam dostupných aplikačných taskov/činností, navigačná hierarchia a pod.) Okrem toho PM rieši veci ako inicializácia aplikácie a pod.
Ak posiela command voči remote facade, tak len v prípade, že treba sperzistentňovat stav na servery a read sa deje za účelom načítania týchto perzistetných dát. Všetko ale mimo doménovú problematiku. Uvažovať o subscribenutí PM na model, ktorý by riešil tieto veci nemá zväčša význam.(hraničné prípady, keď treba napr. okamžite reagovať na lockenutie usera adminom, zmenu členstva v roliach a pod.)

Widget

Môže ísť o rôzne zamerané widgety. Jednak o tie, ktoré som už spomenul a súvisia so základnou aplikačnou infraštruktúrou a ktoré majú vzťah len ku hlavnému PM. Potom sú to viewy samotných aplikačné taskov(formuláre, aplikačné činnosti). Tu je zvačša praktické riešiť presentation model implicitne prípadne ako embedded(teda tak, že widget má asociovaný práve jeden PM). Tasky už zväčša riešia veci na úrovni domény a teda posielajú commandy, ktoré spôsobia nakoniec nejakú zmenu stavu v doménovom modely. Majú prístup ku aktuálnemu stavu doménového modelu a čo je veľmi podstatné z hľadiska interaktivity, dokážu počúvať a reagovať na doménové udalosti, ktoré publikuje doménový model po zmene stavu. (pribudol kredit na (mojom) účte - aktualizujem zobrazený aktuálny stav na účte, zákazník zrušil konkrétnu objednávku - zobrazím warning ak ju práve vybavujem a pod.). Zároveň takéto widgety dokážu prostredníctvom aplikačného message busu komunikovať s inými widgetmi. (V zozname spoločností jednu označím a špecializovaný mapový widget, ktorý na danú udalosť počúva okamžite vyznačí najkratšiu k miestu určenému adresou firmy a zazoomuje). Takýto widget je vlastne treťou najbežnejšou skupinou - teda nejaký špecializovaný gadget, z akých si môžem rozšíriť pracovnú plochu aplikácie a ponúkajú mi dodatočné informácie, buď k aktívne riešenému tasku alebo stručný prehľad o dôležitých veciach aj mimo kontext tasku.

Applikačný Message bus

Rieši medziwidgetovú komunikáciu popísanú vyššie a rovnako sprostredkováva widgetom doménové udalosti. Čo sa týka konkrétnej realizácie tejto druehej zodpovednosti, ide z pohľadu javascritu o výzvu. Okrem long pollingu nie je k dipozícii momentálne žiadne ľahko dostupné riešenie.(SignalR framework je možným riešením aj vo vzťahu ku web sockets) 
Druhým problémom je to, či riešiť subscription na klientovi, a to by znamenalo transfer všetkých doménových udalostí na každého klienta alebo na servery, čo chce zase riešenie subscribeovania sa na servery a riešenie delivery do konkrétnej inštancie klienta. Ani problém s bezpečnosťou nie je úplne triviálny.

Remote facade

Skladá sa z troch častí, ktoré netreba nutne fyzicky oddeliť. Prvá zodpovedá za posúvanie alebo v jednoduchšom prípade rovno vykonanie commandov, druhá za obsluhu query dotazov z klienta a tretia prípadne za sprostredkovanie doménových udalostí.

Doménový model

Rieši problematiku business domény. Dôležitá je tu schopnosť generovať doménové udalosti.(v zábere článku je dôležitá možnosť viewov reagovať na tieto udalosti, ale tu ich možné využitie a prínos zďaleka nekončí, dá sa cez ne riešiť budovanie samostatného query storage cez denormalizéry, interdoménová komunikácia a využitie pri integračných scenároch a pod. ale to je už zase iný príbeh)

DB

Dátové úložisko :-) SQL / NoSQL čo len chcete 

Já chci sempl!

V dohľadnej dobe nebude. Čo ale asi bude a je teraz kôly príjemným rodinným starostiam zatiaľ len spiacim prototypom, je RavenDB Web Management Studio. To ale postráda doménovú vrstvu a teda pokrýva tento design len čiastočne.

P.S. Kto si to fakt prečítal celé, ruku hore, má u mňa pivo :-)

Komentáre

# liero said:

kedze si tam niekde spominal aj WinForms a WPF, tak treba povedat, ze multithreading nieje obmedzenie javascriptu, ale browsera (vid html5 web workers).

Kedze na Win8 je javascript "IN", treba povedat, javascript je len jazyk a toto obmedzenie neplati. Tak ako v javacsripte uplne prirodzene vyuzivame DOM, ktore nam poskytuje browser, tak v METRO aplikaciach pouzivame WinRT (rovnako ako v C#), ktore je casto  asynchronne.

Niesom si isty, ci sa priamo v javascripte daju vytvarat thready (skor si myslim ze ano), niekto by ma mohol doplnit.

Thursday, November 24, 2011 2:25 PM
# liero said:

ale inak dobry blog :)

Thursday, November 24, 2011 2:31 PM
# T said:

@liero:

suhlasim s vyhradou - ak spominam javascript, tak v celom clanku vyhradne v kontexte browsera.

web workers - en.wikipedia.org/.../Web_Workers, nesupportuje zatial IE, vraj az v 10tke. Message z clanku je ale taky, ze zvacsa je takyto kompromis, kedy mas v podstate dlhotrvajuce operacie len requesty a tiez riesis asynchronne, uplne postacujuce.

Thursday, November 24, 2011 2:42 PM
# duracellko said:

No mam citanie na vikend.. Som zvedavy na ten Silk.

Thursday, November 24, 2011 9:49 PM
Prihlásiť | Registrovať | Pomoc