Monday, October 24, 2005

 

UML and Web Applications

Yesterday I gave an answer to a question posted in a UML forum. I guess it could be useful to others as well, so I'm briefly posting it here, just before leaving. The question was about UML modeling and web applications, often built with a number of heterogeneous technologies (HTML and some scripting on the client side, then maybe a PHP front end, some stored procedure on the database layer, etc).
If you want to model the static structure of the website, you can use the class and component diagram, with custom stereotypes. Jim Conallen has published a few articles on that starting in 1999.
However, what I've found most useful is to show the activities carried out in each layer, the sequence of calls, the synchronization requirements if some can go in parallel or are asynchronous (like credit card validation, etc). In this case, you can adopt the activity diagram, so often forgotten but still one of the most useful UML diagrams.
Swimlanes can be used to represent tiers or, if you have a complex architecture, components within each tier. You can then easily show a browser calling into the PHP frontend, which can extract parameters and call a stored procedure, and so on. See this example to get some hints.
Activity diagrams are much more powerful than that: you can use object flow to show how some artifact is passed around between activities, how its internal state would evolve, and so on. Moreover, with UML facilities, you can easily model "reusable" activities that can be plugged into several different workflows.

Comments:
Da te, che sei diventato anche un esperto di .NET mi sarei spettato la sostituzione di PHP con ASP.NET :-)) O devo ritenere che ASP.NET non ti piace poi troppo...
 
Debugging activity

Ieri pomeriggio mi hanno segnalato un bug nell'applicativo in beta test.

Ho chiesto copia della cartella per simulare il problema, ma su piattaforma Windows XP non riuscivo a riprodurlo.

Apreso però che si manifestava in ambiente Windows 2000 ho provato a farlo girare su Windows 2000 server (non avevo un 2000 professional a disposizione).

Constatato che effettivamente il bug c'era, mi sono armato di pazienza e ne sono andato a caccia.

L'impulso primario è stato quello di dare la colpa a Windows, ma data la giovane età del prodotto mi sono rimboccato le maniche addossandomi le colpe.

Ho già detto che non uso il debugger integrato e quindi mi sono arrangiato come potevo. Del resto sul 2000 server non avevo visual studio e quindi non potevo trarne vantaggio senza procedere ad una installazione (senza contare che il progetto è solo in modalità RELEASE e mi scocciava aggiungere la modalità DEBUG).

Dopo aver commentato l'incommentabile ed aver ridotto il tutto a pura gestione dell'interfaccia mi sono convinto che la colpa potesse proprio essere di Windows. Descrivo brevemente l'interfaccia dell'applicativo (Puro C + WIN32 API).

