Qual é um bom design para permitir a compatibilidade com versões anteriores de um tipo de arquivo entre diferentes versões de software?
Por exemplo, como a Microsoft obtém o Word 2007, 2010 e 2013 etc ... para todos os arquivos docx abertos, mas edições diferentes podem salvar mais / menos dados e salvá-los de maneiras ligeiramente diferentes, tudo para o mesmo tipo de arquivo e um o arquivo salvo em uma versão pode ser aberto em outra, mas certos elementos do arquivo podem não estar disponíveis em versões mais antigas?
Quero dizer, a maneira realmente óbvia de fazer isso é ter 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
.....
}
mas isso parece incrivelmente monolítico, não muito extensível e provavelmente leva a muitos códigos copiados / colados.
Então, eu estava pensando em usar uma interface de base para todas as versões que definem as estruturas imutáveis, como o cabeçalho, que precisam estar presentes no arquivo e os métodos que precisam estar disponíveis para serialização / desserialização e, em seguida, herança múltipla para que cada A classe da nova versão que implementa a interface herda a versão antiga e substitui apenas as coisas que foram alteradas, já que o arquivo será o mesmo, na maior parte.
Não estou realmente preocupado com a estrutura do arquivo, pois já está decidido que usaremos XML, e o esquema inicial já está, em geral, decidido. No entanto, sem dúvida, haverá alterações no futuro, e eu só quero poder projetar o código de uma maneira que facilite a acomodação dessas alterações.