| Sviluppo |
|
|
|
1. Definizione delle funzioni di metrica e di actionOra che abbiamo un'idea della "logica" della nostra applicazione, andiamo ad implementare effettivamente le funzioni di metrica e di action. Le nostre funzioni di metrica e di action saranno "abbozzate", e sono i metodi definiti in test/DeliveryWeb.lib.php. Abbiamo anche creato un file ausiliario (lib/WebPager.php). Vedremo come esso ci aiuterà nella generazione di interfacce utente HTML da parte delle funzioni di azione. Facciamo notare che per ciascuno stato chiamato stato, abbiamo creto due metodi all'interno della classe DeliveryWeb: uno chiamato stato + Metric (che rappresenta la metrica associata allo stato stato) e l'altro stato + Page (che rappresenta la action function dello stato stato). La "regolarità" di questi nomi e` stata una nostra scelta, ovviamente i metodi avrebbero potuto avere nomi differenti. L'importante è che tali nomi siano coerenti con quelli specificati negli action pointer specificati nel file xml/DeliveryWeb.xml (gli elementi Action, per intenderci). Notiamo ancora una volta, inoltre, che mentre le funzioni di azione non ritornano alcun valore come risultato della loro valutazione, le funzioni di metrica ritornano una stringa. Se vediamo ad esempio la metrica dello stato OrderPerformed (e cioè orderPerformedMetric) notiamo (in xml/DeliveryWeb.xml) che l'elemento Enumeration ha impostato l'attributo a Type pari a 'string' e tale elemento ha per figli tre elementi Const, con attributo Value rispettivamente "CANCEL_TASK", "KO_CARR" e "PROCESSING". Questo significa che il codice di orderPerformedMetric potra` ritornare una stringa fra quelle specificate negli elementi Const, e difatti cosi` e` se andiamo a leggere il codice del metodo. Un altro aspetto importante, sono i parametri accettati in ingresso dalle funzioni di metrica e dalle funzioni di azione. Entrambi questi tipi di funzione riceveranno (primo parametro) un array associativo che rappresenta la porzione di ambiente "visto" dalla funzione stessa. Abbiamo chiamato questo parametro formale $state in tutte le funzioni, ma avrebbe potuto assumere qualsiasi altro nome. E` importante osservare che l'array $state e` passato per riferimento: oltre che essere un metodo efficente di passare dati ad un metodo, questo consente anche alla funzione di metrica o di azione di modificare l'ambiente in cui la funzione stessa si trova ad operare, come specificato dalla semantica del linguaggio. Ricordiamo che per specificare quali variabili saranno visibili all'interno della funzione di azione e all'interno della funzione di metrica occorre specificare il nome di tali variabili nel sottoelemento Input di ciascun elemento Action all'interno del file sorgente (nel nostro caso xml/DeliveryWeb.xml). Osserviamo, inoltre, che le funzioni di azione possono ricevere un secondo parametro (quello che abbiamo chiamato $debugInfo nelle funzioni del nostro esempio) le quali contengono informazioni sullo stato attuale dell'interprete. Esse sono, come spiega il loro stesso nome, delle informazioni utili in fase di debug dell'applicazione (simili allo StackTrace messo a disposizione da un linguaggio ad oggetti quando si tratta di debuggare eventuali eccezioni). In questo nostro esempio, ciascuno stato dell'automa è uno stato interattivo. Ciò significa che ciascuna funzione di azione si fa carico di mostrare l'interfaccia grafica tramite la quale interagire ed accettare input dall'utente. Per velocizzare, in minima parte, queste operazioni abbiamo pensato di raccogliere nella classe WebPager (in lib/WebPager.php) alcuni metodi che sono stati poi richiamati dalle funzioni di action. Non commentiamo tutti questi metodi (statici) ausiliari, bensì ci soffermiamo su alcuni che consideriamo più significativi. Il metodo ClosePage si occupa di ricevere le informazioni di debug eventualmente passategli, mostrandole nella parte I metodi Link e OpenForm realizzano concretamente il meccanismo di "salto" del nostro automa. Tale salto, infatti, in uno stato interattivo, si traduce in una nuova richiesta di tipo GET o POST, rispettivamente. Entrambi i metodi si occupano di passare alcune informazioni sulla sessione corrente:
I nomi delle variabili con cui questi valori vengono "passati" sono definiti per mezzo di opportune costanti in lib/WebInterpreter.php. Questo perche` tali nomi di variabili rappresentano di fatto un "protocollo" di comunicazione fra il programmatore e l'interprete del linguaggio. In particolare, l'informazione sul tempo della richiesta aiuta ad "ignorare" eventuali refresh della pagina, avvenuti senza effettivamente cliccare un link (salto via GET) o inviare una form (salto via POST). Di seguito vediamo un esempio di implementazione per le funzioni di metrica e di action per lo stato Start e la loro definizione all'interno dell'Action Pool.
2. Inizializzazione dell'interprete XALOra che abbiamo creato le funzioni di metrica e di action possiamo finalmente costruire la pagina in cui invochiamo l'interprete XAL per eseguire la nostra applicazione.
Alcune osservazioni sul codice:
|