Sono alle prese con un progetto client-server in cui dispongo di app Java su Internet che memorizzano i dati su un server back-end. Il formato di questi dati è ben definito, ma il progetto è in continua evoluzione, quindi la definizione continua a cambiare! Per far fronte alla modifica ho definito una semplice interfaccia REST sul server che offre solo la memorizzazione dei valori-chiave. I client possono memorizzare o recuperare una porzione di dati facendo riferimento a una chiave univoca. Questo è utile perché non devo modificare l'interfaccia del server (o il database di back-end) quando il formato dei dati cambia. Al server, è solo un mucchio di blocchi opachi.
Ovviamente, il problema diventa, "Cosa entra nel blob?" Per questo ho scritto uno schema XML che definisce il contenuto di un blob. All'inizio è stato grandioso, dal momento che lo Schema offre un sacco di cose belle "gratis": una specifica formale del formato di file, la convalida automatica dei suoi contenuti, il marshalling / unmarshalling in un flusso e Java auto-generato classi per l'accesso programmatico ai dati.
Ma poi è successo il cambiamento! Lo schema doveva essere modificato, e naturalmente mi sono imbattuto in problemi di compatibilità in avanti e all'indietro. Per gestire lo Schema in continua evoluzione, ho trovato una soluzione che incorpora un numero di versione nello spazio dei nomi XML e applico una serie di fogli di stile XSL per "aggiornare" qualsiasi blob alla versione più recente. Ad esempio, ora sono sulla versione 1.3 del mio schema, quindi quando eseguo un blob unmarshal, lo eseguo tramite un XSLT 1.0-1.1, quindi un XSLT 1.1-1.2 e infine un 1.2-1.3 XSLT. Funziona, ma non è sostenibile perché la catena si allunga, il che riduce le prestazioni e risucchia la memoria, inoltre devo continuare a scrivere nuovi fogli di stile, che richiede tempo e non è divertente.
Ora ecco la cosa divertente ... Oltre ai client Java, il progetto ha anche app iOS come client, e iOS non ha nessuna delle belle funzionalità enterprise-y associate agli schemi XML. Non c'è convalida dello stream, nessuna generazione automatica di classi Objective-C, ecc., Solo un parser XML di basso livello basato sugli eventi. Ma ironicamente sto trovando questo così molto più facile! Ad esempio, se l'XML ottiene un nuovo elemento, aggiungo solo una nuova clausola if
. Se un elemento scompare, rimuovo la sua clausola. Fondamentalmente, faccio un "miglior sforzo" nell'interpretare il flusso XML, ignorando silenziosamente qualsiasi elemento non riconosciuto. Non ho bisogno di pensare a quale versione è il formato del file o se è valido. Inoltre, questo è molto più veloce perché non c'è il concatenamento XSLT, e risparmia un sacco di tempo perché non devo scrivere alcun codice XSLT.
Finora questo approccio ha funzionato alla grande, e non mi è mancato avere uno schema XML sul lato iOS. Ora mi sto chiedendo se uno Schema, nonostante il suo bel set di funzionalità, sia totalmente la tecnologia sbagliata per un formato di file che spesso cambia. Sto pensando di abbandonare del tutto il mio schema XML e di utilizzare lo stesso approccio a basso livello "best effort" in Java che sto facendo in iOS.
Quindi la mia valutazione negativa degli schemi XML è corretta? O c'è qualcosa che ho perso? Forse ho bisogno di rivedere l'interfaccia del server? O forse non avrei dovuto usare XML in primo luogo? Sono aperto a tutti i suggerimenti. Grazie per la lettura!