Was ist ein gutes Design, um die Abwärtskompatibilität eines Dateityps zwischen verschiedenen Softwareversionen zu ermöglichen?
Beispiel: Wie kann Microsoft Word 2007, 2010 und 2013 usw. in alle geöffneten DocX-Dateien übernehmen? Unterschiedliche Editionen können jedoch mehr oder weniger Daten speichern und die Daten auf leicht unterschiedliche Weise speichern, und zwar alle im selben Dateityp und a Datei, die in einer Version gespeichert ist, kann in einer anderen Version geöffnet werden, aber bestimmte Elemente der Datei sind in älteren Versionen möglicherweise nicht verfügbar?
Ich meine, der wirklich offensichtliche Weg ist, so etwas zu haben
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
.....
}
aber das scheint unglaublich monolithisch, nicht sehr erweiterbar und führt wahrscheinlich zu viel kopiertem / eingefügtem Code.
Daher habe ich mir überlegt, für alle Versionen eine Basisschnittstelle zu verwenden, die die unveränderlichen Strukturen definiert, z. B. den Header, die in der Datei vorhanden sein müssen, und Methoden, die für die Serialisierung / Deserialisierung verfügbar sein müssen, und dann jeweils eine Mehrfachvererbung Die Klasse der neuen Version, die die Schnittstelle implementiert, erbt die alte Version und überschreibt nur die Änderungen, da die Datei zum größten Teil identisch ist.
Die Struktur der Datei interessiert mich nicht wirklich, da bereits entschieden wurde, XML zu verwenden, und das anfängliche Schema im Großen und Ganzen bereits festgelegt ist. Es wird jedoch zweifellos in Zukunft Änderungen geben, und ich möchte den Code nur so gestalten können, dass diese Änderungen problemlos berücksichtigt werden können.
quelle
Antworten:
Vielleicht sehen Sie sich das PNG-Dateiformat an und wie es mit der Versionskompatibilität umgeht. Jeder Block hat eine ID, die beschreibt, um welche Art von Block es sich handelt, und einige Flags teilen der Software mit, was zu tun ist, wenn diese ID nicht verstanden wird. Zum Beispiel "Sie können die Datei nicht lesen, wenn Sie diesen Block nicht verstehen" oder "Sie können die Datei lesen, aber nicht ändern" oder "Sie können die Datei ändern, aber Sie müssen diesen Block löschen". Aus Gründen der Abwärtskompatibilität muss Ihre Software nur die Situation bewältigen, in der erwartete Daten nicht vorhanden sind.
quelle
Eine Möglichkeit hierfür ist die Verwendung einer Basisklasse und einer Schnittstelle mit den Grundfunktionen für Ihre Dateiverwaltung. Verwenden Sie dann Klassen für jede Version, die von der Basisklasse ausgeht, um alle versionsspezifischen Fälle zu behandeln. Funktionen, die sich ändern können, können in Ihrer Basisklasse von Abstract virtuell sein, wenn es nur versionsspezifische Implementierungen gibt. Wenn Sie eine Klasse zum Verarbeiten der Datei benötigen, verwenden Sie eine Factory, die die versionsspezifische Implementierung der Dateiverarbeitungsschnittstelle abruft.
quelle
Ich habe dies mit XML gemacht und es funktioniert gut:
Erlauben Sie einfach jedem Element in Ihrem Dokument, Attribute und Unterelemente zu haben (und wenn die Reihenfolge nicht wichtig ist - in beliebiger Reihenfolge). Ab der ersten Programmversion: Ignorieren Sie beim Lesen des Dokuments Attribute und Unterelemente, die Sie in der aktuellen Version nicht kennen.
Wenn Sie in Zukunft neue Funktionen zu einer neuen Programmversion hinzufügen, fügen Sie ein Attribut oder ein Unterelement hinzu. Ältere Versionen ignorieren dies. Die neue Version sollte die Dringlichkeit von Attributen oder Unterelementen prüfen und damit umgehen.
Zum Beispiel haben Sie einige Artikel mit Texten:
Und in einer neueren Version möchten Sie dem Element Farbe hinzufügen, damit Sie das Attribut hinzufügen
color
:In älteren Versionen werden
color
Attribute beim Öffnen des Dokuments einfach ignoriert . Neue Versionen prüfen, ob dascolor
Attribut vorhanden ist, und weisen die Standardfarbe zu.Mit dieser einfachen Lösung sind Sie sowohl vorwärts als auch rückwärts kompatibel.
quelle