Enrico Briozzi: lavoro svolto dal 20/12/96 al 7/1/97

Analisi di progetto

Dalle specifiche non ho ricavato molti spunti: era chiaro quello che si doveva fare. Si trattava di calcolare il valore di una cella visitando il suo albero di valutazione costruito dal parser, individuare se le celle avessero dei riferimenti ciclici ed eventualmente marcarle come errate. Una seconda parte consisteva nel ricalcolare le celle che venivano modificate e tutte le celle che facevano riferimento a quest'ultime.

Le specifiche non suggerivano pero' il modo in cui operare. Ho percio' pensato ad ottenere buone prestazioni nel calcolo delle celle non considerando affatto l'occupazione di memoria (questo perche' Java e' gia' sufficentemente lento). Questa idea, che mi sembra tuttora la migliore, non l'ho affatto seguita inizialmente: il primo algoritmo per il calcolo delle celle occupava pochissima memoria (allocava solo una cella per volta) ma durante la fase di verifica e testing mi sono accorto che la procedura era di complessita' lineare nel caso migliore (senza contare la valutazione dell'albero) ma nel caso peggiore aveva complessita' n!.

Sono percio' ritornato alla fase di analisi per vedere di migiorare questa situazione che era inaccettabile. Della vecchia procedura ho potuto riutilizzare molto poco e percio' non ho potuto completare il ricalcola. La seconda versione dell'algoritmo procede in tempo linare sempre ma alloca molta memoria (nel caso peggiore tutte le celle che devono essere valutate) in quanto e' ricorsivo cioe' se non riesce a valutare una cella perche' dipende da un'altra si lancia il calcolo su quest'ultima.

L'algoritmo per la rilevazione di cicli e' invece molto buono perche' durante la fase di preanalisi abbiamo subito adottato una strategia (i colori) che mi ha permesso di rendere il codice efficente (tempo lineare per individuarlo e marcare le celle interessate).

Durante la fase di analisi sono stati sviluppati i seguenti documenti che sono serviti a concretizzare le idee esposte:

Diagramma delle classi

Modello funzionale per il calcolo

Modello funzionale per il ricalcolo

Gli algoritmi (Progettazione)

Gli algoritmi sono tutti molto semplici ed efficenti:

Algoritmo per il calcolo di una cella
Algoritmo per il ricalcolo