Ideazione
...

L'ideazione è un piccolo passo verso la fase di elaborazione.

In questa fase viene fatta una visione approssimativa del progetto, uno studio economico, la portata, stime approssimative dei costi e dei tempi

L'ideazione è una fase breve.
In questa fase vengono iniziati una serie di elaborati che sono incompleti e che verranno arricchiti nel corso delle iterazioni successive, tra questi abbiamo:

  • modello dei casi d'uso
  • glossario
  • specifiche supplementari
  • visione

Il modello dei casi d'uso può elencare gran parte dei nomi inclusi nei casi d'uso e degli attori previsti, ma dettaglia solo il 5-10% di essi (espressi in forma testuale).

Distinguiamo:

  • requisiti funzionali: funzionalità del sistema disponibili per i suoi utenti
  • requisiti non funzionali: proprietà del sistema come sicurezza, scalabilità

In questa fase buona parte dei requisiti sono scritti in formato breve, solo circa il 5-10% in formato dettagliato nel corso delle iterazioni successive anche gli altri saranno scritti in formato dettagliato.

L'ideazione non è la fase dei requisiti

L'ideazione è un piccolo passo iniziale verso la fase di elaborazione

Fasi di UP
...

Non sfrutta un approccio a cascata che prevede di definire prima tutti i requisiti per poi passare alla progettazione completa

In generale, gli elaborati di UP, non servono solo per produrre documentazione, ma per comprendere il progetto in maniera più approfondita. Il contenuto dei documenti inizialmente è approssimativo, nel corso del tempo e iterativamente essi diventano più precisi.

Elaborazione
...

In questa fase viene avviene un'analisi più approfondita del progetto, si implementa iterativamente il nucleo dell'architettura, avviene la risoluzione dei rischi maggiori, identificazione della maggior parte dei requisiti e della portata, si hanno stime più realistiche riguardo tempo e costi

L'elaborazione è la serie iniziale di iterazioni durante le quali:

  • viene programmato e verificato il nucleo, rischioso, dell'architettura
  • vengono scoperti e stabilizzati la maggior parte die requisiti (90-100%)
  • i rischi maggiori sono attenuati

Elaborati dell'elaborazione:

  • modello di dominio: dizionario visuale del dominio (reale, concettuale) di interesse, SSD e contratti delle operazioni
  • modello di progetto: diagrammi di classi software (DCD) e diagrammi di interazione tra le classi (DSD)
  • modello dei dati: schemi di basi di dati, ...
  • documento sull'architettura software: aspetti principali dell'architettura e la loro risoluzione

Gli SSD sono un input per i contratti delle operazioni.
Le operazioni di sistema indicati negli SSD con le frecce verso il sistema, non sono metodi.
Un'operazione è una trasformazione o interrogazione che un elemento può essere chiamato a svolgere, un'operazione di sistema è una trasformazione o interrogazione che il sistema è chiamato a svolgere.
Gli eventi che solleciteranno il sistema sono:

  • eventi esterni (da attori umani o altri sistemi)
  • eventi temporali
  • guasti o eccezioni

Il modello di dominio e gli SSD sono input per i contratti delle operazioni.
I contratti non mostrano come viene raggiunto un risultato (post-condizione), ma mostrano semplicemente i cambiamenti di stato relativamente a oggetti concettuali: creazione di questi, formazione o rottura di collegamenti (rispetto al modello di dominio) e attributi modificati.

Costruzione
...

Si implementano iterativamente gli elementi rimanenti, a questo punto essi sono quelli più facili e a rischio minore. Ci si prepara al rilascio.

Transizione
...

Beta test e rilascio.

Altro da sapere
...

Extreme programming (XP) e test
...

XP ha promosso la pratica dei test: scrivere i test per primi. Tale pratica è applicabile a UP. Lo sviluppo è guidato dai test (Test Drive Development - TDD): si scrivono i test come se il codice da testare fosse già stato scritto. Il TDD prevede l'uso di diversi tipi di test:

  • Test unitari: hanno lo scopo di verificare il funzionamento di piccole parti del sistema, ma non di verificare il sistema nel complesso.
  • Test di integrazione: per verificare la comunicazione tra specifiche parti del sistema
  • Test end-to-end: per verificare il collegamento complessivo tra tutti gli elementi del sistema.
  • Test di accettazione: hanno lo scopo di verificare il funzionamento complessivo del sistema, con riferimento a scenari di casi d'uso del sistema.

I test unitari sono composti da quattro parti:

  • preparazione: crea l'oggetto (o il gruppo di oggetti) da verificare (fixture) e prepara altri oggetti e/o risorse necessari per l'esecuzione del test;
  • esecuzione: fa fare qualcosa alla fixture, viene richiesto lo specifico comportamento da verificare;
  • verifica: valuta che i risultati ottenuti corrispondano a quelli previsti;
  • rilascio: opzionalmente rilascia o ripulisce gli oggetti e/o le risorse utilizzate nel test (per evitare la corruzione di altri test).

XP ha promosso inoltre il refactoring continuo del codice per migliorare la qualità: meno duplicazione, maggiore sicurezza, ecc..
Dopo ciascuna trasformazione, dovuta a refactoring, i test unitari vengono nuovamente eseguiti, per verificare che la modifica non abbia avuto alcun impatto sul sistema.

Altro da sapere
...

GoF preferisce la composizione rispetto all'ereditarietà tra classi
...

Ereditarietà:

  • definizione di un oggetto in termini di un altro
  • riuso white-box: la visibilità della superclasse è la visibilità della sottoclasse (la sottoclasse può accedere a dettagli implementativi della superclasse
  • non è modificabile a tempo di esecuzione
  • una modifica alla superclasse potrebbe avere ripercussioni indesiderate sul funzionamento di una sottoclasse

Composizione di oggetti:

  • le funzionalità sono ottenute assemblando o componendo gli oggetti per avere funzionalità più complesse
  • riuso black-box: i dettagli interni sono sconosciuti
  • se una classe usa un'altra classe, questa potrebbe essere referenziata attraverso una interfaccia, a runtime potrebbe essere una qualsiasi altra classe che implementa l'interfaccia
  • la composizione attraverso un'interfaccia rispetta l'incapsulamento, solo una modifica all'interfaccia comporterebbe ripercussioni

L'ereditarietà può creare specializzazione (la classe figlia guadagna elementi e proprietà rispetto la classe base): è sconsigliata dai GoF.
I GoF utilizzano l'ereditarietà per creare polimorfismo e non specializzazione.