Strutture dati o selettive?

Ciao developer, 

in questo articolo voglio condividere con te la mia esperienza di sviluppo di applicazioni web basate su workflow.

Spesso, in questo tipo di applicazioni, si identificano una serie di attori che mediante delle azioni possono variare lo stato {s1, s2, s3, ..} di una risorsa. Sulla base dei requisiti funzionali, si va a definire un workflow applicativo che determina una sorta di automa a stati finiti, il quale ci servirà per implementare la logica dei pulsanti per le azioni.

Prendiamo, come esempio, un automa basato su di un applicativo che permette agli utenti connessi di scrivere e pubblicare o approvare degli articoli (es WordPress):

Come si può vedere, da un determinato stato è possibile transitare solo in alcuni stati. 

Questa immagine altro non è che un grafo finito, cioè una di quelle cose noiose che si studiano all’università 😀 

Dai requisiti si chiede di creare una form per la gestione degli articoli, con un po’ di fantasia:

A questo punto dobbiamo codificare le regole di transizione, in modo da far apparire i pulsanti giusti al variare dello stato del articolo.

Starai già pensando: “An beh ma è semplice, son quattro if  in croce”

Si, hai ragione, ma c’è modo e modo di fare le cose. 

A mio parere possiamo intraprendere due strade:

Premessa 

Il codice di esempio è stato scritto un  utilizzando AngularJS, lo scopo di questo articolo non è quello di capire qual è il linguaggio o framework migliore per codificare l’algoritmo.

Definiamo la lista degli stati possibili e l’oggetto che identifica l’articolo

1) Una serie di if-else-if con tutte le combinazioni

Pro: zero fatica, non ci ho neanche pensato ma solo codificato il grafo.

Contro: Spera che fra sei mesi il grafo non subisca variazioni, ovviamente non avrai a disposizione la doc di specifiche (sempre se c’era) e dovrai fare un reverse engineering del tuo codice. Auguri.

2) Mettere in pratica quelle cose noiose che abbiamo studiato all’università

Ci sono molti modi per rappresentare un grafo, una di queste è mediante la Matrice delle adiacenze. La matrice è costituita da una matrice binaria quadrata che ha come indici di righe e colonne i nomi dei vertici del grafo.

Sulla base del nostro grafo ma matrice risulta:

In forma più leggibile:

Con questa rappresentazione, capire se dallo stato 1 possiamo transitare allo stato 3 si risolve in una riga di codice:

Per esempio, se lo stato corrente del articolo è 1 (PENDING) saranno visualizzati solo il pulsante 2 (PUBLISH approve) perché m[1][2] = 1 e il pulsante 3 (REJECT) perché m[1][3] = 1

Pro: Codice pulito, non ti sei inventato nulla ma hai solo applicato dei costrutti, facili da comprendere da chiunque abbia studiato un minimo di algoritmi e strutture dati.Codice scalabile, quando dovrai fare delle modifiche non dovrai svenire.

Contro: Dieci minuti spesi su Wikipedia che ridurrà di gran lunga le tempistiche su eventuali modifiche future.

Chiaramente questo codice non è sufficiente per implementare tutta la logica applicativa che sta dietro al contesto di questo tipo di applicazioni, infatti il profilo dell’utente connesso non viene considerato.

Al seguente URL potete scaricare il codice di esempio:

https://Bonny@bitbucket.org/Bonny/matrixexample1.git

Leggi anche: Vintage code

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

3 + quattordici =