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).