Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
8. SYSTEM DESIGN (DECOMPOSIZIONE DEL SISTEMA)
8.1 Overview
Il System Design (progettazione del sistema) è la trasformazione del modello di analisi nel System Design Model (modello di progettazione del sistema). Perché il Design è così difficile? A differenza dell'Analisi, che si focalizza sul dominio applicativo, il Design si focalizza sul dominio delle soluzioni. Le conoscenze di design, quindi, sono in continua evoluzione e le motivazioni per cui si prendono decisioni di design stanno cambiando molto rapidamente. In generale, comunque, gli sviluppatori devono raggiungere dei compromessi fra i vari obiettivi di design che sono spesso in conflitto gli uni con gli altri e devono anticipare molte decisioni relative alla progettazione, pur non avendo una chiara idea del dominio della soluzione. Lo scopo del System Design è quello di costruire un "ponte" tra il sistema desiderato e quello esistente, in maniera maneggevole, usando la tecnica Divide
And Conquer. Dunque, modelliamo il nuovo sistema da sviluppare, come un insieme di sottosistemi.
In generale, il System Design è costituito da una serie di attività:
- Identificare gli obiettivi di design: gli sviluppatori identificano e definiscono le priorità delle qualità del sistema.
- Progettare la decomposizione del sistema in sottosistemi: basandosi sugli use case e sui modelli di analisi, gli sviluppatori decompongono il sistema in parti più piccole, utilizzando stili architetturali standard.
- Raffinare la decomposizione in sottosistemi per rispettare gli obiettivi di design: la decomposizione iniziale di solito non soddisfa gli obiettivi di design, per questo gli sviluppatori devono raffinarla finché gli obiettivi non sono soddisfatti.
In termini più dettagliati, queste attività sono:
- Definire gli obiettivi di design (definizione, trade off).
- Decomporre il sistema in sottoinsiemi più piccoli (strati, partizioni, ...).
Output il modello dei requisiti. Ecco come usare questo modello per il System Design:
- Requisiti non funzionali => (1) Definizione degli obiettivi di design.
- Modello funzionale => (2) Decomposizione del sistema (selezione di sottosistemi basandosi sui requisiti funzionali, su coesione e su accoppiamento).
- Modello a oggetti => (4) Mapping hardware/software e (5) Gestione dei dati permanenti.
- Modello dinamico => (3) Gestione della concorrenza, (6) Gestione globale delle risorse, (7) Controllo software.
- Decomposizione in sottosistemi => (8) Gestione delle boundary condition.
I prodotti del system design, quindi, sono:
- Obiettivi di design, descrivono la qualità del sistema.
- Architettura software: descrive la decomposizione del sistema in termini delle responsabilità dei sottosistemi, in modo che ogni sottosistema possa essere assegnato ad un team e realizzato indipendentemente; le dipendenze fra sottosistemi; l'hardware associato ai vari.
sottosistemi; le politiche relative al flusso di controllo, al controllo degli accessi e alla memorizzazione dei dati.
Boundary use case, descrivono la configurazione del sistema, le scelte relative allo startup, allo shutdown ed alla gestione delle eccezioni.
Identificare gli Obiettivi di Design
Questo è il primo passo del system design, ed è effettuato per identificare le qualità su cui deve essere focalizzato il sistema. Molti design goals possono essere ricavati dai requisiti non funzionali o dal dominio applicativo, altri sono forniti dal cliente. È comunque importante formalizzarli esplicitamente, perché ogni decisione importante di design deve essere presa seguendo lo stesso insieme di criteri. È possibile selezionare questi obiettivi di design da una lunga lista di qualità desiderabili:
I criteri sono organizzati in cinque gruppi:
- Criteri di Performance: includono i requisiti imposti sul sistema in termini di spazio e velocità, come il tempo di risposta, il throughput e la memoria.
- Criteri di Affidabilità: riguardano i requisiti che il sistema deve avere per minimizzare i crash e le loro conseguenze, come la robustezza, l'affidabilità, la disponibilità, la tolleranza ai fault e la sicurezza.
- Criteri di Costo: includono i costi per lo sviluppo, l'implementazione e l'amministrazione del sistema, come il costo dello sviluppo iniziale, il costo dell'installazione e della formazione degli utenti, il costo di conversione dei dati dal sistema precedente (quando è richiesta la compatibilità con il sistema precedente) e il costo di manutenzione e amministrazione.
- Criteri di Mantenimento: determinano quanto sia difficile apportare modifiche al sistema dopo il suo rilascio, come l'estendibilità, la modificabilità, l'adattabilità e la portabilità.
Criteri di End User
Includono qualità che sono desiderabili dal punto di vista dell'utente, ma che non sono state coperte dai criteri di performance e affidabilità: utilità, usabilità.
Relazioni tra gli obiettivi di progettazione:
In realtà, quando si definiscono questi obiettivi, spesso solo un piccolo sottoinsieme di essi può essere tenuto in considerazione. Ad esempio, non è realistico sviluppare software che sia contemporaneamente sicuro e costi poco. Gli sviluppatori, perciò, devono dare delle priorità agli obiettivi di design, tenendo conto anche di aspetti manageriali, quali il rispetto dello schedule e del budget. In genere, quindi, si utilizzano dei trade-off (compromessi) tra i principali obiettivi di design, ad esempio:
- Funzionalità vs. Usabilità
- Costo vs. Robustezza
- Efficienza vs. Portabilità
- Sviluppo rapido vs. Funzionalità
- Costo vs.
"sviluppati in futuro", "un primo prototipo deve essere dimostrato" - Bridge Pattern;
"struttura complessa", "deve avere profondità e ampiezza variabili" - Composite Pattern;
"deve interfacciarsi a un insieme di oggetti esistenti" - Facade Pattern;
"la sua locazione deve essere trasparente" - Proxy Pattern;
"deve essere estendibile", "deve essere scalabile" - Observer Pattern;
"deve fornire una politica indipendente dal meccanismo" - Strategy Pattern;
8.3 Decomposizione del Sistema
Un Sottosistema (Package in UML) è una collezione di classi, associazioni, operazioni, eventi e vincoli che sono correlati. Origini dei sottosistemi sono gli oggetti e le classi UML.
Il Servizio (di un Sottosistema) è un gruppo di operazioni fornite dal sottosistema. Trova origine dai casi d'uso del sottosistema ed è specificato dall' L'
Interfaccia del Sottosistema. specifica il flusso di informazioni e interazioni da/per i Subsystem Boundary (confini dei sottosistemi), ma non interni al sottosistema. Dovrebbe essere ben definita, piccola ed è spesso chiamata API: Application (ma questo termine dovrebbe essere usato durante l'implementazione, non durante il System Design). In particolare, definiamo:- Servizio: un insieme di operazioni correlate che condividono un obiettivo comune. Servizi di notifica dei sottosistemi sono:
LookupChannel()
,SubscribeToChannel()
,SendNotice()
,UnsubscribeFromChannel()
. I Servizi sono definiti in fase di System Design. - Interfaccia di un Sottosistema: insieme di operazioni correlate, con signature completamente specializzate. Queste interfacce sono definite durante l'Object Design e sono anche dette API.
Ingegneria del Software (Metodi e Tecniche) Capitolo 8 - System Design (Decomposizione del Sistema)
Esempio di Decomposizione di un sistema:
Un Oggetto di Interfaccia del Sottosistema fornisce un servizio: si tratta di un insieme di metodi pubblici forniti dal sottosistema e l'interfaccia del sottosistema descrive tutti i metodi dell'oggetto.