Gli schemi XML sono negativi per i formati di file in costante evoluzione?

5

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!

    
posta vocaro 11.02.2012 - 02:47
fonte

1 risposta

8

Penso che tu stia davvero ponendo una domanda più ampia, "avere una definizione rigorosa di un formato di file è una buona cosa per un progetto in rapida evoluzione".

Per rispondere alla tua domanda immediata, però: sì, lo sono. Lo schema XML fornisce una definizione rigorosa del formato, risponde a molte domande sulla validità, fornisce un'eccellente documentazione e ti consente di sapere con certezza che una versione specifica del documento ha un modulo specifico.

Non sono l'essere-tutto e il tutto-fine, però: definiscono la struttura, non la semantica, quindi puoi ancora cambiare il "significato" di un tag tra la versione del documento senza dover cambiare lo schema. Ciò causa altrettanti problemi.

Per rispondere alla domanda penso che tu stia chiedendo: sì, lo schema XML è una buona cosa.

Ti costringe a far fronte a un fatto doloroso, che è il fatto che lo scambio di dati cambia continuamente versioni e questo significa che devi adattare il tuo sistema per renderlo conto.

Se hai solo il modello IOS, dove fai una "ipotesi approssimativa" su cosa significhi questa versione, alla lunga apri la porta a tutti i tipi di problemi. Ad esempio, diventa banale per qualcuno assumere che "l'elemento foo essere presente significa la versione 1.2, quindi tag bar significa ...".

È fantastico, fino alla versione 2.0 che aggiunge l'elemento foo, con un significato diverso, e la barra dei tag non è nemmeno lì. Benvenuto nella città del "comportamento incoerente".

Se usi XML senza schemi, o JSON, o qualcos'altro che non imponga quel costo su di te, solo una piccola parte del problema scompare. Devi ancora gestire tutte e quattro le versioni dell'input, ma hai meno strumenti per aiutarti.

A mio parere, dovresti generalmente preferire che il dolore dei cambiamenti sia proporzionale al loro costo reale a lungo termine. Cambiare il formato di scambio dei dati ha un costo elevato a lungo termine: devi fare i conti con la compatibilità, con gli aggiornamenti dei dati e questo genere di cose.

Se questo costa poco, sarai tentato di farlo molto, e poi pagherai i costi di manutenzione domani. Se costa più ora, potresti pensare più difficile: puoi fare più di una cosa in questo cambiamento? Puoi andartene senza di essa? Puoi farlo in modo più intelligente?

In breve, penso che il tuo vero problema sia che il tuo formato di file cambia spesso, non che tu abbia usato (o non usato) schemi XML.

(Inoltre, i tuoi utenti sono davvero felici se il server o il client rilasciano in modo casuale il contenuto rappresentato nella versione più recente? Sarei sorpreso se ciò restasse vero per sempre - un altro di quei costi a lungo termine che devi riconoscere da qualche parte .. .)

    
risposta data 11.02.2012 - 02:55
fonte

Leggi altre domande sui tag