¿Qué es un buen diseño para permitir la compatibilidad con versiones anteriores de un tipo de archivo entre diferentes versiones de software?
Por ejemplo, ¿cómo Microsoft obtiene Word 2007, 2010 y 2013, etc ... para todos los archivos docx abiertos, pero diferentes ediciones pueden guardar más / menos datos y guardar los datos de maneras ligeramente diferentes, todas al mismo tipo de archivo? ¿Y un archivo que se guarda en una versión puede abrirse en otra, pero ciertos elementos del archivo pueden no estar disponibles en versiones anteriores?
Quiero decir, la forma realmente obvia de hacerlo es tener algo como
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
.....
}
pero eso parece increíblemente monolítico, no muy extensible, y es probable que conduzca a una gran cantidad de código copiado / pegado.
Estaba pensando en utilizar una interfaz base para todas las versiones que define las estructuras inmutables, como el encabezado, que deben estar presentes en el archivo, y los métodos que deben estar disponibles para la serialización / deserialización, y luego la herencia múltiple. de modo que cada clase de nueva versión que implementa la interfaz hereda la versión anterior y solo reemplaza las cosas que han cambiado, ya que el archivo será el mismo, en su mayor parte.
Realmente no me preocupa la estructura del archivo, ya que ya se decidió que usaremos XML, y el esquema inicial es, en general, ya decidido. Sin embargo, no habrá duda de que habrá cambios en el futuro, y solo quiero poder diseñar el código de una manera que facilite la adaptación a estos cambios.