Qual è un buon design per consentire la retrocompatibilità di un tipo di file tra diverse versioni del software?
Ad esempio, in che modo Microsoft ottiene Word 2007, 2010 e 2013 ecc ... in tutti i file docx aperti, ma diverse edizioni possono salvare più / meno dati e salvare i dati in modi leggermente diversi, tutti nello stesso tipo di file e un il 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 più 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 questo sembra incredibilmente monolitico, non molto estensibile e probabilmente porta a un sacco di codice copiato / incollato.
Quindi stavo pensando di utilizzare un'interfaccia di base per tutte le versioni che definisce 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 la nuova classe di versione che implementa l'interfaccia eredita la vecchia versione e sovrascrive solo le cose che sono cambiate, poiché il file sarà lo stesso, per la maggior parte.
Non mi preoccupo molto della struttura del file, poiché è già deciso che useremo XML e lo schema iniziale è, in linea di massima, già deciso. Tuttavia, ci saranno senza dubbio modifiche in futuro, e voglio solo essere in grado di progettare il codice in modo da semplificare l'adattamento di queste modifiche.