Estratto del documento

Ingegneria della progettazione

L’ingegneria della progettazione comprende l’insieme di principi, concetti e pratiche che conducono allo sviluppo di un sistema o di un prodotto di alta qualità. I principi della progettazione definiscono una filosofia che guida il lavoro del progettista. La progettazione è ciò che praticamente ogni ingegnere desidera fare. È il luogo in cui domina la creatività, dove i requisiti del cliente, gli effettivi bisogni e le considerazioni tecniche determinano la formulazione di un prodotto o di un sistema. La progettazione crea una rappresentazione o un modello del software ma a differenza del modello analitico (che si concentra sulla descrizione dei dati, delle funzioni e dei comportamenti richiesti), il modello progettuale fornisce dettagli relativi alle strutture di dati, all’architettura, alle interfacce e ai comportamenti del software che sono necessari per implementare il sistema.

Progettare significa eseguire un processo di risoluzione di un problema il cui obiettivo è trovare e descrivere un modo:

  • Per implementare i requisiti funzionali rispettando i vincoli imposti dai requisiti non funzionali, inclusi i vincoli sul budget in conformità con una serie di principi di buona qualità.

La progettazione consente ad un ingegnere software di modellare il sistema o il prodotto che deve essere realizzato. Questo modello può essere valutato in termini di qualità e migliorato prima che venga generato il codice, prima che vengano condotti i test e prima che gli utenti finali vengano coinvolti in somme troppo elevate. La progettazione è il luogo in cui viene valutata la qualità del software.

Problemi di design e design space

Un progettista affronta una serie di problemi di design: sono sottoproblemi specifici del problema complessivo della progettazione. Ciascun problema ha normalmente una serie di soluzioni alternative: design options. Il progettista effettua una serie di design decision per risolvere ciascun problema (significa scegliere la migliore fra le alternative possibili). Per prendere una decisione di progetto, l’ingegnere del software usa la conoscenza dei requisiti, del progetto realizzato fino a quel punto, delle tecnologie disponibili, dei principi di progettazione software e di best practices, di ciò che ha funzionato bene in passato.

Design space: lo spazio dei possibili progetti che saranno implementabili scegliendo tra le varie alternative viene spesso chiamato design space.

Definizioni

  • Componente: qualsiasi pezzo di software o hardware che svolge un ben preciso ruolo. Un componente può essere isolato e sostituito con un diverso componente che svolge una funzionalità equivalente. Molti componenti sono progettati per essere riusabili. In opposizione, ci possono essere altri componenti che svolgono specifiche funzioni. Ad esempio, file di codice sorgente, file eseguibili, DLL, e database.
  • Modulo: un componente che è definito a livello di un linguaggio di programmazione. Per esempio, metodi, classi e packages sono moduli in Java. File e funzioni sono moduli in C.
  • Sistema: un’entità logica avente un insieme definito di responsabilità o obiettivi, e che è costituito di hardware, software o di entrambi. Un sistema può avere una specifica che viene poi implementata da un insieme di componenti.

Un sistema continua ad esistere anche se i suoi componenti vengono modificati e sostituiti. Lo scopo dell’analisi dei requisiti è di determinare le responsabilità di un sistema. Un sottosistema è un sistema che è parte di un sistema più grande, e che presenta una ben precisa interfaccia.

Rappresentazione del software

La progettazione rappresenta il software in vari modi. Innanzitutto occorre rappresentare l’architettura del sistema o prodotto. Poi occorre modellare le interfacce che connettono il software agli utenti finali, agli altri sistemi e dispositivi e ai componenti costitutivi. Infine devono essere progettati i componenti software utilizzati per costruire il sistema.

Ognuna di queste viste rappresenta un aspetto differente della progettazione, ma tutte riguardano un insieme di concetti di progettazione di base che guidano tutto il lavoro di progettazione del software. Ciò che viene prodotto è un modello progettuale che comprende rappresentazioni a livello di architettura, interfaccia, componenti e dispiegamento.

Progettazione Top-Down e Bottom-Up

  • Top-Down Design: si parte col progettare la struttura di altissimo livello del sistema. Ad esempio, definire l’architettura del software e il tipo di database che sarà impiegato. Quindi, si procede gradualmente con decisioni più dettagliate riguardanti aspetti di più basso livello, quali:
    • Il formato di particolari dati;
    • Gli algoritmi che saranno usati.
  • Bottom-Up Design: si parte progettando i componenti basilari di basso livello e si decide poi come collegare insieme questi componenti per ottenere i componenti di più alto livello. Si procede dunque per livelli di astrazione (layers of abstraction).

