Il disegno object oriented di un sistema software viene fatto a partire da:
una lista di requisiti funzionali che il sistema deve soddisfare
una lista di requisiti non funzionali che descrivono la qualità attesa del sistema nel suo insieme, suddivisi in cinque categorie principali (ognuna suddivisa in sottoattributi ogniuno dei quali espresso con metriche per le quali va definito un intervallo di accettabilità):
affidabilità e sicurezza
usabilità
efficienza
Manutenibilità: capacità del software di essere modificato con un impegno contenuto a seguito di correzioni, miglioramenti o adattamenti dovuti a cambiamenti nell’ambiente di impiego o nei requisiti o nelle specifiche funzionali (il software segue l’evoluzione dell’organizzazione); le sottocaratteristiche correlate sono:
Analizzabilità: impegno richiesto per diagnosticare carenze o cause di malfunzionamento o per identificare le parti da modificare
Modificabilità: impegno richiesto per effettuare modifiche, rimuovere difetti o sostituire componenti di sistema
Stabilità: ridotto rischio di effetti inaspettati a seguito di modifiche apportate
Provabilità: impegno richiesto per validare le modifiche apportate al software
portabilità, interoperabilità, accessibilità
vincoli di tempo di realizzazione a cui il sistema deve sottostare (sforzo necessario e data di calendario)
vincoli di costo
altri eventuali vincoli
vincoli legislativi e normativi
vincoli di interazione con altri sistemi software estenti
...
Il disegno viene fatto da una persona con competenze di progettazione software.
L'attività di stendere il disegno di un sistema software consiste nel individuare tra i possibili disegni che realizzano i requisiti funzionali quello che meglio soddisfa la qualità attesa (espressa dai requisiti non funzionali) e meglio rispetta i vari vincoli espressi.
L'attività di disegno produce una descrizione del sistema in sotto-sistemi, componenti e classi per le quali sono definite le relazioni, le interazioni e le responsabilità.
Il risultato prodotto dalla attività di disegno è destinato a guidare le attività di sviluppo, integrazione, test e rilascio del sistema software.
Il disegno non è analisi
L'attività di emersione e raccolta dei requisiti, di analisi dei requisiti e definizione delle specifiche, chiamata genericamente col termine di analisi, differisce dall'attività di disegno.
L'analisi:
descrive cosa il sistema deve fare
descrive il comportamento esterno
usa il linguaggio dell’utente
partecipano committente e analista
è destinata alla progettazione (ossia il disegno).
Il disegno:
descrive come il sistema deve fare
descrive il comportamento interno
usa il linguaggio dello sviluppatore
vi partecipano progettista e sviluppatori
è destinato allo sviluppo.
Quanto disegno fare
Il disegno è sufficiente quando ha raggiunto i suoi due scopi principali:
Dominare la complessità
Permettere l’evoluzione
Inizialmente il sistema da realizzare può sembrare molto complesso e presentare dei punti oscuri. Quando i dubbi e le incertezze e le complessità avvertite nel sistema sono state ridotte e semplificate, il disegno ha raggiunto il suo scopo e non serve farne altro.
Quando il sistema è realizzato e il cliente desidera aggiungere o modificare funzionalità senza rifare tutto o la software house vuole ridurre i costi di manutenzione e adattare il sistema a più clienti, ci si può scontrare con la difficoltà di modificare il software. Se modificando il codice non avvertiamo più "attriti", resistenze che frenano o impediscono la modifica e l'evoluzione, il disegno ha raggiunto il suo scopo e non serve farne altro.
Il disegno e la semplicità
La relazione tra il disegno del software e la complessità è guidato dal PrincipioKiss.
Il buon disegno
Gli attributi del buon disegno
Quando un sistema software è disegnato bene il codice è Flessibile, Robusto e Riusabile, il suo opposto è quando il codice è Rigido, Fragile e Immobile.
Caratteristiche di un buon disegno
Il suo contrario
Flessibile riesco a fare una modifica intervenendo localmente in parti isolate del codice
Rigido è difficile cambiare perché ogni cambiamento influenza troppe parti del sistema
Robusto faccio una singola modifica del codice e questa incide solo sul codice strettamente/logicamente correlato
Fragile quando effettuo un cambiamento questo provoca la rottura inattesa di parti non correlate del sistema, fisso alcuni problemi e questo porta alla nascita di nuovi problemi
Riusabile riesco facilmente ad estrarre dal codice le funzionalità per riutilizzarle
Immobile è difficile estrarre parti di codice per riutilizzarle, faccio prima a riscriverle
In modo equivalente il buon disegno può essere misurato con queste due metriche:
basso accoppiamento: la dipendenza dei componenti software del sistema da altri componenti software del sistema è bassa,
alta coesione: i componenti software del sistema possono collaborare tra di loro per ottenere nuove funzionalità in svariate combinazioni.
A questo proposito si vedano anche i PatternGRASP, ovvero i pattern relativi all'assegnazione delle responsabilità nell'ambito di una struttura ad oggetti.
Nel disegno dei componenti (Assembly in .NET) relativamente alla coesione:
REP Reuse Release Equivalence Principle
CCP Common Closure Principle
CRP Common Reuse Principle
Nel disegno dei componenti (Assembly in .NET) relativamente all'accoppiamento:
ADP Acyclic Dependencies Principle
SDP Stable Dependencies Principle
SAP Stable Abstractions Principle
La metrica di Martin
Il disegno up-front e il disegno continuo
Il disegno classico è quello inteso up front ossia la fase completata prima di iniziare la fase di sviluppo. Viene svolto da una figura dedicata detta Progettista con competenze di disegno e nei casi peggiori senza più competenze di sviluppo.
Il disegno continuo o incrementale è detto Refactoring e viene svolto continuamentre mentre si scrive il codice. Viene svolto quindi dagli stessi sviluppatori.
Il disegno up-front e il Refactoring possono coesistere e tipicamente coesistino, il disegno up-front svolge ruolo di indirizzo iniziale, serve a risolvere studi di fattibilità ed avviare lo sviluppo mentre il Refactoring dettaglia ed adatta il disegno alle nuove informazioni che via via emergono e all'esperienza che matura sul sistema e sulle sue esigenze.
i principi del disegno valgono tanto per il disegno up-front che per il Refactoring.
Gli strumenti per fare disegno
Come si usano le schede CRC?
In quanti modi/notazioni si può definire il modello di un sistema?
UML
i concetti della notazione UML
che differenza c'è tra una aggregazione ed una composizione?
Riccardo Golia, MVP Solutions Architect, community manager di ASPItalia e socio di UGIdotNET, ha fondato insieme a LucaMinudel il [wiki] di UGIdotNET nel gennaio del 2005. E' uno dei curatori e supervisori di UGIdotNETWiki.
12/01/2006 22.34.37 - -87.2.179.115
Principio che promuove la semplicità del disegno del software.
24/04/2006 13.23.01 - LucaMinudel-193.42.138.33
General Responsability Assignment Software Patterns, ovvero i pattern relativi all'assegnazione delle responsabilità nell'ambito di una struttura ad oggetti.
28/03/2007 22.38.45 - 82.52.16.217
General Responsability Assignment Software Patterns, ovvero i pattern relativi all'assegnazione delle responsabilità nell'ambito di una struttura ad oggetti.
28/03/2007 22.38.45 - 82.52.16.217
Modelli per risolvere problemi ricorrenti e comuni di disegno del software ObjectOriented
25/06/2008 20.23.12 - Andrea Saltarello-213.156.52.112
Click to read this topic
11/12/2005 16.42.42 - LucaMinudel-151.47.148.27
Il principio di sostituzione di Liskov detto anche Liskov Substitution Principle.
19/09/2006 10.31.38 - LucaMinudel-193.42.138.37
Il principio Open Close di Bertrand Meyer.
10/08/2008 1.49.25 - -88.149.244.15
Il principio di inversione delle dipendenze detto anche Dependency Inversion Principle.
19/09/2006 10.30.56 - LucaMinudel-193.42.138.37
Il principio di singola responsabilità di una classe detto Single Responsibility Principle.
16/08/2008 1.44.24 - LucaMinudel
Refactoring, tecnica per ristrutturare una porzione di codice, alterandone la struttura senza modificarne il comportamento.
08/05/2007 13.18.07 - LucaMinudel-193.42.138.35
Refactoring, tecnica per ristrutturare una porzione di codice, alterandone la struttura senza modificarne il comportamento.
08/05/2007 13.18.07 - LucaMinudel-193.42.138.35
Refactoring, tecnica per ristrutturare una porzione di codice, alterandone la struttura senza modificarne il comportamento.
08/05/2007 13.18.07 - LucaMinudel-193.42.138.35
Refactoring, tecnica per ristrutturare una porzione di codice, alterandone la struttura senza modificarne il comportamento.
08/05/2007 13.18.07 - LucaMinudel-193.42.138.35
Riunione per individuare eventuali problemi nel disegno.
23/03/2006 12.42.41 - LucaMinudel-193.42.138.33
Elenco di criteri per valutare il disegno di una applicazione.
22/10/2007 7.48.03 - LucaMinudel-193.42.138.35
La Programmazione Object Oriented, cosa è e quali strumenti ha.
25/02/2007 14.30.54 - LucaMinudel-88.149.168.133
Cos'è una Architettura Object Oriented e come si definisce.
11/11/2007 20.02.49 - -88.149.247.101
I Processi di Sviluppo Software, cosa sono, quali sono, che scopo hanno.