modulo 16 di 24 / Ore 21-40
Moduli 9-16 / Checkpoint 40 ore
Preparare spiegazione delle scelte architetturali
Costruire una spiegazione chiara e strutturata delle scelte architetturali del Registro: cosa è stato deciso, perché, e quali conseguenze ha avuto sul progetto.
Preparare spiegazione delle scelte architetturali
Questa lezione appartiene al Modulo 16 — Progetto finale completo.
Cosa significa spiegare le scelte architetturali
Spiegare l’architettura non significa descrivere ogni file. Significa rispondere a tre domande:
- Cosa hai deciso (struttura del progetto, separazione dei livelli, scelta dell’archivio)
- Perché lo hai deciso (il problema che risolveva, l’alternativa scartata)
- Quali conseguenze ha avuto (cosa è diventato più facile, cosa è rimasto difficile)
Una buona spiegazione architetturale è verificabile: chi la ascolta dovrebbe riuscire a trovare nel codice la prova di ciò che viene descritto.
Le tre scelte architetturali principali del Registro
Per la presentazione finale, prepara una spiegazione per ognuna di queste tre scelte:
Scelta 1: separazione dei quattro livelli
Cosa: il progetto è diviso in quattro cartelle — domain, application, infrastructure, presentation.
Perché: ogni livello ha una responsabilità diversa. Il dominio non sa dove
vengono salvati i dati. I casi d'uso non sanno come viene mostrata la UI.
Questa separazione permette di testare le regole senza browser e di
cambiare l'archivio senza toccare le regole.
Conseguenze: aggiungere un nuovo stato a StatoStrumento richiede di toccare solo
domain/strumento.js — non la UI, non l'archivio.
Passare da localStorage a un'API richiede di scrivere un nuovo adapter
in infrastructure/ — non modificare registraPrestito.
Scelta 2: archivio come dipendenza esplicita
Cosa: i casi d'uso ricevono l'archivio come parametro — non lo costruiscono internamente.
Perché: se il caso d'uso costruisse l'archivio internamente (new LocalStorageArchivio()),
sarebbe impossibile testarlo senza localStorage. Passandolo come dipendenza,
nei test si usa un archivio in memoria — veloce, senza side effect.
Conseguenze: creaRegistraPrestito({ archivioStrumenti, archivioPrestiti }) permette
di sostituire entrambi gli archivi in un unico punto — main.js.
Scelta 3: errori come codici, messaggi nella Presentation
Cosa: il dominio e i casi d'uso lanciano errori con codici (STRUMENTO_NON_TROVATO).
La Presentation traduce i codici in messaggi comprensibili per l'utente.
Perché: se il dominio lanciasse "Strumento non trovato.", non si potrebbe cambiare
il testo senza toccare il dominio. Con i codici, il testo cambia solo
nella Presentation — il dominio rimane stabile.
Conseguenze: aggiungere una lingua diversa (es. inglese) richiede di aggiornare
solo il dizionario dei messaggi nella Presentation.
Come presentare una scelta architetturale oralmente
Struttura in tre frasi:
"Abbiamo deciso di [cosa].
Lo abbiamo fatto perché [problema che risolveva / alternativa scartata].
La conseguenza pratica è che [cosa è diventato più facile]."
Esempio:
"Abbiamo deciso di tenere il dominio separato da localStorage.
Lo abbiamo fatto perché se il dominio chiamasse localStorage direttamente,
non potremmo testarlo senza un browser e non potremmo cambiare archivio senza
riscrivere le regole.
La conseguenza pratica è che i test del dominio funzionano con oggetti in memoria
— non serve avviare il browser per verificare che uno strumento guasto non possa
essere prestato."
Come dimostrare la scelta nel codice
Ogni scelta deve avere una prova nel codice. Prepara per la presentazione:
| Scelta | Dove si vede nel codice |
|---|---|
| Dominio separato da localStorage | domain/strumento.js non importa nulla — nessun import esterno |
| Archivio come dipendenza | creaRegistraPrestito({ archivioStrumenti, archivioPrestiti }) in application/ |
| Errori come codici | throw new Error("STRUMENTO_NON_TROVATO") nel caso d’uso, dizionario in presentation/ |
| Test senza browser | file di test che usa creaArchivioStrumentiInMemoria() |
Durante la presentazione: apri il file, indica la riga, spiega cosa dimostra.
Prepara la spiegazione per ogni scelta
Usa questo schema per ognuna delle tre scelte:
SCELTA: [nome breve]
DOVE SI VEDE: [file:riga o nome della funzione]
COSA: [una frase]
PERCHÉ: [una frase — il problema risolto]
CONSEGUENZA: [una frase — cosa è diventato più facile]
LIMITE: [una frase — cosa è rimasto difficile o non risolto]
Procedura guidata
- Leggi le tre scelte architetturali principali sopra.
- Per ognuna: trova nel tuo codice il punto che la dimostra (file e riga).
- Scrivi la spiegazione in tre frasi (cosa, perché, conseguenza).
- Prova a spiegarla a un compagno in 60 secondi — senza leggere le note.
- Se il compagno non capisce la conseguenza, la spiegazione è troppo astratta.
Attività in classe
## Spiegazione delle scelte architetturali
Scelta 1 — Separazione dei quattro livelli:
- Dove si vede nel codice:
- Cosa:
- Perché:
- Conseguenza:
- Limite:
Scelta 2 — Archivio come dipendenza esplicita:
- Dove si vede nel codice:
- Cosa:
- Perché:
- Conseguenza:
- Limite:
Scelta 3 — Errori come codici:
- Dove si vede nel codice:
- Cosa:
- Perché:
- Conseguenza:
- Limite:
Prova orale (60 secondi per scelta): eseguita con [nome compagno]
Feedback ricevuto:
Spiegazione guidata per studiare
Una spiegazione architetturale è convincente quando è verificabile. Non basta dire “il dominio è separato dall’infrastruttura” — bisogna poter aprire un file e mostrarlo.
Il punto centrale è: ogni scelta ha una prova nel codice. Se non riesci a trovare la prova, o la scelta non è stata implementata davvero, o la spiegazione è troppo astratta.
Il rischio tipico è descrivere l’architettura come si vorrebbe che fosse, non come è effettivamente. Prima della presentazione, verifica che ogni scelta descritta abbia un corrispondente nel codice. Se non ce l’ha, o la descrizione è sbagliata o il codice è incompleto.
Passo per passo nel progetto
- Apri
domain/strumento.js— importa qualcosa dainfrastructure/o dalocalStorage? Se sì, c’è un problema da correggere prima della presentazione. - Apri un caso d’uso — riceve l’archivio come parametro o lo costruisce internamente? Se lo costruisce internamente, c’è una dipendenza nascosta.
- Cerca
throw new Error(nei casi d’uso — i messaggi sono codici (STRUMENTO_NON_TROVATO) o frasi in italiano ("Strumento non trovato")? - Per ogni problema trovato: correggilo prima della presentazione.
Esempio da leggere lentamente
Spiegazione della scelta "dominio separato da localStorage" — versione corretta:
"Nel nostro Registro, le funzioni in domain/strumento.js non chiamano mai localStorage.
Questo significa che possiamo testare tutte le regole di prestabilità — strumento guasto,
strumento già in prestito — usando solo oggetti JavaScript in memoria, senza avviare
il browser. La separazione è visibile in domain/strumento.js: il file non ha nessun
import esterno. L'unico limite è che la coerenza tra lo stato dello strumento e i
prestiti aperti non è garantita atomicamente — se il salvataggio del prestito riesce
ma quello dello strumento fallisce, i dati diventano incoerenti."
Questa spiegazione ha: cosa (nessuna chiamata a localStorage), perché (testabilità), prova (nessun import), limite (coerenza non atomica). È completa.
Prova di comprensione
- Riesci a spiegare la scelta “archivio come dipendenza” in 60 secondi?
- Dove nel tuo codice si vede che il dominio non usa localStorage?
- Qual è il limite principale della tua implementazione attuale?
Errori da evitare
- descrivere scelte architetturali che non sono state implementate (es. “il dominio è puro” quando in realtà ha una chiamata a localStorage);
- spiegare l’architettura senza mostrare il codice — è solo teoria;
- non menzionare i limiti — ogni scelta ha un trade-off, nominarli è un punto di forza, non di debolezza;
- usare termini tecnici senza definirli per l’audience (es. “dependency injection” senza spiegare cosa significa).
Prodotto da consegnare
Può essere:
- la scheda compilata con le tre spiegazioni (cosa, perché, conseguenza, limite, prova nel codice);
- una prova orale di 3 minuti registrata o eseguita davanti al docente;
- una sezione “Scelte architetturali” nel README con le tre spiegazioni.
Checklist di chiusura
- Ho trovato nel codice la prova di ognuna delle tre scelte architetturali
- So spiegare ogni scelta in 60 secondi con: cosa, perché, conseguenza
- Ho nominato almeno un limite per ogni scelta
- Ho provato la spiegazione oralmente con un compagno
- Il README ha una sezione sulle scelte architetturali
Domande per la revisione
- Il compagno ha capito le conseguenze pratiche delle scelte? Se no, cosa andava chiarito?
- Hai trovato una scelta descritta ma non implementata nel codice?
- Quale dei tre limiti nominati è il più importante da risolvere in una versione futura?
Risultato atteso
Alla fine lo studente deve saper dire:
La scelta architetturale principale del mio Registro è [X].
Si vede in [file:funzione].
L'ho fatta perché [problema risolto].
La conseguenza è che [cosa è diventato più facile].
Il limite principale è [cosa è rimasto difficile].
Se questa spiegazione non è possibile, la lezione non è ancora davvero conclusa.