Quelle est la bonne conception pour permettre la rétrocompatibilité d'un type de fichier entre différentes versions de logiciel?
Par exemple, comment Microsoft obtient-il Word 2007, 2010 et 2013, etc. dans tous les fichiers docx ouverts, mais différentes éditions peuvent enregistrer plus / moins de données et enregistrer les données de manières légèrement différentes, toutes dans le même type de fichier, et un le fichier enregistré dans une version peut être ouvert dans une autre, mais certains éléments du fichier peuvent ne pas être disponibles dans les anciennes versions?
Je veux dire, la façon vraiment évidente de le faire est d'avoir quelque chose comme
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
.....
}
mais cela semble incroyablement monolithique, peu extensible et susceptible de conduire à beaucoup de code copié / collé.
Je pensais donc à utiliser une interface de base pour toutes les versions qui définit les structures immuables, telles que l'en-tête, qui doivent être présentes dans le fichier, et les méthodes qui doivent être disponibles pour la sérialisation / désérialisation, puis l'héritage multiple afin que chaque La classe de la nouvelle version qui implémente l'interface hérite de l'ancienne version et ne remplace que les éléments qui ont changé, car le fichier sera le même, pour la plupart.
Je ne suis pas vraiment dérangé par la structure du fichier, car il a déjà été décidé que nous utiliserons XML, et le schéma initial est, dans l'ensemble, déjà décidé. Cependant, il y aura sans aucun doute des modifications à l'avenir, et je veux juste être en mesure de concevoir le code d'une manière qui facilite la prise en compte de ces modifications.