Dialog non modale di gestione archivio (non importa di cosa). Nella dialog esistono tre check-box per la selezione di tre schede child differenti (più o meno come fareste con un tab-control.

Orbene, passando in sequenza da un check all'altro, quando si arrivava all'ultimo e poi si tentava di tornare indietro il programma s'inchiodava e non restava che terminarlo con Task manager. A chi mi ha segnalato il bug capitava anche di peggio e non restava altro che premere il pulsante di alimentazione del PC (Forse un piccolo beneficio della versione server da me usata).

Nei vari tentativi ho scoperto che se cambiavo l'ultima scheda riduplicando la seconda il problema spariva. Ho pensato che il problema fosse dovuto ai controlli in essa presenti.

Per farla breve pare proprio che il problema fosse dovuto ad un edit control con tanto di spin-control (up-down) in "auto buddy". E' bastato cambiare il tab order dei controlli già presenti per far venire come primo elemento una combo-box invece del summenzionato edit che il problema è magicamente sparito.

Perché mi sono preso il disturbo di raccontare tutto questo?

Primo per ribadire che non sempre è colpa nostra (bisogna però essere sempre umili e preparati perché a volte il problema ha origini più lontane e si manifesta quando e/o dove meno ce lo aspettiamo).

Secondo per chiedere info a te Carlo su come potrei sottoporre la cosa a M$ o trovare nel mare magnum di internet se altri si sono già scontrati con questo "behaviour" (Maybe this is a feature, not a bug! ;-).
 
Debuggin activity - le prove del bug

Per riprodurre il problema citato nel commento precedente ho realizzato un apposito mini-progetto con VS .NET 2003.

E' possibile scaricarlo anche da qui.

Sembrava che questa cosa succedesse solo sotto Windows 2000 invece, contrariamente all'applicazione in beta test, con questo programmino capita anche sotto Windows XP e quindi ho potuto approfittarne per inviare una segnalazione errori dopo averlo terminato con Task manager.

Esaminate pure il codice e fatemi sapere se per caso m'é sfuggito qualcosa ed il programma s'inchioda per colpa mia e non del sistema operativo (si sa mai).
 
Per romano:
anche sul 2000 professional si blocca
 
Grazie Fulvio per il test.

Ho verificato che l'inchiodamento avviene anche su piattaforma WIN98.

Questo mi fa pensare...
 
Non che c'entri nulla con il post originale :-))), comunque ho dato una [rapida] occhiata al codice mentre ero in viaggio.
L'unica cosa evidentemente non corretta che vedo e' che usi i dialog box non modali senza chiamare IsDialogMessage all'interno del message loop.
In un caso come il tuo la cosa e' anche complicata perche' hai dialog non modali multipli e innestati.
Di solito questo richiede di intercettare WM_ACTIVATE e impostare un bel globalone :-).
Cosa che nel tuo caso non funziona perche', guarda guarda, i vari tab dialog non ricevono WM_ACTIVATE (che e' strano).
Peraltro se non nascondi le finestre/tab il problema non emerge, anche se ovviamente hai altri malfunzionamenti.
Usando il debugger (sorry :-) si vede anche che quando il programma e' bloccato, sullo stack ci sono principalmente una serie di chiamate a USER32, che partono appunto dalla message pump.
Con un po' piu' di tempo / voglia / motivazione :-), sarebbe da provare su una versione di debug di Windows, con i simboli caricati, e vedere se con i nomi di funzione di USER32 si capisce / intuisce qualcosa di piu'.
Il mio dubbio segreto :-) e' che ci sia qualcosa che non va negli attributi delle finestre/tab, che in prima istanza non fa arrivare i WM_ACTIVATE (e magari anche altri), il che in seconda istanza crea qualche problema allo spin [non che ci sia un buon motivo :-)]. Ma in effetti a occhio non ho visto nulla di palesemente errato.
Collaterlmente, sarebbe interessante provare senza finestra principale, ma con un dialog modale che mette al suo interno le tab non modali. Sarebbe anche carino eliminare tutto cio' che non serve dal codice, a partire da quegli spostamenti di finestra che servono solo perche' i radio button sono in alto e non in basso; sicuramente vi sono anche molti control "inutili" (ai fini del bug) nelle diverse tab. Ovvero, renderlo davvero minimale. Soprattutto se ci si vuole mettere li' con lo Spy e vedere cosa succede a livello di messaggi.
Poi ovviamente, in casi come questo si fa prima a bypassare il problema che a investigarlo sino all'ultima vite :-).
 
Innanzitutto grazie per l'interessamento. E meno male che hai solo dato una [rapida] occhiata...

Per l'IsDialogMessage hai perfettamente ragione. Nel codice originale comunque c'é e qui non mi sembrava rilevante. Come pure non mi sembra rilevante testare che la dialog sia già stata creata. Infatti nulla vieta di richiamare due volte la voce di menu generando qualche "pasticcio".

Mi son fatto l'idea che con questo codice sono incappato in una situazione imprevista per Windows 9x/NT (intesi come piattaforma).

Spesso i bug sono anche questo: mancata gestione di situazioni impreviste...

Per il resto sono proprio nella situazione in cui preferisco bypassare che smontare Windows fino all'ultima vite, anche se indubbiamente la cosa risulterebbe molto formativa. Passati i quaranta si perde un poco lo spirito d'avventura dei vent'anni... :-((
... anche se non è così per tutti.

Ho trovato anche un altro bachettino con il controllo datetime picker (Più che altro a livello di resource editor). Se inserisco in una dialog un tale controllo e poi imposto gli attributi per avere il formato time (hh:mm:ss) quando riapro la dialog me lo ripropone come data. Per evitare, entrando in modifica di tale dialog, di re-impostare ogni volta gli attributi come da me desiderato convivo con questo behaviour settando da codice in WM_INITDIALOG lo stile DTS_TIMEFORMAT.
 
Post a Comment

<< Home

This page is powered by Blogger. Isn't yours?