Che cos'è un buon design per consentire la retrocompatibilità di un tipo di file tra diverse versioni del software?
Ad esempio, come ottiene Microsoft Word 2007, 2010 e 2013 ecc. a tutti i file docx aperti, ma diverse edizioni possono salvare più / meno dati e salvare i dati in modi leggermente diversi, tutti con lo stesso tipo di file e un file salvato in una versione può essere aperto in un'altra, ma alcuni elementi del file potrebbero non essere disponibili nelle versioni precedenti?
Voglio dire, il modo davvero ovvio per farlo è avere qualcosa di simile
private string openfile(string filename)
{
File.Open(filename)
... some logic that gets a header from the file that will never change
switch (fileversion)
case 2007:
.....
case 2010
.....
case 2013
.....
}
ma sembra incredibilmente monolitico, non molto estensibile e probabilmente porterà a molto codice copia / incollato.
Quindi stavo pensando di usare un'interfaccia di base per tutte le versioni che definiscono le strutture immutabili, come l'intestazione, che devono essere presenti nel file, e i metodi che devono essere disponibili per la serializzazione / deserializzazione, quindi l'ereditarietà multipla in modo che ogni classe della nuova versione che implementa l'interfaccia erediti la vecchia versione e sostituisca solo le cose che sono cambiate, poiché il file sarà lo stesso, per la maggior parte.
Non mi preoccupo molto della struttura del file, dal momento che è già stato deciso che useremo XML, e lo schema iniziale è, in linea di massima, già deciso. Tuttavia, in futuro ci saranno senza dubbio delle modifiche ad esso, e voglio solo essere in grado di progettare il codice in un modo che faciliti l'adattamento di questi cambiamenti.