A.Natali DL Maggio1999 La costruzione del software Meccanismi, principi, concetti e metodologie
A.Natali DL Maggio1999 Il problema di fondo u Cosa caratterizza il passaggio dalla costruzione di un algoritmo alla costruzione di un sistema software? u Quali elementi permettono ad un progettista-sviluppatore di ottenere in modo sistematico non solo un sistema che funzioni ma che sia anche fatto bene?
A.Natali DL Maggio1999 Fatto bene? u Ben organizzato u Modulare u Riconfigurabile u Flessibile u Estendibile u A componenti u … ???
A.Natali DL Maggio1999 La costruzione del software u Ingredienti computazionali –le mosse di un linguaggio di programmazione u Requisiti –non basta un sistema che funzioni u Principi –regole per una buona organizzazione u Modelli, Concetti, Paradigmi, Pattern –fonti di ispirazione
A.Natali DL Maggio1999 Lo sviluppo storico u : –cosa significa computare? –quali mosse primitive deve avere un linguaggio di programmazione? Secondo quale modello? u : –quali principi di organizzazione del software? – perche la programmazione strutturata non basta?
A.Natali DL Maggio1999 Lo sviluppo storico u : –perche il modello ad oggetti e importante? –vi sono alternative alla classificazione? u : –quali ripercussioni se la piattaforma computazionale diventa una rete? –come recuperare vecchie applicazioni sulle nuove piattaforme? u...
A.Natali DL Maggio1999 Modelli computazionali u Imperativo u Funzionale u Dichiarativo u A oggetti (?)
A.Natali DL Maggio1999 Gli ingredienti comuni1 u Valori u Costanti (Riferimenti) u Tipi di dato (scalari e strutturati) u Variabili (Puntatori) u Binding e visibilita (scope)
A.Natali DL Maggio1999 Gli ingredienti comuni2 u Strutture di controllo u Comandi e procedure u Funzioni u Moduli u Classi
A.Natali DL Maggio1999 Elementi fondamentali espressioni primitive meccanismi di combinazione meccanismi di astrazione
A.Natali DL Maggio1999 Cosa cambia? u Il modello del collante, cioe i meccanismi di combinazione ed astrazione u Modello funzionale: –elemento fondamentale: la funzione e lespressione –meccanismo fondamentale: la chiamata u Modello logico: –elemento fondamentale: lassioma –meccanismo fondamentale: la deduzione logica
A.Natali DL Maggio1999 Modello imperativo –elemento fondamentale: il comando –meccanismi fondamentali:
A.Natali DL Maggio1999 Conteggio parole ( da un testo famoso) #include void main(){ char c; int nw = 0; int inw = 0; FILE* fp; fp = fopen("testo.txt","rt");
A.Natali DL Maggio1999 Conteggio parole if( fp == 0 ) exit(1); } while( (c=getc(fp) ) != EOF ) { if( c==' ' || c=='\n' || c=='\t' ) inw = 0; else if( inw == 0 ){ inw = 1; ++nw; } fclose( fp ); printf("il file contiene %d parole\n", nw ); }//main
A.Natali DL Maggio1999 Requisiti del software u : Correttezza, Efficienza, Generalita u : Strutturazione, Modularita, Incapsulamento (ADT), u : Riusabilita, Estendibilita, Genericita, Incrementalita u : Distribuzione, Mobilita u …:Interoperabilita,...
A.Natali DL Maggio1999 Linguaggi di programmazione JAVA
A.Natali DL Maggio1999 Famiglie di linguaggi u Imperativi u Applicativi u Dichiarativi u Ad oggetti Ogni famiglia promuove uno specifico stile di progettazione e sviluppo del software
A.Natali DL Maggio1999 Efficienza : qualche slogan u Premature optimization is the root of all evil –Donald E. Knuth u Make it work first before you make it work fast –Bruce Whiteside u Make it fail-safe before you make it faster u Make it clear before you make it faster –Kernighan A. Plaugher
A.Natali DL Maggio1999 Principio generale 1 u If you need a little speedup, work at the best level (which delivers the most speedup for the less effort) –problem definition –system structure –algorithm tuning –data structure reorganization –code tuning –system software and hardware
A.Natali DL Maggio1999 Principio generale 2 u If you need a big speedup, work at many levels –quando le modifiche ad un livello sono indipendenti dai cambiamenti negli altri livelli, i miglioramenti di velocita si moltiplicano
A.Natali DL Maggio1999 Punti critici u The fastest IO is no IO –Nils Peter Nielson u In non IO bound programs a few percent of thje service code typically accounts for over half of the run time –Donald E. Knuth
A.Natali DL Maggio1999 Principi di ottimizzazione u Mantenere il progetto e l implementazione quanto piu possibile semplice u Salvare lo stato per evitare ricomputazioni u Pre-calcolare e memorizzare soluzioni a problemi che appaiono di frequente u Applicare algoritmi divide-et-impera u Sfruttare le identita algebriche u Eliminare la ricorsione (non tail)
A.Natali DL Maggio1999 Ottimizzazione sui loop u Combinare in test u Usare sentinelle u Combinare loop sullo stesso range u Rimuovere dal corpo espressioni invarianti
A.Natali DL Maggio1999 Esempio u Determinazione del massimo della somma dei valori su ogni possibile sotto vettore contiguo di un vettore dato che contiene almeno un valore positivo. int v[]={ 31, -41, 59, 26, -55, 58, 99, -93, -23, 84 }; somma parziale= 187 per v[2]..v[6]
A.Natali DL Maggio1999 Andamento
A.Natali DL Maggio1999 La funzioni come componenti software Fondamentali, ma non sufficienti
A.Natali DL Maggio1999 Funzioni u Le funzioni sono costrutti che permettono di attribuire un nome ad una espressione e renderla parametrica. float f(){ * sin(0.75); } float f1( int x) { 2 + x * sin(0.75); }
A.Natali DL Maggio1999 Funzioni: trasparenza referenziale u f(x) + g( f(x), q( x + f(y))) f,g,q sono simboli che denotano funzioni; il simbolo x denota un valore; qualunque sia il valore denotato da x, x denota sempre lo stesso valore in ogni punto in cui compare nellespressione; lespressione f(x) denota sempre lo stesso valore in ogni punto in cui compare nellespressione.
A.Natali DL Maggio1999 Funzioni: signature u L interfaccia di una funzione e costituita dal suo nome, dalla lista degli argomenti e dal tipo del valore restituito ( signature ). tipo nome ( args )
A.Natali DL Maggio1999 Funzioni: Corpo u Il corpo costituisce la struttura interna di una funzione, completamente inaccessibile dallesterno –garantendo protezione dellinformazione secondo il principio del suo nascondimento ( information hiding )
A.Natali DL Maggio1999 Funzioni: Comunicazione u La comunicazione di informazione tra un cliente e una funzione avviene –da cliente a funzione : con gli argomenti di ingresso –da funzione a cliente : con il valore di ritorno tipo nome ( args )
A.Natali DL Maggio1999 Il modello cliente-servitore Cliente Servitore Ambiente condiviso informazione controllo
A.Natali DL Maggio1999 Clienti e servitori u Servitore –un qualunque ente computazionale capace di nascondere la propria organizzazione interna, presentando ai clienti una precisa interfaccia per lo scambio di informazione. u Cliente –qualunque ente in grado di invocare uno o piu' servitori per svolgere il proprio compito.
A.Natali DL Maggio1999 Comunicazione u La comunicazione di informazione tra un cliente e un servitore puo' avvenire in modo esplicito tramite le interfacce stabilite dal servitore oppure in modo implicito tramite aree-dati accessibili ad entrambi.
A.Natali DL Maggio1999 Servitore u Puo essere passivo o attivo u puo' servire un cliente alla volta, in sequenza, oppure piu' clienti per volta, in parallelo. u servire molti clienti oppure costituire la risorsa privata di uno specifico cliente. u puo a sua volta trasformarsi in cliente, invocando altri servitori o anche se' stesso. Servitore
A.Natali DL Maggio1999 Funzione come servitore u Passivo u Rientrante u Privato o condiviso u Di se stesso quando ricorsiva
A.Natali DL Maggio1999 Meccanismi per il trasferimento di argomenti u per valore u per indirizzo u per riferimento u per valore-risultato u per nome u...
A.Natali DL Maggio1999 Funzioni? void sqr( int* v){ *v = *v * *v; }//sqr int x=3;int const y=5; sqr( &x );sqr( &y ); Warning: passing arg 1 of `sqr' discards `const' from pointer target
A.Natali DL Maggio1999 Funzioni? void sqr( int& v){ //C++ v = v * v; //dereferenziamento automatico }//sqr int x=3;int const y=5; sqr( x );sqr( y );
A.Natali DL Maggio1999 Valori, costanti e variabili #define x 3 int const x=3; int x = 3; u x sinonimo di 3 non ha lvalue u x variabile che non modifica il suo valore u puo avere un lvalue u x variabile (contenitore)
A.Natali DL Maggio1999 Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno del programma o quello del mondo circostante. –Le strutture di controllo ( if,-then-else, while-do, for, repeat-unitl, switch, etc.) permettono di aggregare comandi semplici in macrocomandi
A.Natali DL Maggio1999 Procedure (vs. funzioni) u costrutti che permettono di attribuire un nome ad un macrocomando e renderlo parametrico if( x % 2 == 0 ) printf(x= %d pari \n ); else printf(x= %d dispari \n ); void viewEvenOdd( int x ){ if(x % 2 == 0) printf(x= %d pari \n,x ); else printf(x= %d dispari \n,x ); }
A.Natali DL Maggio1999 ContaParoleNew: una funzione int contaParole( FILE* fp ){ char c; int nw = 0; int inw = 0; if( fp == 0 ) { return -1; } while( (c=getc(fp) ) != EOF ) { if( c==' ' || c=='\n' || c=='\t' ) inw = 0; else if( inw == 0 ){ inw = 1; ++nw; } } return nw; }//contaParole
A.Natali DL Maggio1999 ContaParoleNew: il main void main(){ FILE* fp; int nw=10; char fName[80]; int a=10; printf("nome del file: "); gets( fName ); fp = fopen(fName,"rt"); nw = contaParole( fp ); fclose( fp ); if( nw >= 0 ) printf(" il file contiene %d parole\n ", nw ); else printf(" errore nell'accesso al file \n " ); }//main
A.Natali DL Maggio1999 Lo stile funzionale La funzione contaParole realizza un algoritmo contaParole u Utilizza variabili locali non visibili allesterno u Stabilisce un contratto con i clienti u Non deve avere effetti collaterali (nemmeno sul file di ingresso)
A.Natali DL Maggio1999 Riusabilita La funzione contaParole delega al chiamante il compito di aprire-chiudere il file contaParole u Protocollo duso: fp = fopen(fName,"rt"); nw = contaParole ( fp );contaParole fclose( fp ); u Impedisce la composizione in espressioni: contaParole(fp)+contaParole(fp);
A.Natali DL Maggio1999 Una funzione piu riusabile int contaParole( char* fName ){ char c; int nw = 0; int inw = 0; FILE* fp; fp = fopen( fName ); if( fp == 0 ) return -1; while( (c=getc(fp) ) != EOF ) { if( c==' ' || c=='\n' || c=='\t' ) inw = 0; else if( inw == 0 ){ inw = 1; ++nw; } } fclose( fp ); return nw; }//contaParole
A.Natali DL Maggio1999 Trasparenza referenziale e riuso void main(){ FILE* fp; int nw=10; char s[80]; int a=10; printf("nome del file: "); gets( fName ); nw = contaParole( s ); if( nw >= 0 ) printf( vi sono %d parole == %d ", nw, contaParole( s ) ); else printf(" errore nell'accesso al file \n " ); }//main
A.Natali DL Maggio1999 La funzione come servitore La funzione contaParole e un servitore passivo, contaParole u che serve un cliente per volta, u che puo trasformarsi in cliente, (anche di se stessa).
A.Natali DL Maggio1999 Ricorsione e iterazione int inw = 0; int numParole( char* fName ){ FILE* fp; int nw = 0; inw = 0; fp = fopen( fName, "rt" ); nw = numParoleRic( fp, 0 ); fclose( fp ); return nw; }//numParole Questa funzione 1) inizializza la variabile di stato inw. 2) apre il file 3) invoca un algoritmo di conteggio 4) chiude il file
A.Natali DL Maggio1999 Versione ricorsiva int numParoleRic( FILE* fp, int nw ){ char c; if( fp == 0 ) return -1; if( (c=getc(fp) ) == EOF ) return nw; if( c==' ' || c=='\n' || c=='\t' ) inw = 0; else if( inw == 0 ){ inw = 1; ++nw; } return numParoleRic(fp,nw); }//numParoleRic Questa funzione percorre in modo ricorsivo il file usando il parametro nw come accumulatore del risultato
A.Natali DL Maggio1999 Non basta che funzioni u Lintroduzione della variabile globale inw viola i principi di localita e di information hiding Sostituirla con una variabile static entro numParole non e possibile perche inw deve essere visibile anche da numParoleRic u Concettualmente, inw e una variabile di stato, analoga a nw.
A.Natali DL Maggio1999 Argomenti come stato int numeroParole( char* fName ){ int nw; FILE* fp; fp = fopen( fName, "rt" ); nw = contaNumeroParole(fp, 0, 0); fclose( fp ); return nw; }//numeroParole
A.Natali DL Maggio1999 La versione ricorsiva appropriata int contaNumeroParole( FILE* fp, int nw, int inw ){ char c; if( fp == 0 ) return -1; if( (c=getc(fp) )==EOF) return nw; if(c==' ' || c=='\n' || c=='\t') return contaNumeroParole(fp,nw,0); if( inw == 0 ) return contaNumeroParole(fp,++nw,1); else return contaNumeroParole(fp,nw,inw); }//contaNumeroParole
A.Natali DL Maggio1999 Dal codice al progetto Reverse engineering
A.Natali DL Maggio1999 Il ragionamento u nw – numero corrente di parole contate u inw –se 1 denota lo stato entro una parola –se 0 denota lo stato fuori da una parola u Se il file non esiste, restituisci -1; u Se EOF, restituisci il valore corrente di nw;
A.Natali DL Maggio1999 Il ragionamento u Se il primo carattere sul file e un separatore di parole, allora il risultato e dato dalla iterazione del procedimento sul resto del file con inw=0 e nw inalterato; u Se il primo carattere sul file appartiene ad una parola, allora il risultato e fornito: –se inw==0, dalla iterazione del procedimento sul resto del file con inw=1 e nw incrementato di 1; –se inw==1, dalla iterazione del procedimento sul resto del file con inw=1 e nw inalterato;
A.Natali DL Maggio1999 Una rilflessione u Dati –conviene siano impostati come oggetti appartenenti a precisi tipi (astratti) u Elaborazione –conviene sia chiaro quale modello o pattern realizzano
A.Natali DL Maggio1999 Il conteggio delle parole u Dati del dominio –Contatore –File (e gia un ADT realizzato dal sistema) –Parola (non formalmente espressa) u Elaborazione –Realizza un automa a stati finiti
A.Natali DL Maggio1999 END ASF del conteggio parole START SKIP Separatore EOF FIRST Carattere parola INW Separatore Carattere parola Separatore EOF Nello stato FIRST si incrementa di 1 il contatore di parole (nw) EOF
A.Natali DL Maggio1999 Analisi del codice int contaParole( char* fName ){ //VARIABILI DI COMODO char c; FILE* fp; //VARIABILI DI USCITA int nw = 0; //contatore //VARIABILI DI STATO int inw = 0;
A.Natali DL Maggio1999 Analisi del codice //ACQUISIZIONE DEGLI INGRESSI while( (c=getc(fp) ) != EOF ) { //TRANSIZIONI DI STATO (ASF DI MOORE) if( c==' ' || c=='\n' || c=='\t' ) inw = 0; else if( inw == 0 ) { inw = 1; ++nw; } }
A.Natali DL Maggio1999 Realizzazione sistematica di un ASF 1. La transizione di stato e espressa (implicitamente) dal flusso di controllo 2. Lo stato e rappresentato in modo esplicito da variabili e la transizione di stato e espressa mediante if o switch 3. Ogni nodo del grafo e rappresentato da una procedura (funzione). La transizione di stato e espressa mediante invocazione di funzione 4. LASF e rappresentato da una matrice di transizione
A.Natali DL Maggio1999 Versioni dellASF di conteggio-parole 1. Transizioni di stato realizzate dal flusso di controllo int contaParoleASFControllo( char* fName ){contaParoleASFControllo 2. Variabili esplicite di stato e transizioni con switch int contaParoleASFSwitch( char* fName ){contaParoleASFSwitch 3. Stati mappati in procedure int contaParoleASFStatiFunzione( char* fName ){contaParoleASFStatiFunzione 3. Matrice di transizione int contaParoleASFMatrice( char* fName ){contaParoleASFMatrice
A.Natali DL Maggio1999 Valutazione della soluzione u Il problema del conteggio delle parole contenute in un file e stato risolto senza introdurre alcun oggetto di tipo parola, ma solo il concetto di separatore di parole. u La soluzione e –semplice ed efficiente –non molto comprensibile, non modulare, poco riusabile e difficilmente estendibile
A.Natali DL Maggio1999 Quali alternative? u E possibile impostare il problema in modo diverso, in modo da ottenere una soluzione ancora ragionevolmente efficiente, ma piu modulare, riusabile ed estendibile?