In genere è normale usare un misto dei due approcci:

  • La progettazione Top-Down è necessaria per definire una buona struttura del sistema;
  • La progettazione Bottom-Up Design serve a progettare componenti riusabili in altri punti del sistema.

Differenti aspetti della progettazione

  • Progetto dell’architettura: stabilisce la visione in sottosistemi e componenti, come saranno collegati tra loro, come interagiranno, le loro interfacce.
  • Class Design: le varie caratteristiche delle classi.
  • User Interface Design
  • Database Design: il progetto dei dati persistenti.
  • Algorithm Design: progetto dei meccanismi computazionali.
  • Protocol Design: progetto dei protocolli di comunicazione.

Principi per una buona progettazione

Obiettivi finali di un buon progetto:

  • Aumentare il profitto riducendo i costi e aumentando i guadagni.
  • Assicurarsi della conformità con i requisiti.
  • Accelerare lo sviluppo.
  • Migliorare la qualità (per ridurre i costi e aumentare i guadagni): usabilità, efficienza, affidabilità, manutenibilità, riusabilità.

Progettazione nel contesto di ingegneria del software

La progettazione del software si situa nel nucleo centrale dell’ingegneria del software e viene applicata indipendentemente dal modello di processo software utilizzato. La progettazione del software è l’ultima azione di ingegneria del software che rientra nell’attività di modellazione e getta le basi per le attività di costruzione (generazione e collaudo del codice). Si passa dal modello analitico al modello progettuale attraverso un processo di traduzione. La progettazione produce un progetto dei dati e delle classi, un progetto dell’architettura, un progetto dell’interfacce e un progetto dei componenti.

L’ingegneria della progettazione dovrebbe sempre iniziare con una considerazione dei dati, gli elementi di base per tutti gli altri elementi della progettazione. Dopo aver stabilito le basi occorre derivare l’architettura. Solo allora dovrebbero iniziare le attività di progettazione.

Il progetto delle classi e dei dati trasforma i modelli analitici e delle classi nella realizzazione delle classi e nelle strutture dati necessarie per l’implementazione del software. A mano a mano che viene progettato ciascun componente software, si può ottenere una progettazione più dettagliata dei dati.

L’importanza della progettazione per il software si traduce in una sola parola: qualità. La progettazione è il luogo in cui si può promuovere la qualità entro l’ingegneria del software. La progettazione fornisce rappresentazioni del software soggette a una valutazione di qualità. La progettazione è il solo modo di tradurre accuratamente i requisiti imposti dal cliente in un prodotto o sistema finito. La progettazione del software serve da fondamento per le attività di manutenzione che la seguono. Senza progettazione, si rischia di costruire instabile, cioè un sistema poco robusto rispetto alle minime modifiche, difficile da collaudare, la cui qualità non può essere valutata fino alle ultime fasi del processo, quando resta poco tempo per somme cospicue già state spese.

Il processo di progettazione e la qualità della progettazione

La progettazione del software è un processo iterativo, attraverso il quale i requisiti sono tradotti in uno schema per la costruzione del software. All’inizio lo schema dà una vista globale del software. In altre parole, il progetto è rappresentato a un alto livello di astrazione, per poi passare attraverso raffinamenti successivi, attraverso livelli sempre meno astratti, ancora riconducibili ai requisiti ma in modi più sottili. Durante la progettazione, la qualità del progetto viene via via valutata mediante una serie di revisioni tecniche formali.

Ecco quali sono gli obiettivi della progettazione:

  • Il progetto deve soddisfare tutti i requisiti espliciti contenuti nel modello concettuale e deve accogliere i requisiti impliciti voluti dal cliente;
  • Il progetto deve essere una guida leggibile e comprensibile per chi è incaricato di stendere il codice e per chi dovrà collaudare il software e provvedere alla sua manutenzione;
  • Il progetto deve dare un quadro completo del software; i domini dei dati, funzionale e comportamentale devono essere considerati dal punto di vista dell’implementazione.

