modulo 10 di 24 / Ore 21-40
Moduli 9-16 / Checkpoint 40 ore
Da oggetti di dominio a dati serializzabili
Capire che localStorage e JSON salvano dati serializzabili, non direttamente concetti di dominio, e preparare la conversione.
Da oggetti di dominio a dati serializzabili
Il dominio parla di concetti:
- strumento;
- prestito;
- stato;
- regola;
- errore.
localStorage e JSON parlano di dati serializzabili.
Questa differenza sembra piccola, ma e importante.
Quando salviamo, dobbiamo trasformare oggetti del nostro programma in dati che possono essere scritti come stringa.
Obiettivo
Alla fine devi capire:
- che cosa significa serializzare;
- perche localStorage salva stringhe;
- quali dati del dominio possono essere salvati direttamente;
- quali dati richiedono attenzione;
- perche introdurremo DTO e mapping.
Che cosa significa serializzare
Serializzare significa trasformare un dato in un formato salvabile o trasmissibile.
Nel browser, con JSON:
const testo = JSON.stringify(strumento);
Deserializzare significa fare il percorso inverso:
const strumento = JSON.parse(testo);
Il risultato di JSON.parse e un oggetto semplice.
Non e automaticamente un oggetto di dominio valido.
localStorage salva stringhe
Questo non funziona come molti pensano:
localStorage.setItem("strumento", strumento);
Perche localStorage salva stringhe.
Bisogna scrivere:
localStorage.setItem("strumento", JSON.stringify(strumento));
E leggere:
const strumento = JSON.parse(localStorage.getItem("strumento"));
Questo codice deve stare in Infrastructure.
Oggetto di dominio semplice
Nel nostro corso i modelli sono spesso oggetti semplici:
const strumento = {
id: "s-001",
nome: "Arduino Uno",
categoria: "microcontrollori",
stato: "disponibile",
};
Questo oggetto si serializza facilmente.
Ma non significa che tutto vada salvato senza controllo.
Il problema dei dati letti
Quando leggo da localStorage potrei trovare:
{
id: "s-001",
nome: "",
categoria: null,
stato: "rotto"
}
Oppure:
testo non JSON
Oppure dati vecchi:
{
id: "s-001",
label: "Arduino Uno",
type: "microcontrollori"
}
Il fatto che un dato sia salvato non significa che sia valido per il dominio.
Dato salvato e dominio
Per questo distinguiamo:
dato salvato
oggetto di dominio
Il dato salvato e la forma esterna.
L’oggetto di dominio e la forma che il resto dell’applicazione vuole usare.
Tra le due forme puo esserci una trasformazione.
Esempio
Dato salvato:
{
id: "s-001",
name: "Arduino Uno",
category: "microcontrollori",
status: "available"
}
Dominio:
{
id: "s-001",
nome: "Arduino Uno",
categoria: "microcontrollori",
stato: "disponibile"
}
Non sono uguali.
Serve mapping.
Quando sono uguali
Nella prima versione possiamo scegliere di salvare dati molto simili al dominio:
{
id: "s-001",
nome: "Arduino Uno",
categoria: "microcontrollori",
stato: "disponibile"
}
Va bene.
Pero e utile sapere che stiamo facendo una scelta.
Se in futuro cambia il formato salvato, non vogliamo rompere tutto il dominio.
Regola pratica
Quando salvi:
dominio -> dato serializzabile -> JSON string
Quando leggi:
JSON string -> dato serializzabile -> dominio
Infrastructure gestisce questa trasformazione.
Esercizio
Prendi un oggetto Strumento e scrivi:
# Strumento
## Forma dominio
## Forma JSON salvata
## Campi uguali
## Campi che potrebbero cambiare in futuro
## Rischi quando leggo il dato
Poi fai lo stesso con Prestito.
Cosa produrre
Alla fine della lezione devi avere:
- una spiegazione di serializzazione;
- esempi di dominio e dato salvato;
- lista dei rischi nella lettura da localStorage;
- nota sul perche serve mapping;
- scelta provvisoria sul formato JSON.
Spiegazione guidata per studiare
Questa lezione va studiata su due piani. Il primo è il comportamento visibile del Registro del laboratorio: che cosa vede o fa l’utente quando registra uno strumento, cerca un dispositivo, apre un prestito o segnala un guasto. Il secondo è il confine architetturale: dove deve stare il codice che rende possibile quel comportamento.
Per da oggetti di dominio a dati serializzabili, il punto centrale è questo: L’infrastruttura è il bordo tecnico: salva, legge, chiama API, usa localStorage o file JSON. È importante, ma deve restare sostituibile.
Il rischio tipico è far entrare il formato salvato dentro il dominio. Un oggetto comodo per localStorage non è automaticamente il modello con cui ragiona il progetto. Per evitarlo, non partire dal file che hai già aperto nell’editor. Parti dalla domanda: “quale responsabilità sto modificando?”. Se la risposta riguarda una regola del laboratorio, guarda il dominio. Se riguarda una sequenza di operazioni, guarda i casi d’uso. Se riguarda salvataggio, file, localStorage, API o database, guarda l’infrastruttura. Se riguarda input, pulsanti, form e messaggi, guarda la Presentation.
Il tempo è sufficiente per alternare spiegazione, modifica guidata e revisione. Alla fine della lezione lo studente non deve ricordare una definizione a memoria: deve saper indicare un punto del progetto, spiegare perché quel codice sta lì e mostrare una verifica del comportamento.
Passo per passo nel progetto
- Rileggi il titolo della lezione e riscrivilo come domanda pratica. Per esempio: “dove deve stare questa regola?”, “chi deve salvare questo dato?”, “come verifico questo errore?”.
- Apri solo i file necessari. Se devi toccare più di tre file, fermati e scrivi prima una mini-mappa.
- Distingui modello di dominio e formato salvato.
- Crea una funzione di mapping leggibile.
- Gestisci dati mancanti o non validi.
- Verifica che i casi d’uso non cambino quando cambi archivio.
- Aggiorna una nota breve nel README o negli appunti se hai cambiato un confine del progetto.
Esempio da leggere lentamente
Questo esempio serve a ragionare, non a incollare codice senza capire:
function strumentoToDTO(strumento) {
return {
id: strumento.id,
name: strumento.nome,
category: strumento.categoria,
status: strumento.stato
};
}
Leggilo chiedendoti che cosa cambierebbe se domani sostituissimo la pagina web con una CLI, oppure localStorage con un’API. Se l’esempio continua ad avere senso senza riscrivere tutto, il confine è probabilmente buono. Se invece un dettaglio tecnico si propaga in molti file, il progetto sta tornando fragile.
Prova di comprensione
Prima di chiudere la lezione, rispondi per iscritto a queste domande:
- Qual è la responsabilità principale trattata in questa lezione?
- In quale livello del progetto dovrebbe stare?
- Quale errore faresti se cercassi la soluzione più veloce?
- Quale piccolo test, controllo manuale o esempio dimostra che hai capito?
- Che cosa deve restare facile da cambiare dopo questa lezione?
Una risposta accettabile non deve essere lunga. Deve però usare parole concrete del Registro: strumento, prestito, stato, archivio, caso d’uso, messaggio, test.
Controllo finale
La lezione e completata quando puoi rispondere si:
- so che localStorage salva stringhe;
- so usare
JSON.stringifyeJSON.parse; - so che un dato letto non e automaticamente valido;
- so distinguere dato salvato e oggetto di dominio;
- so perche DTO e mapping saranno utili.
Nella prossima lezione salviamo e leggiamo strumenti da localStorage.