Qual è un buon modo per assicurarsi che i dati serializzati localmente possano essere deserializzati nel codice più recente?

3

Contesto: sto lavorando a un gioco HTML 5 senza stato persistente. Ogni volta che aggiorni la pagina, inizi dall'inizio. Le persone chiedono di poter iniziare da dove si sono interrotte se lasciano la pagina. Ho intenzione di implementarlo come Storage locale . La cosa che rende preoccupante questo è un nuovo tipo di bug che dovrò considerare: se torni indietro e c'è un codice più recente, potrebbe non essere possibile deserializzare lo spazio di archiviazione.

Ad esempio, lo stato della serializzazione potrebbe essere simile a questo:

{
  foo: "bar"
}

Ma quando il giocatore tenta il gioco il mese prossimo, quel campo non esiste più ed è stato suddiviso in due campi con un tipo completamente diverso.

Questo è destinato a succedere, e penso di sapere come risolvere il problema: inserirò un numero di versione nei dati e quando rilascerò la versione y dell'app, dovrò scrivere codice per migrare da versione x stato in versione y stato. Se rilascio la versione z dell'app, dovrò scrivere codice per migrare dalla versione y alla versione z. Probabilmente chiamerò questa logica dopo la deserializzazione.

Ma non è questa la domanda (anche se c'è un difetto nel mio approccio, vorrei sentirlo). Quello che voglio sapere è: Come automatizzo qualcosa (possibilmente un test) che mi dice quando ho bisogno di scrivere uno script di migrazione e quando ho bisogno di cambia il numero di versione dei dati?

Credo che l'automazione sia la chiave qui, perché le cose andranno molto male se commetto un errore e ricordarmi di cambiare un numero di versione / scrivere un file di migrazione sarà l'ultima cosa che mi verrà in mente quando ho appena finito quella nuova brillante funzionalità Voglio che gli altri vedano.

Una realizzazione interessante (ma forse irrilevante): tutti questi problemi scompaiono se immagazzino i dati sul mio server in un database con uno schema. Ciò mi consente di sapere con sicurezza che tutti i dati sono nello stato giusto (se il mio schema è buono). Il problema con la persistenza locale è che perdo il controllo dei dati e quando viene migrato.

Questa domanda è simile ma diversa da questo . La differenza è che mi preoccupo principalmente dell'automazione e lui / lei non lo è e stiamo usando linguaggi diversi (vedere come la risposta accettata è una libreria Java, che rende irrilevante per me).

    
posta Daniel Kaplan 07.07.2014 - 18:58
fonte

2 risposte

4

How do I automate something (possibly a test) that tells me when I need to write a migration script and when I need to change the data's version number?

Quando i test dell'unità automatizzati falliscono durante l'importazione di vecchi dati in un modello più recente, questo è un indicatore molto chiaro che devi scrivere uno script / processo di migrazione.

    
risposta data 07.07.2014 - 19:23
fonte
4

Ogni volta che apporti una modifica al codice che tocca la tua serializzazione, devi aggiungere un nuovo test case nella tua suite di test automatizzata che usa i nuovi campi, o legge i vecchi campi, ecc. Col tempo accumulerai sempre più copertura per le transizioni di versione. Finché esegui la tua suite di test ogni volta che apporti delle modifiche, riceverai una notifica quando smetti di leggere qualcosa che ha funzionato.

    
risposta data 07.07.2014 - 19:33
fonte

Leggi altre domande sui tag