Upload
others
View
6
Download
1
Embed Size (px)
Citation preview
Corso di Ingegneria del Software
Paolo Bottoni
Principi dell’Ingegneria del Software
Lucidi tradotti e adattati a partire dalla versione in inglese presente a http://www.prenhall.com/ghezzi/
Principi Ingegneria del Software 2
Obiettivi
• Mostrare principi base per metodi, tecniche,
metodologie e strumenti
• Illustrare sette principi usabili in ogni fase
sviluppo software
• Evidenziare modularità come principio
fondamentale per progetto software
Principi Ingegneria del Software 3
Applicazione
• Principi applicati a processo e prodotto
• Messi in pratica via metodi e tecniche
– organizzati in metodologie
– supportate da strumenti (tool)
Principles
Methodologies
Principles
Methods and techniques
Methodologies
Tools
Principi Ingegneria del Software 4
Principi Chiave
• Rigore e formalità
• Separation of concerns
• Modularità
• Astrazione
• Anticipazione del cambiamento
• Generalità
• Incrementalità
Principi Ingegneria del Software 5
Rigore e formalità
• Software engineering attività creativa
MA
• Deve essere esercitata sistematicamente
• Rigore è complemento a creatività
– aumenta fiducia in passi sviluppati
• Formalità è rigore al grado più alto
– processo guidato e valutato con leggi matematiche
Principi Ingegneria del Software 6
Esempi: prodotto
• Analisi matematica (formale) correttezza programmi
• Derivazione sistematica (rigorosa) dati di test
Principi Ingegneria del Software 7
Esempi: processo
• Documentazione rigorosa passi di sviluppo per
– gestione progetto
– valutazione tempestività (timeliness)
Principi Ingegneria del Software 8
Studio di caso: compilatore
• Costruzione di compilatori è area con metodi di
progetto sistematico (formali)
– es. BNF per descrizione formale sintassi linguaggio
<type declaration> ::= <class declaration> | <interface declaration> | ;
<class declaration> ::= <class modifiers>? class <identifier> <super>?
<interfaces>? <class body>
<class body> ::= { <class body declarations>? }
Studio di caso: Angry Birds
• Definizione matematica leggi fisiche in Box2D
Principi Ingegneria del Software 9
Principi Ingegneria del Software 10
Separation of concerns
• Metodo per controllare complessità
• Separare tematiche
• Concentrarsi su una tematica per volta
• Divide et impera
• Favorisce:
• parallelizazione sforzi
• separazione responsabilità
Principi Ingegneria del Software 11
Esempi
• Processo
• Procedere una fase per volta (modello a cascata)
– Separa attività nel tempo
– Stabilire incremento (modelli incrementali o agili)
– Indica su quali problemi concentrarsi
• Prodotto
• Mantenere requisiti prodotto separati:
– Funzionalità
– Prestazioni
– Interfaccia utente e usabilità
Principi Ingegneria del Software 12
Separation of concerns per compilatore
• Progettazione algoritmi allocazione ottimale registri
vs
• Progettazione messaggi diagnostici
• runtime efficiency separata da user friendliness
Separation of concerns per Angry Birds
• Separazione fra
– Rappresentazione grafica
– Gestione interazione
– Calcolo effetti
– Gestione profili
• Separazione in Box2D
– Definizione forme
– Definizione collisioni
Principi Ingegneria del Software 13
Principi Ingegneria del Software 14
Modularità
• Sistema complesso diviso in parti più semplici – moduli: sistema modulare
• Favorisce separation of concerns
– trattando modulo, possiamo ignorare dettagli altri moduli
Principi Ingegneria del Software 15
Modularità per compilatore
• Processo decomposto in fasi
– Analisi lessicale
– Analisi sintattica (parsing)
– Generazione codice
• Fasi associate con moduli
Principi Ingegneria del Software 16
Struttura modulare per compilatore
Albero
di
analisi
Codice
sorgente
Tabella dei
simboli
Codice
oggetto
Codice
“tokenizzato”
Analisi
sintattica
Generazione
del codice
Diagnostica
lessicale
Diagnostica sintattica
Analisi
lessicale
“scatole” = moduli “frecce” = interfacce
Principi Ingegneria del Software 17
Iterazione del processo di
decomposizione in moduli
Generazione
codice intermedio Albero di
analisi
Codice
oggetto
Generazione
del codice Codice
intermedio
Tabella dei simboli
Generazione
codice macchina
Modularizzazione generazione codice
Modularità per Angry Birds
Moduli:
gestori eventi
gestori utenti
gestori animazioni
gestori partite e gestori livelli
Principi Ingegneria del Software 18
Principi Ingegneria del Software 19
Coesione e accoppiamento
• Ogni modulo altamente coeso
– Interpretabile come unità significativa
– Componenti modulo strettamente correlati
• Moduli a basso accoppiamento
– Moduli hanno bassa interazione con altri
– Possono essere compresi separatamente
Principi Ingegneria del Software 20
Visione schematica
Alto accoppiamento Basso accoppiamento
Principi Ingegneria del Software 21
Astrazione
• Identificare aspetti importanti di fenomeno
• Ignorare dettagli
• Caso particolare di separation of concerns
• Astrazione da applicare dipende da scopo
Principi Ingegneria del Software 22
Astrazione
• Ignora dettagli – Esempio: equazioni per descrivere circuiti complessi
permettono ragionamenti a progettista
– Equazioni approssimano descrizione e ignorano dettagli che producono effetti trascurabili
• Produce modelli – Esempio: analisi requisiti porta a modello per applicazione
– Modello può essere descrizione formale o semiformale
– Ragionare su sistema tramite ragionamento su modello
Principi Ingegneria del Software 23
Esempi
• Prodotto
• Semantica linguaggio data da macchina astratta:
• ignora dettagli macchine reali per implementazione
• rappresentazione numeri
• meccanismi di indirizzamento
• Processo
• Stima costi basata solo su fattori chiave
• Considera similarità con sistemi precedenti, ignorando
differenze di dettaglio
Principi Ingegneria del Software 24
Astrazione per compilatore
• Applicata in molti casi
– sintassi astratta trascura dettagli sintattici
– es. begin…end vs. {…} per blocchi di istruzioni
– codice macchina intermedio per portabilità
– es. Java Bytecode
Astrazione per Angry Birds
Astrazione:
forme astratte
eventi astratti (caricamento, rilascio, impatto)
Principi Ingegneria del Software 25
Principi Ingegneria del Software 26
Anticipazione del cambiamento
• Capacità di supportare evoluzione software
richiede anticipazione possibili cambiamenti futuri
• Base per evolvibilità del software
• Es.: ambiente gestione configurazioni per progetto
Principi Ingegneria del Software 27
Anticipazione del cambiamento per compilatore
• Considerare possibili cambiamenti di
– Linguaggi sorgente (comitati di standardizzazione)
– Processore bersaglio
– Dispositivi di I/O
Anticipazione cambiamento per Angry Birds
Supporto al cambiamento
Indipendenza da piattaforma
Linee di prodotto
Attività collegate
Principi Ingegneria del Software 28
Principi Ingegneria del Software 29
Generalità
• Problema x
– È caso particolare di problema generale y?
– È istanza di classe di problemi X?
– Soluzione del caso più generale riusabile
• Bilancio fra generalità e prestazioni/costi
• A volte più semplice risolvere caso generale
Principi Ingegneria del Software 30
Generalità per compilatore
• Parametrizzare rispetto a macchina bersaglio
• codice intermedio
• Sviluppare strumenti per generazione di
compilatori e non compilatore singolo
Generalità per Angry Birds
Modello generale di gioco interattivo
Principi Ingegneria del Software 31
Principi Ingegneria del Software 32
Incrementalità
• Processo avanza a passi discreti (incrementi)
• Esempi (processo)
– Consegnare sottoinsiemi di sistema per feedback rapido
– Nuove caratteristiche aggiunte incrementalmente
– Trattare prima funzionalità, poi prestazioni
– Consegnare primo prototipo
– Sforzo incrementale per trasformare prototipo in prodotto
Principi Ingegneria del Software 33
Incrementalità per compilatore
– Versione base per sottoinsieme linguaggio sorgente
– Sottoinsiemi progressivamente più grandi
– Consegnare con diagnostica/ottimizzazione limitate
– Aggiunta successiva
Incrementalità per Angry Birds
Incrementalità
nuove tipologie di attaccanti
nuove tipologie di difensori
nuove tipologie di materiale
Principi Ingegneria del Software 34
Un insieme diverso di principi: Wasserman
Astrazioni
Notazioni e metodi per analisi e progetto
Prototipazione di interfacce utente
Architettura software
Processo software
Riuso
Misura
Strumenti e ambienti integrati
Principi Ingegneria del Software 35