|
emi7oP <a href="http://etyxbsmwlbop.com/">etyxbsmwlbop</a>, [url=http://ejkbnyaqouhe.com/]ejkbnyaqouhe[/url], [link=http://iytqgxxmxvee.com/]iytqgxxmxvee[/link], http://ddjproogyauv.com/ |
ProgettazioneProgettazioneAutori: Alberto Taiocchi Sommario
Il capitolo che state leggendo si occupa della progettazione fornendo, oltre dei criteri di massima, anche delle strategie di progettazione descrivendo volta per volta le tecniche e i metodi per realizzarla, saranno inoltre portate alla vostra attenzione differenti tipologie di architetture in relazione ad alcuni pattern di progettazione; in ultimo ci sarà una parte riguardante la verifica di progetto.
IntroduzioneL’ingegneria progettuale inizia quando termina la prima iterazione dell’ingegneria dei requisiti. Lo scopo della progettazione del software è quello di applicare un insieme di principi, concetti e attività pratiche che conducano allo sviluppo di un sistema di qualità. L’obiettivo della progettazione è quello di creare un modello del software che implementi correttamente tutti i requisiti del cliente e risulti di facile lettura e comprensione per i programmatori. Gli ingegneri del software devono esaminare varie alternative di progettazione e convergere su una soluzione adatta al progetto. Criteri generaliRuolo della progettazioneLa progettazione specifica la struttura ed il funzionamento di un software che soddisfi le specifiche (funzionali e non funzionali), costruibile con le risorse assegnate (vincoli di costo, tempo e personale). I compiti e le esigenze della progettazione comprendono:
Il ruolo dell’ingegnere durante la fase di progettazione è quello di unire conoscenze, problemi, vincoli, risorse per generare una soluzione. La soluzione non potrà mai essere quella ottimale in quanto i vincoli impongono dei limiti. Documento di progettazioneIl documento di progettazione è il risultato della progettazione e prende il nome di progetto. E’ un documento che specifica:
In alcune realtà aziendali il documento di progettazione non è usato come dovrebbe, si possono trovare disegni orientativi e non dettagliati, architetture e dettagli mischiati. Il documento non contiene informazioni che poi verranno implementate. Ci sono anche casi nei quali il documento non esiste. Capita spesso che il progetto è costruito a posteriori per questioni contrattuali con il cliente, oppure che non serva più, in quanto dopo alcuni mesi il progetto reale è diventato completamente diverso. E’ bene distinguere due tipi di documenti:
Progettazione architetturale e di dettaglio esecutivoDopo la fase di specifica dei requisiti (e il rilascio del documento di specifica), la fase di progettazione viene divisa in due parti sequenziali: ''progettazione architetturale e progettazione di dettaglio''.
una rete intranet, oppure per un database sono indicate solamente le operazioni di input/output, senza specificare il DBMS usato). Il progetto architetturale può essere organzzato in un documento strutturato nella seguente maniera. Si ha lo storico delle revisioni indicante il numero di revisione, l’autore, le modiche apportante e la data. Dopo una parte introduttiva si possono specificare e definire termini, abbreviazioni e sigle che verranno usate all’interno del documento. Nella sezione successiva si dovrebbero indicare i riferimenti ai quali si farà riferimento nel corso del documento. Nella fase successiva verrà definita l’architettura del sistema e successivamente l’architettura del software (struttura statica, dinamica e implementazione). Nella fase terminale si specificheranno in dettaglio i componenti software che realizzeranno il sistema.
VisteL’architettura di un prodotto software è descritta da più aspetti (viste) relativamente indipendenti. Le viste possono essere classificate in base alla struttura.
tra i moduli software. Solo in questa fase si indicano le risorse che vengono scambiate e in che modo.
potrà essere fatta usando JSP/Tomcat, oppure il database di supporto sarà Postgres. Regole e principi di progettazioneUn buon ingegnere del software per realizzare un prodotto si basa su regole e principi di progettazione. Tra le fondamentali vengono ricordate quelle di:
I gradi di accopiamento si dividono in base al come:
EuristicheSono regole generali utili per evitare di progettare sistemi poco elastici:
Processi di progettazione (strategie)Forme, strutture e decorazioniIl processo di progettazione, in generale, è composto da tre fasi. Nella prima si definisce il progetto concettuale, nella seconda si attua la sintesi del sistema costruibile, nella terza, la fase di analisi, si attuano verifiche di progetto qualitative e costruttive. Come in campo edile, quando si progetta un edificio, anche nella progettazione software si genera una forma (il grattacielo) in grado di risolvere il problema in questione, soddisfando i requisiti funzionali e non funzionali. Una volta definita la forma si crea la struttura, lo scheletro che sostiene la forma (fondamenta, muri portanti,..) ed infine si aggiungono i dettagli. Ci sono vari modi per attuare la sintesi di un sistema:
I processi non sono mutuamente esclusivi, dipendono da caratteristiche tecniche, dalla definizione dei requisiti, da altri fattori come tempo e costi. Si dovranno quindi scegliere il processo o i processi più confacenti al processi di progettazione. Analisi dei requisiti e sintesi del sistema, integrazione con la specificaNella realtà il processo di analisi e quello di sintesi sono interconnessi e non è distinguibile concretamente quando si è in una fase o nell’altra. L’idea di analizzare tutto e poi sintetizzare una soluzione è un’idea molto astratta dovuta principalmente a motivazioni tecniche:
Esistono però anche motivazioni gestionali:
Tra queste due fasi viene a definirisi una fase di interleaving cioè una convivenza quasi sequenziale tra requisiti e specifica e progetto. In un sistema semplice si passa dai requisiti e specifica al progetto mentre di norma si ripetono ciclicamente questi due passaggi. Modelli operazionali e trasformazioniI modelli operazionali definiscono il modo di gestire le relazioni tra la specifica e il progetto. La caratteristica di questi modelli è che possono simulare i comportamenti reali, il comportamento del modello del sistema viene iterativamente verificato e modificato fino a diventare completo e costruibile. Dall’architettura all’esecutivo di dettaglioIl documento prodotto dall’analisi architetturale (progetto architetturale) identifica i componenti e li descrive a grandi linee, in particolare si concentra sulla loro connessione. Il documento prodotto dall’analisi di dettaglio (progetto esecutivo di dettaglio) progetta ogni singolo componente e le interfacce di connessione tra loro. Il livello di dettaglio del progetto esecutivo di dettaglio deve essere tale da essere considerato dai programmatori un documento di specifica completo che deve solo essere trasformato in codice. In situazioni diverse possono corrispondere livelli di dettaglio diversi, cioè a seconda delle competenze tecniche dei programmatori, le loro conoscenze del settore applicativo, se si programma in casa o in subappalto. TracciabilitàPer tracciabilità si intende creare una serie di documenti che certificano il lavoro svolto da ciascun programmatore, in modo da mantenere un filo diretto tra tutti gli sviluppatori semplicemente dando la possibilità di leggere il rapporto, la traccia, del lavoro svolto fino a quel momento. Inoltre permette di identificare in modo univoco i componenti del sistema e quali requisiti hanno implementato. Una idea potrebbe essere data dalle tabelle di tracciabilità, dove si associa al codice del requisito (che era stato assegnato durante la fase di analisi dei requisiti) un codice componente del progetto in cui è stato implementato. Linguaggi e metodi di progettazionePer modellare il progetto si hanno a disposizione diversi linguaggi, ognuno dotato di regole e guide da seguire. In comune hanno la caratteristica di avere una base grafica perchE’ la comunicazione visiva è più chiara e diretta. Ognuna di queste tecniche ha delle caratteristiche fondamentali che la rendono più o meno adatta a seconda dell’aspetto che dobbiamo modellare (un database e un protocollo, essendo concettualmente diversi, avranno bisogno di tecniche diverse). Si vedrà cosa è possibile modellare e con quale tecnica. DatiIl nucleo del progetto è il modello dei dati, attorno al quale vengono create il resto delle funzioni. I dati vengono modellati utilizzando gli schemi Entità Relazioni. Le fasi principali sono:
FunzioniQuesta tecnica è utilizzata quando dobbiamo gestire dei processi che producono ingressi ed uscite. Vengono rappresentati con una evoluzione dei diagrammi di flusso, i diagrammi di struttura, e rappresentano in modo semplice e intuitivo come le funzioni dei vari processi si scambiano dati durante il loro funzionamento. Si utilizzano i seguenti schemi grafici:
OggettiIl progetto è interamente basato sugli oggetti. Sono delle entità che racchiudono al loro interno dati e funzioni di elaborazione dei dati stessi. La tecnica di modellazione utilizzata è il diagramma delle classi, in linguaggio UML. E’ possibile rappresentare la struttura statica del sistema che però risulta di difficile lettura da parte del cliente. Per definirne il comportamento si utilizzano diverse tecniche, alcune delle quali fanno parte della grande famiglia di linguaggi UML:
L’implementazione di questi oggetti, oltre a delle specifiche strettamente tecniche, richiede di sapere anche dove questi oggetti finiranno, sapere cioè qual è il componente fisico per cui sono destinati. I vincoli da applicare a questa tecnica sono quelli della programmazione ad oggetti (Object Constrain Language). EventiQuesta tecnica prevede di pilotare gli eventi che guidano lo stato del sistema, utilizzando gli automi a stati finiti. Sono composti da:
ConcorrenzaSi utilizza questa tecnica quando si devono modellare processi concorrenti e in generale sistemi distribuiti o basati sulla concorrenza. La tecnica di modellazione utilizzata sono le reti di Petri. TempoLa modellazione si basa su sistemi real-time. Non si intendono però sistemi che evolvono in tempo reale, ma sistemi caratterizzati da vincoli di tempo (di varia natura e di vari ordini di grandezza) che devono essere rispettati per garantire una sincronizzazione dell’intero sistema. Per vincoli di tempo si intendono tempi di risposta accettabili per sistemi interattivi, risposta a delle transazioni, ecc. Inoltre questi tempi devono essere più o meno grandi a seconda del dominio applicativo in cui si sta lavorando (Esempio: i tempi di risposta di un pilota automatico devono essere molto brevi, per ovvie ragioni di sicurezza). Le tecniche di modellazione utilizzate sono degli adattamenti di tecniche già viste in precedenza:
Interazione uomo macchinaQuesta parte viene realizzata dalle interfacce. Dovrà quindi essere specificato come ci si muove all’interno di essa, quali sono i passi da seguire per raggiungere una certa funzione, ect. Integrazione dei linguaggiNella realtà i sistemi coprono diversi aspetti, sono dei cosiddetti sistemi eterogenei. Ognuno di essi dovrà essere gestito con la tecnica appropriata. Quindi bisogna saper modellare tutti gli aspetti (in una applicazione web, si può avere a che fare con delle basi di dati e le relative interfacce di presentazione dei dati e di interrogazione). Architetture e pattern di progettazioneAl crescere della complessità dei sistemi software, il design e la specifica diventano più significativi della scelta di particolari algoritmi e strutture dati. ArchitettureIl progetto architetturale è quella fase in cui si gioca la qualità interna del prodotto. L’ingegneria del software è sempre più orientata verso la creazione di moduli separati. La successiva integrazione darà origine ad un unico progetto. Ecco perchE’ la progettazione architetturale diventa sempre più importante. Il progetto architetturale deve essere in grado di definire un modello della realtà costruibile, che soddisfa una serie di requisiti (analizzati nella fase di analisi dei requisiti e sintetizzati nel documento di specifica). L’architettura svolge un ruolo importante anche nella gestione del lavoro del team. Infatti la scomposizione in moduli di un problema grosso permette di creare una serie di problemi più ridotti che possono essere studiati e stimati (a livello di costo e tempo) in modo più semplice, potendo cos`ı ricostruire la difficoltà generale del prodotto. Si deve tener conto anche dell’aspetto della comunicazione tra il personale coinvolto. Scomponendo il lavoro anche questo aspetto diventa più facile. Infine c’è la fase di analisi, da effettuare prima di fabbricare il progetto perchE’ bisogna avere una certa sicurezza sulla bontà del prodotto. La costruzione di un’architettura garantisce anche la possibilità del riuso perchE’ è possibile identificare progetti diversi che richiedono soluzioni architetturali analoghe. E’ possibile cos`ı riutilizzare la conoscenza acquisita durante il lavoro precedente, riducendo tempi e costi. Inoltre garantisce la sua validità in quanto è già stata provata nel progetto precedente. Il tutto porta a tenere una traccia, un documento che descrive tutto il lavoro svolto. Deve essere leggibile da tutto lo staff che ci lavora e non solo dall’autore dell’architettura. Questo significa creare dei documenti ordinati, con strumenti di modellazione adeguati. RappresentazioneGli elementi di un’architettura non vengono rappresentati con un’unica tecnica. Si utilizzano scatole per rappresentare i componenti e righe per evidenziare le connessioni tra i componenti. Utilizzando questi elementi base possiamo rappresentare la:
Quindi l’architettura risulta essere formata da una vista logica, una vista dei processi, del codice di implementazione, una vista dei componenti fisici del sistema e di uno scenario che racchiude il tutto. DocumentazionePer documentare un’architettura è utile:
Pattern architetturaliUno stile architetturale definisce una famiglia di sistemi software che hanno in comune uno schema ricorrente che si ripete. Conoscere gli stili permette il riuso dell’architettura in uno specifico progetto. Significa che affrontando un problema e analizzandolo si può riconoscere la forma ricorrente alla base. Si può quindi riutilizzare gli schemi senza doverli reinventare. Due progetti possono avere funzioni diverse e domini applicativi differenti, ma avere la stessa forma e stile, cioè lo stesso pattern architetturale. In elenco sono descritti alcuni pattern architetturali. LayersSi ha una serie di componenti, o layer (disegnati con delle scatole) connessi tra loro (da delle frecce), realizzando una forma tipo pila. La semantica di questa struttura prevede che al layer superiore è permesso di usare il layer inferiore, ma non viceversa. Questa logica permette di semplificare la struttura evitando cos`ı di generare studi intricati e difficilmente gestibili. Quindi la correttezza del layer sovrastante dipende dalla correttezza del layer sottostante, applicando questo concetto all’intera pila. Ogni layer è una collezione di unità software, cioè delle procedure, oggetti, strutture dati, ecc. I servizi del layer sono accessibili esclusivamente attraverso delle interfacce (Esempio: protocollo tcp/ip, che si rifà all’architettura standard ISO-OSI). Ogni layer fornisce una serie di servizi coerenti tra loro. Dall’esterno appaiono come macchine che offrono servizi utilizzabili da una macchina più complessa, il layer sovrastante. I vantaggi offerti da questa struttura sono:
Le possibili varianti sono:
Pipes and filterI componenti di questa struttura (scatole) vengono chiamati filtri. Leggono un flusso di dati in ingresso e producono un flusso di dati in uscita. Questa trasformazione è indipendente dal lavoro che altri filtri stanno svolgendo, sia a monte sia a valle. Il flusso dei dati in uscita inizia quindi quando il flusso dei dati in ingresso non è ancora stato consumato del tutto. Le connessioni tra i vari filtri servono per condurre i dati da un filtro all’altro. Ogni filtro è un’entità indipendente che non condivide lo stato con altri filtri. Vantaggi derivanti dall’utilizzo di pipes and filter:
Svantaggi derivanti dall’utilizzo di pipes and filterI filtri non sono adatti a gestire applicazioni interattive, rappresentano solo un flusso di informazioni. Le possibili varianti sono:
RepositoryIn questa struttura si ha una serie di componenti satellite (scatole) indipendenti tra loro, attivati dall’esterno (un utente) che operano su una struttura dati centrale (un database). Le connessioni tra la risorsa di dati centrale e i componenti satellite sono un flusso di dati bidirezionale. La fonte principale della struttura di controllo è data dal componente centrale. Lo stato della struttura centrale è la fonte principale del controllo. Il cambio di stato attiva gli altri componenti Stili di controlloRappresentano gli schemi di gestione del flusso di controllo tra componenti (le scatole).
Generalmente un progetto si compone e può usare più di uno stile. Esistono altri stili classificabili per tipologia applicativa (acquisizione in frequenza, eventi sismici, ect.). Call ReturnE’ molto simile alle chiamate di procedure remote. Viene effettuata una chiamata da un componente ad un altro, il quale, dopo aver elaborato una risposta, risponde al componente che ha effettuato la chiamata. Esempi di questo stile sono l’architettura client-server, con il caso two e three tier. Si sceglie questo stile quando:
ManagerE’ simile al caso precedente. In più si ha un componente (manager) che coordina tutti i processi e le chiamate tra processi. Per esempio si potrebbe avere delle risorse condivise tra più processi che accedono ad un unico software gestore dell’allocazione risorse. Un processo andrà in wait per accedere a una risorsa se quest’ultima non è subito disponibile. Selective BroadcastSi hanno uno o più sottosistemi che registrano l’interesse per uno o più eventi presso un gestore (in comune con tutti i sottosistemi). Ogni sottosistema può annunciare la disponibilità di un evento. Quando l’evento accade il gestore invoca direttamente i sottosistemi interessati. Quindi non è direttamente il gestore a controllare i sottosistemi, ma sono loro stessi a richiedere un evento. Inoltre i sottosistemi non sanno quando un evento si verificherà. Interrupt DrivenOgni interrupt è associato a un indirizzo e ad un handler, una commutazione hardware attiva l’handler, usato nei sistemi real-time. Architetture di sistemi distribuitiLe applicazioni sono costruite da più processi concorrenti che vengono eseguiti su elaboratori diversi ed autonomi connessi da una rete. Generalmente ogni nuovo sistema moderno è distribuito. Architetture distribuite
Ogni oggetto distribuito collabora con altri oggetti, fornendo e richiedendo servizi. Vantaggi delle architetture distribuite:
Svantaggi delle architetture distribuite.:
MiddlewareNelle architetture dei sistemi distribuiti si utilizza uno strato di software particolare, il middleware. E’ uno strato di software posto tra il sistema operativo e le applicazioni. Fornisce un’infrastruttura di servizi che facilitano lo sviluppo di applicazioni in un sistema distribuito, come la RPC. E’ basato su prodotti standard di mercato. I servizi di comunicazione di base si basano sui socket. Middleware tradizionali sono RPC, RDA, MOM, OSF; mentre quelli ad oggetti sono CORBA, RMI, DCOM. Architettura client-serverLe elaborazioni e i dati sono distribuiti su un insieme di componenti. Un insieme di componenti server fornisce servizi (gestione dei dati, stampa, processi di elaborazione), mentre un altro insieme chiede servizi ai componenti server. La rete è utilizzata per connetterli tra loro. I client conoscono i server, mentre non è richiesto che i server conoscano i client. Server e client sono processi logici che possono essere mappati su processori fisici diversi. L’architettura è divisa in tre strati:
A seconda di dove questi strati vengono fisicamente implementati si possono avere due tipi di architettura client/server: two tier (con thin o fat client, a seconda che la logica dell’applicazione sia implementata sul server o direttamente nel client) e three tier (dove i tre strati sono su computer diversi). Architetture ad oggetti distribuitiNon c’è distinzione tra clienti e serventi, ogni oggetto distribuito sulla rete fornisce-richiede servizi a-da altri oggetti distribuiti.La comunicazione tra oggetti avviene attraverso uno strato di middelware chiamato Object Request Broker (bus software). Questo bus software gestisce le richieste di servizi. Conosce tutti gli oggetti esistenti e le loro interfacce. Utilizzando un ORB l’oggetto chiamante esegue il binding con lo stub IDL (che definisce l’interfaccia) dell’oggetto chiamato. La chiamata allo stub diventa una chiamata all’ORB, il quale chiama l’oggetto richiesto attraverso un IDL skeleton che lega l’interfaccia all’implementazione. Un ORB gestisce le comunicazioni tra oggetti che eseguono sullo stesso elaboratore. Ogni elaboratore di un sistema distribuito ha un ORB e gli ORB comunicano tra loro per gestire gli oggetti distribuiti. CORBA (Common Object Request Broker Architecture) definito dallo standard internazionale (OMG - Object Management Group), tramite il linguaggio definisce un’intefaccia comune per ogni oggetto. IDL può essere mappato con diversi linguaggi (C++, Java). Pattern di componentiI pattern sono utilizzati per la progettazione di componenti di un’architettura. Descrivono un problema ricorrente in un dato dominio, e la sua soluzione, in modo tale che possa essere riutilizzata, anche se in modo diverso in contesti diversi. Un design pattern è una regola tripartita, che esprime una relazione tra un contesto, un problema ed una soluzione. Sviluppo di famiglie di componentiSviluppare una famiglia di prodotti porta a realizzare una struttura base da cui derivare più prodotti specializzati. Nel progetto di famiglie di prodotti si ha la convergenza di diversi aspetti, tra cui le esigenze specifiche del cliente, gli aspetti comuni delle classi di applicazione e vantaggi gestionali (come la riduzione del costo) in quanto il prodotto è utilizzabile da più clienti. Sviluppo di frameworkIl framework è una struttura software sulla quale vengono innestati componenti aggiuntivi o adattamenti, che permettono di realizzare una specifica applicazione appartenente ad una famiglia di applicazioni. Incorpora un insieme di conoscenze di base del dominio applicativo di interesse. Sviluppo attraverso integrazione di componentiLo sviluppo attraverso integrazione di componenti comporta lo spostamento dell’enfasi dalla programmazione di un sistema software alla realizzazione di un sistema software attraverso l’integrazione di diversi componenti esistenti. Un componente è un’unità software caratterizzata da:
Le tecniche di integrazione utilizzate sono il bridge e il wrapping. BridgeMeccanismo di comunicazione per interfacciare una specifica funzionalità del componente da integrare. WrappingUn oggetto software incapsula il componente da integrare rendendone disponibili i servizi come se appartenessero al nuovo sistema nativamente. L’integrazione può essere fatta ad hoc integrando interi sottosistemi ed applicazioni, anche eterogenei come database, programmi applicativi o L’integrazione se avviene tramite un middleware esistente è detta a grana fine in quanto si ha una sola invocazione di metodi e oggetti. Verifica di progettoCompito della verifica del progetto è quello di controllare che il progetto rispecchi il documento di specifica e che le specifiche funzionali e non funzionali siano conformi al modello di qualità ISO 9126. Per poter portare a termine la fase di verifica occorre possedere il documento dei requisiti (la specifica) e il documento di progetto (il progetto). Il modello di qualità ISO 9126 permette di effettuare delle analisi della specifica e delle verifiche sul progetto. Per ogni classe di requisiti si devono controllare criteri relativi a:
Quindi nella specifica devono essere presenti questi aspetti che verranno verificati sulla pelle del progetto. Le verifiche possono essere fatte da una persona estranea al progetto. Livelli di verificaLe verifiche possono essere utilmente strutturate per livelli. . .
problema.
ScenariPossono essere utilizzati dai requisiti o costruiti specifici scenari per verificare le caratteristiche del progetto:
Tipi di verificheLa verifica di un prodotto non è effettuabile direttamente sul codice in quanto non esiste ancora. Si utilizzano diversi tipi di verifiche tra cui:
IspezioniSi effettuano delle ispezioni sul documento di progetto. Si controlla l’aspetto organizzativo, la presenza dell’indice, la leggibilità del tutto. Si controlla inoltre che tutti i requisiti funzionali siano allocati e soddisfatti. AnalisiSi devono effettuare dei ragionamenti sul progetto:
Animazione e simulazioneSi effettuano delle simulazioni del funzionamento del prodotto creando dei prototipi. Es. si analizza il funzionamento del sistema usando le reti di Petri. |