lunedì 31 dicembre 2007

ZK - Simply Ajax and Mobile

Chi lavora con me sa che già da qualche mese sto provando un framework per l'interfaccia utente chiamato ZK.
In mezzo a questa guerra "tutti contro tutti" tra i vari framework per l'interfaccia utente questo post potrebbe essere giudicato poco interessante.
In effetti tra i vari JavaFX, Google Web Toolkit, Flex2, JSF, un framework come ZK potrebbe sembrare qualcosa di decisamente minore e destinato a soccombere, ma dopo averlo provato un po' vi giuro che ha delle potenzialità enormi che gli altri che ho provato non hanno.
Cominciamo con il dire che è un tool per lo sviluppo di RIA (Rich Internet Applications) e non di interfacce Web classiche come Struts o Spring MVC. Dunque già ci poniamo un gradino avanti a numerosi concorrenti. Ma ne rimangono di decisamente agguerriti, come quelli che ho citato prima.

La cosa principale con cui mi sono scontrato provando gli altri tool per lo sviluppo di RIA è la comunicazione con il server! Di solito ci troviamo di fronte a strumenti che ci mettono a disposizione interfacce di comunicazione di medio livello come un client HTTP oppure meccanismi di comunicazione "trasparenti" per lo più non Object Oriented come la possibilità di invocare metodi statici o di oggetti singleton che si trovano sul server.
Ma per chi, come me, è convinto della bontà di avere un modello Object Oriented questo non è sufficiente. Ci si trova in balia di un modello che vive metà sul client e metà sul server e tenere sincronizzate le due metà è un vero incubo! Cerchiamo di chiarire questo fatto con un esempio.

Supponiamo di sviluppare un modello ad oggetti di un software bancario. Avremo a che fare con oggetti quali: Cliente, ContoCorrente, ecc. Per incapsulare bene l'apertura di un nuovo conto corrente potremmo mettere nella classe Cliente un metodo apriNuovoConto(), che si preoccuperà di effettuare tutte le operazioni necessarie (che potrebbero anche essere molte e molto complesse). Volendo lavorare correttamente con questo modello dovremmo:
  1. Ricostruire dal database l'oggetto Cliente per il quale si vuole aprire un nuovo conto. Supponiamo per semplicità dell'esempio che la persona sia già cliente della banca
  2. Mostrare questo oggetto sullo schermo
  3. Attendere che l'utente prema il pulsante "Apri Nuovo Conto" (o qualcosa di simile)
  4. Chiamare il metodo apriNuovoConto() dell'oggetto
Per fare ciò in un'applicazione RIA dovremmo trasferire l'oggetto Cliente sul client (scusate il gioco di parole). Ma per poter lavorare questo oggetto avrà una serie di altri oggetti come attributi, che a loro volta avranno i loro attributi e così via a formare una rete che potrebbe coinvolgere moltissimi oggetti. Trasferire tutti questi oggetti sul client è impossibile e il prinicpio dell'Information Hiding ci proibisce di sapere quali caricare e quali no.

Davanti a questa e altre difficoltà si tende a ricadere verso il "solito" modello procedurale in cui ci sono delle funzioni che manipolano dei finti oggetti che in realtà sono solamente dei record. E' facile far viaggiare questi record su e giù tra client e server ma ogni volta che abbiamo bisogno di qualcosa di leggermente diverso dobbiamo ricominciare da capo: un nuovo tipo di oggetto (stupido) e un nuovo insieme di funzioni per manipolare questi nuovi oggetti. Possibile che non ci sia qualcosa che ci permetta di ottenere un software un po' più manutenibile?

Qui entra in gioco ZK! Non sarà la panacea di tutti i mali ma di certo per certe categorie di applicazioni ci permette di lavorare in maniera completamente Object Oriented senza dover impazzire.
Il modello proposto da ZK è semplice: ogni volta che l'utente effettua un'operazione che genera un evento viene effettuata una chiamata al server, in risposta a questa chiamata il server esegue una porzione di codice (il gestore dell'evento) che può modificare le caratteristiche dell'interfaccia utente (aprire nuove finestre, modificare il contenuto dei campi, ecc.). Al termine il client riceve tutte queste modifiche e ridisegna di conseguenza l'interfaccia utente.

Nel nostro esempio della banca l'oggetto Cliente non deve essere trasferito sul client. Sarà direttamente il server a tenere questo oggetto ,a chiamarne i metodi e a visualizzarne le informazioni all'interno dei campi dell'interfaccia utente.

Ovviamente, come dice anche il manuale di ZK, non stiamo sfruttando affatto la potenza di calcolo del client ma quasi esclusivamente quella del server. Per questo ZK non è adatto ad applicazioni estremamente pesanti o con un carico di utenti molto elevato, ma per il tipo di applicazioni che ho sviluppato fino ad oggi (applicazioni aziendali con alcune centinaia di utenti), mi sembra più che adeguato.
In più esiste una versione di ZK per J2ME, sempre con la stessa filosofia. Una Midlet che gira sul cellulare si preoccupa di fare le veci del browser web.
Sto provando a scrivere un'applicazione demo utilizzando ZK. Nei prossimi post vi descriverò l'applicazione e la sua struttura per chiarire meglio i concetti che ho esposto oggi in maniera un po' troppo rapida.

A presto

venerdì 28 dicembre 2007

Benvenuti

Sta per iniziare un nuovo anno, e per me non sarà l'unica novità.
Dopo dieci anni di permanenza in Confor Informatica sto per iniziare una nuova avventura in un'altra azienda.
Così ho deciso di iniziare anche qualcos'altro. Un blog mi è sembrata una buona idea, e poichè sono ormai da anni "Javizzato", ho deciso di chiamarlo JavIdea.
Non vi sorprenderà, allora, che la maggior parte di quello che dirò qui riguarderà questo argomento, anche se spero di fare qualche digressione qua e là su altri temi.
Di blog su Java in giro per la rete ne trovate veramente tanti, e di gente molto più autorevole di me. Allora cosa fare per renderlo un po' originale? Innanzitutto lo scrivo in italiano invece che in inglese! Così le persone che conosco mi seguono meglio. E questo blog è dedicato principalmente a loro: tutti quelli a cui giorno per giorno rompo le scatole. Magari così riesco a ripagarli facendogli un poco di pubblicità. O magari questo blog non lo leggerà mai nessuno e sarà inutile. Però mi piace pensare che servirà a qualcuno oltre me.
Già, perchè ancora non l'ho detto ma voglio usare questo blog anche per me, per ricordarmi di quello che faccio e non lasciarlo esclusivamente alla mia memoria o su qualche riga di commento dentro una classe Java che chissà che fine farà. Già troppe idee le ho perse così, speriamo di cambiare rotta.
Ma adesso basta con le chiacchere. Il prossimo post sarà sicuramente tecnico! Sto provando un sacco di cose in questi giorni e ho voglia di scriverci sopra qualcosa.

A presto!