Vediamo quali sono gli attributi della qualità di un progetto software:

  • Funzionalità: viene valutata controllando le capacità del programma, la generalità delle funzioni derivate e la sicurezza del sistema globale.
  • Usabilità: viene valutata misurando considerando i fattori umani, l’estetica generale, la coerenza e la documentazione.
  • Affidabilità: viene valutata misurando la frequenza e la gravità dei guasti, la precisione dei risultati di output, la capacità di recuperare una situazione di guasto e la prevedibilità del programma.
  • Prestazioni: vengono misurate in termini di velocità di elaborazione, tempo di risposta, consumo di risorse, produttività ed efficienza.
  • Sopportabilità: combina la capacità di estendere il programma (estendibilità), l’adattabilità, la facilità di servizio, la collaudabilità, la compatibilità, la configurabilità, la facilità con cui un sistema può essere installato e la facilità con cui possono essere individuati i problemi.

Principi di progettazione

Importante concetto nella fase di progettazione è la modularità. L’architettura del software viene divisa in più componenti chiamati moduli che vengono integrati per soddisfare i requisiti del problema. Si crea così l’indipendenza funzionale tra moduli e si introduce il concetto di coesione. La coesione indica la forza funzionale relativa di un modulo. L’accoppiamento indica l’interdipendenza relativa fra moduli. La coesione è l’estensione naturale del concetto di “nascondere le informazioni”. Un modulo coeso svolge un unico compito, richiedendo poche interazioni con altri componenti posti in altre parti del programma. In breve, un modulo coeso dovrebbe svolgere teoricamente un’unica operazione. L’accoppiamento è un’indicazione dell’interconnessione fra i moduli di una struttura software. Il raffinamento progressivo è una strategia di progettazione top-down proposta per avere diversi livelli di dettaglio procedurale e sviluppare una gerarchia dei componenti. Il raffinamento aiuta il progettista a rivelare i dettagli di basso livello a mano a mano che progredisce il progetto. Un’importante attività progettuale suggerita per molti metodi agili è la rifattorizzazione, una tecnica di riorganizzazione che semplifica la progettazione (o la programmazione) di un componente senza modificare la sua funzione o il suo comportamento. La rifattorizzazione è il processo di modifica di un sistema software in modo che non alteri il comportamento esterno del progetto del codice, migliorando però la sua struttura interna.

Principio di progetto n.ro 1: Decomposizione

  • Cercare di risolvere un problema in una volta sola è in genere più difficile che risolverlo per parti.
  • I requisiti da implementare possono essere divisi fra diversi sottosistemi.
  • Persone diverse possono lavorare su parti diverse.
  • Ogni ingegnere del software può specializzarsi su parti diverse.
  • Ogni singolo componente sarà più piccolo e dunque più semplice da capire.
  • Le varie parti potranno essere sostituite senza dover sostituire o cambiare molto le altre parti.

Modi per dividere un sistema software. Un sistema distribuito può essere diviso in clients e servers. Un sistema si divide in sottosistemi. Un sottosistema si può dividere in più packages. Un package si divide in più classi. Una classe si divide in metodi.

Principio di progetto n.ro 2: Aumentare la coesione dove è possibile

La coesione ci dice con quale criterio suddividere in parti. Un sottosistema o un modulo avrà elevata coesione se contiene al suo interno elementi correlati fra di loro e lascia fuori il resto. La coesione permette di comprendere meglio ogni singolo elemento. Diversi tipi di coesione: funzionale, layer, comunicazionale, sequenziale, procedurale, temporale, di utilità. La coesione verrà ripresa in seguito.

Principio di progetto n.ro 3: Ridurre l’accoppiamento

L’accoppiamento (coupling) fra i moduli esiste quando ci sono interdipendenze tra un modulo e l’altro. Se ci sono interdipendenze, le modifiche in un punto richiederanno modifiche anche altrove. Una rete di interdipendenze rende difficile capire come un componente lavora effettivamente. Non si può riusare un modulo senza conoscere i dettagli dei moduli con cui interagisce.

Anteprima
Vedrai una selezione di 6 pagine su 25
Ingegneria della progettazione Pag. 1 Ingegneria della progettazione Pag. 2
Anteprima di 6 pagg. su 25.
Scarica il documento per vederlo tutto.
Ingegneria della progettazione Pag. 6
Anteprima di 6 pagg. su 25.
Scarica il documento per vederlo tutto.
Ingegneria della progettazione Pag. 11
Anteprima di 6 pagg. su 25.
Scarica il documento per vederlo tutto.
Ingegneria della progettazione Pag. 16
Anteprima di 6 pagg. su 25.
Scarica il documento per vederlo tutto.
Ingegneria della progettazione Pag. 21
1 su 25
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher cecilialll di informazioni apprese con la frequenza delle lezioni di Fondamenti di informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di Napoli Federico II o del prof Fassolino Rita.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community