UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ingegneria del software
Prof. Michele Amoretti
Fondamenti di Informatica
a.a. 2007/2008
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Sommario
•
Definizione di ingegneria del software
•
Qualità del software
•
Ciclo di vita del software
•
Universal Modeling Language (UML)
•
Design pattern
•
Anti-pattern
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Definizione di ingegneria del software
Crescente
necessità
di
ingegnerizzazione
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Definizione di ingegneria del software
L’ingegneria del software tratta della realizzazione di sistemi software di
dimensioni e complessità tali da richiedere uno o più team di persone.
L’ingegneria del software è la disciplina tecnologica e manageriale che
riguarda la produzione sistematica e la manutenzione dei prodotti
software che vengono sviluppati e modificati entro tempi e costi
preventivati.
L’ingegneria del software è un insieme di teorie, metodi e strumenti, sia
di tipo tecnologico che organizzativo, che consentono di produrre
applicazioni con le desiderate caratteristiche di qualità.
Grande sviluppo a partire dagli anni ’90, con:
•
•
•
tecnologie OOP
Unified Modelling Language (UML)
design pattern
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Qualità del software
Le qualità su cui si basa la valutazione di un sistema software
possono essere
• interne, se riguardano le caratteristiche legate alle scelte
implementative e non sono visibili agli utenti;
• esterne, se riguardano le funzionalità fornite dal sistema
e sono visibili agli utenti.
Le due categorie sono legate, infatti non è possibile ottenere
qualità esterne se il sistema non gode di qualità interne.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Qualità del software
Correttezza - un sistema è corretto se rispetta le specifiche.
Affidabilità (dependability) - un sistema è affidabile se l’utente può
dipendere da esso.
Robustezza - un sistema è robusto se si comporta in modo
ragionevole anche in circostanze non previste dalle specifiche.
Efficienza - un sistema è efficiente se usa bene le risorse di
calcolo.
Facilità d’uso - un sistema è facile da usare se l’interfaccia che
presenta all’utente gli permette di operare in modo naturale.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Qualità del software
Verificabilità - un sistema è verificabile se le sue caratteristiche sono
verificabili.
Riusabilità - un sistema è riusabile se può essere usato, in tutto o in
parte, per costruire nuovi sistemi.
Portabilità - un software è portabile se può funzionare su più piattaforme
hardware/software.
Facilità di manutenzione - un sistema è facile da manutenere se
• è strutturato in modo tale da facilitare la ricerca degli errori,
• la sua struttura permette di aggiungere nuove funzionalità al sistema,
• la sua struttura permette di adattarlo ai cambiamenti del dominio applicativo.
Interoperabilità - si riferisce all’abilità di un sistema di cooperare
con altri sistemi, anche di altri produttori.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Vari studi hanno mostrato che nei progetti di grandi dimensioni
l’implementazione iniziale del programma può occupare soltanto il
10–20% del tempo totale speso da programmatori e progettisti.
Circa il 25–40% del tempo si spende nelle fasi di specifica del
problema e progetto del programma, che vanno completate prima
dell’implementazione.
Un altro 40–65% si spende su attività che seguono
l’implementazione, come revisione, modifica, correzione e
miglioramento del codice originale, oltre che scrittura della
documentazione.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
1. Prima dell’implementazione
(a) Studio di fattibilità
(b) Specifica del problema
(c) Progettazione del programma
(d) Selezione o sviluppo degli algoritmi, analisi
2. Implementazione
(a) Codifica
(b) Debugging
3. Dopo l’implementazione
(a) Test, verifica e benchmarking
(b) Documentazione
(c) Manutenzione
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Studio di fattibilità
Vale la pena di acquistare un computer (o di procurarsi un nuovo e
più veloce sistema) e di scrivere o acquistare del software per
risolvere il problema?
Al termine dello studio di fattibilità, un documento di fattibilità
esprime i risultati, consigliando se procedere con l’acquisto di
hardware e software. La creazione di questo documento può
essere un processo di grande complessità, che comporta
valutazioni in campo economico, legale, gestionale, psicologico e
fiscale, oltre che informatico.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Specifica del problema
Comporta lo sviluppo di una descrizione chiara, concisa e non
ambigua dell’esatto problema da risolvere e dei requisiti a cui il
programma dovrà rispondere. La descrizione originale del
problema (in linguaggio naturale), usata nello studio di fattibilità,
potrebbe essere poco chiara, incompleta o anche contraddittoria.
Il documento di specifica dei requisiti riporta su carta la specifica
finale e completa e guida gli sviluppatori in tutte le decisioni
successive. Tale documento descrive esattamente come si
comporta il programma in tutte le circostanze, non solo nella
maggioranza nei casi, ma anche nelle condizioni meno usuali.
Include una descrizione dei dati attesi in ingresso, e dei risultati
che dovranno essere calcolati, e del modo in cui tali risultati
dovranno essere riportati in uscita.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Specifica del problema
La specifica del problema avviene normalmente come
negoziazione fra individui legati allo sviluppo (analisti) e i clienti,
oppure (nel caso di pacchetti software pensati per la grande
distribuzione) fra analisti e responsabili del marketing.
I modelli di ciclo di vita del software moderni hanno abbandonato
l'assunzione che sia possibile identificare i requisiti di un sistema
software a priori, e tendono a privilegiare approcci iterativi in cui i
requisiti vengono esplicitati gradualmente, per esempio
coinvolgendo l'utente nella prova di prototipi e rilasci parziali del
sistema in corso di sviluppo.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Specifica del problema
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Progettazione del programma
E’ il processo di conversione della specifica dei requisiti in un documento
di progetto di un sistema funzionante.
In questa fase si identificano i moduli appropriati,
insieme ai loro dati e alle sottoattività che devono
svolgere. Nel caso di progetti di tipo OOP,
identificare gli oggetti appropriati consente di
progettare classi con le necessarie variabili
istanza per memorizzare i dati e i metodi per
eseguire le sottoattività.
Più ampio è il progetto, più importante è identificare i
moduli che cooperano.
Si tratta di componenti di base che possono essere
progettati e creati singolarmente, e poi assemblati
in modo opportuno per risolvere il problema.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Progettazione del programma
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Selezione o sviluppo degli algoritmi, analisi
Una volta identificate le varie sottoattività, occorre trovare gli
algoritmi per svolgerle. Ad esempio, una sottoattività potrebbe
essere la ricerca di un valore in una lista di numeri.
Se vi è una scelta di algoritmi, occorre determinare quale è più
adatto al compito, e quale è il più efficiente. Talvolta occorre
sviluppare un algoritmo da zero, un processo molto creativo.
La documentazione di questa fase include una descrizione degli
algoritmi scelti o sviluppati, eventualmente in pseudocodice, e dei
motivi che hanno portato a utilizzarli.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Codifica
La codifica è il processo con cui si traducono i progetti dettagliati
di moduli e algoritmi in linguaggio di programmazione.
Se il progetto è stato sviluppato con cura, dovrebbe essere una
fase quasi di routine. Talvolta si può prendere del codice riusabile
da una libreria di programma, o una classe utile.
Anche la fase di codifica dà origine a un documento scritto, il
listato di codice di programma.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Debugging
Il debugging è il processo in cui si individuano e correggono gli
errori di programma.
•
Errori di sintassi: un’istruzione non segue le corrette regole
della sintassi, il che la rende irriconoscibile dal compilatore.
•
Errori di runtime: si verificano soltanto quando il programma è
eseguito con particolari insiemi di dati che danno origine a
operazioni non lecite, come la divisione per zero.
•
Errori logici: i più difficili da rintracciare ed eliminare, causati
da scelte fatte nell’algoritmo usato per risolvere il problema.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Test, verifica e banchmarking
Un approccio, detto collaudo empirico, è quello di progettare una
speciale serie di casi di prova ed eseguire il programma con tali
dati. I dati di prova, se scelti con cura per percorrere tutti i diversi
percorsi logici all’interno di un programma, possono aiutare a
scoprire errori.
Un secondo approccio per confermare l’affidabilità di un
programma consiste nell’usare la logica matematica per tentare di
dimostrare che il programma sia corretto. La verifica del
programma può essere impiegata per dimostrare che, se i dati di
ingresso per un programma soddisfano certe condizioni, allora,
dopo l’esecuzione del programma su questi dati, i dati di uscita
soddisferanno certe altre condizioni.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Test, verifica e banchmarking
Oltre alla correttezza, la specifica del problema potrebbe
richiedere alcune caratteristiche prestazionali come il tempo
richiesto per calcolare i risultati. Il benchmarking di un programma
significa eseguirlo su molti insiemi di dati per assicurarsi che le
prestazioni ricadano entro i limiti richiesti.
•
•
Testing in the small, riguarda moduli singoli.
Testing in the large, riguarda il sistema nella sua globalità.
Naturalmente tutti i risultati di queste fasi dovranno essere
riportati sulla carta come prova che il programma soddisfa le
specifiche.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Documentazione
La documentazione del programma è tutto il materiale scritto
che lo rende comprensibile.
Comprende la documentazione interna, che fa parte del codice
di programma stesso. Una buona documentazione interna si
ottiene scegliendo nomi significativi per gli identificatori di
programma, usando molti commenti per descrivere il codice e
separando il programma in classi ragionevoli con metodi brevi,
ognuno dei quali svolga una sottoattività specifica.
La documentazione esterna è costituita dai materiali raccolti
per facilitare la comprensione del programma. Anche se abbiamo
posto questa fase in un punto avanzato del processo di sviluppo,
si deve notare che ogni fase precedente produce qualche forma di
documentazione.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Documentazione
La documentazione accompagna tutto il ciclo di vita del software.
La versione definitiva è scritta in due forme.
La documentazione tecnica consente ai programmatori che in un
secondo tempo interverranno sul programma di comprenderne il
codice. Informazioni come descrizioni di classi e di algoritmi, oltre
ai listati, rientrano in questa categoria.
La documentazione utente aiuta gli utenti a eseguire il
programma; comprende tutorial online o sistemi di guida che
l’utente può utilizzare mentre il programma è in esecuzione, e
(sempre più raramente) manuali scritti.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Manutenzione
I programmi non sono entità statiche che, una volta completate,
non cambiano più. I programmi di successo, scritti con grande
impegno di tempo e denaro nello sviluppo, vengono usati a lungo.
Non è raro che un programma rimanga in uso per 5, 10 o 15 anni
dopo la sua creazione. In effetti il ciclo di vita tipico per un
software medio-grande è di 1–3 anni in sviluppo e 5–15 anni sul
mercato. Durante questo lungo periodo d’uso si possono scoprire
errori, acquistare nuovo hardware per l’esecuzione del
programma, possono cambiare le esigenze dell’utente, ecc.
Il programma originale deve essere modificato e fornito in versioni
nuove per adeguarsi alle esigenze cambiate.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Ciclo di vita del software
Manutenzione
La manutenzione del programma, il processo con cui si adatta un
software esistente, può occupare fino al 65% del budget totale per
il ciclo di vita del software. Se il programma è stato ben
pianificato, progettato con attenzione, collaudato ampiamente
e ben documentato, la manutenzione risulterà molto più facile.
La manutenzione non dovrebbe essere considerata come un
passaggio separato nel ciclo di vita del software; in realtà
coinvolge la ripetizione di alcune o tutte le fasi descritte in
precedenza, da uno studio di fattibilità a implementazione,
collaudo e documentazione aggiornata. Questa fase riflette il fatto
che il ciclo di vita del software è veramente un ciclo, durante il
quale è necessario ripetere le prime fasi di sviluppo mentre il
software cresce, cambia e matura.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Unified Modeling Language (UML)
In ingegneria del software, UML (Unified Modeling Language,
"linguaggio di modellazione unificato") è un linguaggio di
modellazione e specifica basato sul paradigma object-oriented.
Il nucleo del linguaggio fu definito nel 1996 da Grady Booch, Jim
Rumbaugh e Ivar Jacobson (detti "i tre amigos") sotto l'egida dello
Object Management Group (OMG), che tuttora gestisce lo
standard di UML.
UML svolge un'importantissima funzione di lingua franca nella
comunità della progettazione e programmazione a oggetti. Gran
parte della letteratura di settore usa UML per descrivere soluzioni
analitiche e progettuali in modo sintetico e comprensibile a un
vasto pubblico.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Unified Modeling Language (UML)
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Class Diagram
I CD consentono di descrivere le classi di un sistema, con
le loro caratteristiche (variabili membro e metodi) e le relazioni
che intercorrono tra di esse.
Es.
associazione
Si legge: un cliente
può fare più ordini.
1
navigabilità
La freccia dice che
un ordine ha la
responsabilità di
specificare da quale
cliente proviene.
Ingegneria del software
+  public
-  private
#  protected
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Class Diagram
Nei CD si usa una simbologia specifica per esprimere l’ereditarietà.
Es.
implementazione
estensione
classi
Ingegneria del software
interfaccia
Note:
1) l’estensione può essere anche tra interfacce
2) l’ereditarietà in generale può essere multipla
[in Java no, però!]
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Class Diagram
Anche le relazioni “parte di” hanno una loro simbologia specifica.
Es.
Diamante vuoto: aggregazione  la durata della vita dell’oggetto
composto NON coincide con quella delle parti
Diamante pieno: composizione  la durata della vita dell’oggetto
composto coincide con quella delle parti
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Package Diagram
I PD permettono di raggruppare elementi (classi, in genere) affini
e di esprimere le dipendenze tra gruppi di elementi.
Es.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Object Diagram
Gli OD permettono di descrivere un sistema in termini di oggetti e
relative relazioni.
Notazione per gli oggetti: nomeOggetto: Classe
Es.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Component Diagram
Servono a rappresentare le interazioni tra moduli:
•
•
•
•
•
programmi eseguibili
librerie
tabelle
file
documenti
Es.
A sinistra le interfacce fornite, a destra quelle richieste.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Component Diagram
Es.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Deployment Diagram
Es.
I DD servono a descrivere i sistemi in
termini di risorse hardware detti nodi,
e di relazioni fra di esse.
Spesso si utilizza un diagramma che
mostra come le componenti software
sono distribuite rispetto alle risorse
hardware disponibili sul sistema;
questo diagramma è costruito unendo
il Component Diagram e il Deployment
Diagram.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Use Case Diagram (UCD)
Gli UCD sono dedicati alla descrizione delle funzioni o servizi
offerti da un sistema, così come sono percepiti e utilizzati dagli
utenti (detti attori) che interagiscono col sistema stesso.
Es.
Ciascun ovale rappresenta uno use case. Gli omini sono gli attori.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
UML – Activity Diagram
Fondamenti di Informatica
Es.
Un AD definisce le attività da
svolgere per realizzare una data
funzionalità. Può essere utilizzato
anche in fase di design per
dettagliare un determinato
algoritmo (in tal caso è come un
flowchart).
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Sequence Diagram
I SD vengono utilizzati per
Descrivere sequenze di azioni
in cui tutte le scelte sono
state già effettuate; in pratica
nel diagramma non
compaiono scelte, né flussi
alternativi.
Es.
Un SD descrive le relazioni che
intercorrono, in termini di
messaggi, tra attori, oggetti o
entità del sistema che si sta
rappresentando.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Communication Diagram
Un diagramma di questo tipo serve a descrivere l'interazione fra
più partecipanti alla realizzazione di una certa funzionalità.
I messaggi sono scambi di informazione fra due partecipanti e
possono essere sincroni o asincroni a seconda se il chiamante resti
bloccato in attesa della risposta al messaggio oppure prosegua la
sua elaborazione in parallelo al partecipante che ha ricevuto il
messaggio.
I messaggi sono numerati, al fine di comprendere la loro sequenza
temporale. La numerazione può essere semplice (1, 2, 3 ...)
oppure decimale nidificata (1, 1.1, 1.1.1, ... 2 ...).
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
UML – Communication Diagram
Es.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Nell'ingegneria del software, un design pattern può essere definito
"una soluzione progettuale generale a un problema ricorrente".
Esso non è una libreria o un componente di software riusabile,
quanto una descrizione o un modello da applicare per risolvere un
problema che può presentarsi in diverse situazioni durante la
progettazione e lo sviluppo del software.
La differenza tra un algoritmo e un design pattern è che il primo
risolve problemi computazionali, mentre il secondo è legato agli
aspetti progettuali del software.
L'uso di pattern nella descrizione di altri pattern dà origine ai
cosiddetti linguaggi di pattern.
PLoP  http://hillside.net/plop/2008/index.php
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Un design pattern è definito da:
•
un nome, costituito da una o due parole che siano il più
possibile rappresentative del pattern stesso;
•
un problema, ovvero la descrizione della situazione alla quale
si può applicare il pattern; il problema può essere generale o
specifico; può esserci anche una lista di condizioni perché sia
necessario l'utilizzo del pattern;
•
una soluzione, che descrive gli elementi costitutivi del pattern
con le relazioni e relative implicazioni, senza però addentrarsi
in una specifica implementazione;
•
delle conseguenze, cioè i risultati e i vincoli che derivano
dall'applicazione del pattern. Sono fondamentali in quanto
possono essere l'ago della bilancia nella scelta dei pattern.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Classificazione generale:
• Pattern dello sviluppo
Riguardano l’attività degli sviluppatori di software.
• Pattern architetturali
Riguardano l’attività dei progettisti di software.
• Pattern gestionali
Riguardano l’attività dei “project manager”.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Classificazione dei pattern per l’OOP (sono pattern dello sviluppo e
architetturali allo stesso tempo):
• Pattern creazionali
Forniscono un’astrazione del processo di creazione delle istanze
delle classi, favorendo l’indipendenza del sistema dalle modalità di
creazione e dai tipi concreti effettivamente generati.
• Pattern strutturali
Consentono di riutilizzare oggetti esistenti fornendo agli
utilizzatori un'interfaccia più adatta alle loro esigenze.
• Pattern comportamentali
Forniscono soluzione alle più comuni tipologie di interazione tra gli
oggetti.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Es. Singleton
E’ un pattern creazionale.
Il suo scopo è assicurare che una classe abbia una sola istanza.
public class MegaDirettoreGalattico {
private static MegaDirettoreGalattico istanza = null;
private MegaDirettoreGalattico() {} // COSTRUTTORE PRIVATO!
}
public static MegaDirettoreGalattico getMegaDirettoreGalattico() {
if (istanza == null) {
istanza = new MegaDirettoreGalattico();
}
return istanza;
}
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Es. Singleton
(continuazione)
Si ricordi che static significa “condiviso da tutte le istanze
della classe”. Quindi quando viene creato l’oggetto a cui la
variabile membro istanza fa riferimento, tutte le successive
invocazioni di getMegaDirettoreGalattico() restituiranno un
riferimento a quell’oggetto.
// prima invocazione: l’istanza viene creata
MegaDirettoreGalattico direttore =
MegaDirettoreGalattico.getMegaDirettoreGalattico();
// seconda invocazione: nessuna nuova istanza creata
MegaDirettoreGalattico altroDirettore =
MegaDirettoreGalattico.getMegaDirettoreGalattico();
direttore e altroDirettore sono due riferimenti allo stesso oggetto!
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Es. Adapter
E’ un pattern strutturale.
Il suo scopo è fornire una soluzione astratta al problema
dell'interoperabilità tra interfacce differenti.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Design pattern
Es. Strategy
E’ un pattern comportamentale.
Il pattern Strategy è utile in quelle situazioni dove è necessario
modificare dinamicamente gli algoritmi utilizzati da un'applicazione.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Antipattern
Un antipattern si può definire alla stessa maniera dei "pattern" in
quanto è comunque una soluzione progettuale generale a un
problema ricorrente ed è costituito da un nome, un problema, una
soluzione e delle conseguenze.
La differenza tra un pattern (migliorativo) ed un antipattern è che
il primo è caratterizzato da una soluzione universalmente
riconosciuta come buona e positiva, mentre il secondo propone
una falsa soluzione o una soluzione fondamentalmente negativa e
che quindi deve essere evitata.
Un antipattern può anche essere un pattern utilizzato nel modo
e/o nel posto sbagliato…
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Antipattern
Classificazione generale:
• Antipattern dello sviluppo
Riguardano l’attività degli sviluppatori di software.
• Antipattern architetturali
Riguardano l’attività dei progettisti di software.
• Antipattern gestionali
Riguardano l’attività dei “project manager”.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Antipattern
Vediamo alcuni noti antipattern per l’OOP:
Es. Spaghetti code
Sintomi:
• Struttura confusa del codice
• Uso di variabili globali
• Uso di GOTO
Es. Accumulate and fire
Il programma crea e inizializza un certo numero di variabili globali,
che poi vengono utilizzate (e modificate) da sottoprogrammi o
metodi.
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Antipattern
Es. God object
Un oggetto non deve “sapere” troppe cose e “fare” troppe cose.
Un God object è l’istanza di una classe che ha troppe variabili
membro e troppi metodi (spesso non correlati).
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Antipattern
Es. Polimorfismo dei poveri
if (animale instanceof Gatto) {
faiQualcosa(animale);
}
else if (animale instanceof Papero) {
faiQualcosAltro(animale);
}
Si hanno comportamenti diversi in base alla classe di cui
“personaggio” è istanza, ma tali comportamenti sono dati da
metodi diversi della classe utilizzatrice.
Se aggiungiamo una nuova classe Cane e vogliamo un nuovo
comportamento, siamo costretti a definire un nuovo metodo nella
classe utilizzatrice:
faiQualcosAltroAncora(Cane cane) { .. }
Ingegneria del software
Prof. M. Amoretti
UNIVERSITA’ DEGLI STUDI DI PARMA
Corso di Laurea in Ingegneria Gestionale
Fondamenti di Informatica
Antipattern
Es. Polimorfismo dei poveri
Riguardo quest’ultimo antipattern, basta un pò di OOP per
rifattorizzare il tutto in maniera più corretta e manutenibile,
semplicemente usando interfacce e relazioni di implementazione
e/o ereditarietà tipo:
animale.faiQualcosa();
avendo avuto cura di definire
public interface Animale {
void faiQualcosa();
}
public class Gatto implements Animale { .. };
public class Papero implements Animale { .. };
Ingegneria del software
Prof. M. Amoretti
Scarica

Ingegneria del Software