Apa desain yang baik untuk memungkinkan kompatibilitas mundur dari jenis file antara berbagai versi perangkat lunak?
Misalnya, bagaimana microsoft mendapatkan kata 2007, 2010 dan 2013 dll ... untuk semua file docx terbuka, tetapi edisi yang berbeda dapat menyimpan lebih banyak / lebih sedikit data dan menyimpan data dengan cara yang sedikit berbeda, semua untuk jenis file yang sama, dan file yang disimpan dalam satu versi dapat dibuka di yang lain, tetapi elemen-elemen tertentu dari file mungkin tidak tersedia di versi yang lebih lama?
Maksud saya, cara yang sangat jelas untuk melakukannya adalah memiliki sesuatu seperti
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
.....
}
tapi itu kelihatannya sangat monolitik, tidak terlalu bisa diperluas, dan cenderung mengarah ke banyak kode copy / paste.
Jadi saya berpikir untuk menggunakan antarmuka dasar untuk semua versi yang mendefinisikan struktur yang tidak dapat diubah, seperti header, yang perlu ada dalam file, dan metode yang perlu tersedia untuk serialisasi / deserialisasi, kemudian banyak pewarisan sehingga masing-masing kelas versi baru yang mengimplementasikan antarmuka mewarisi versi lama, dan hanya menimpa hal-hal yang telah berubah, karena file akan sama, sebagian besar.
Saya tidak terlalu peduli dengan struktur file, karena sudah diputuskan bahwa kita akan menggunakan XML, dan skema awalnya, pada umumnya, sudah diputuskan. Namun, tidak akan ada keraguan untuk mengubahnya di masa depan, dan saya hanya ingin dapat merancang kode dengan cara yang membuatnya mudah untuk mengakomodasi perubahan ini.
sumber
Jawaban:
Anda mungkin melihat format file PNG dan bagaimana menangani kompatibilitas versi. Setiap blok memiliki id yang menggambarkan jenis blok itu, dan memiliki beberapa tanda yang memberitahu perangkat lunak apa yang harus dilakukan jika tidak dapat memahami id itu. Misalnya "Anda tidak dapat membaca file jika Anda tidak memahami blok ini", atau "Anda dapat membaca file tetapi tidak memodifikasinya", atau "Anda dapat memodifikasi file tetapi Anda harus menghapus blok ini". Untuk kompatibilitas mundur, perangkat lunak Anda hanya perlu menangani situasi ketika data yang diharapkan tidak ada.
sumber
Cara melakukan ini bisa dengan menggunakan kelas dasar dan antarmuka dengan fungsi dasar untuk penanganan file Anda. Kemudian gunakan kelas untuk setiap versi yang memanjang dari kelas dasar untuk menangani semua kasus khusus versi. Fungsi yang dapat berubah bisa virtual di kelas dasar Anda abstrak jika hanya ada implementasi versi spesifik. Saat Anda membutuhkan kelas untuk menangani file, gunakan pabrik yang mendapatkan implementasi antarmuka antarmuka file versi khusus.
sumber
Saya telah melakukan ini dengan XML dan berfungsi dengan baik:
Cukup izinkan elemen apa pun dalam dokumen Anda, untuk memiliki atribut dan subelemen apa pun (dan bila pesanan tidak penting - dalam urutan apa pun). Mulai dari versi pertama program - saat membaca dokumen, abaikan atribut dan sub-elemen yang tidak Anda ketahui dalam versi saat ini.
Di masa mendatang ketika Anda menambahkan fitur baru ke versi program baru, kemudian tambahkan atribut atau sub-elemen. Versi yang lebih lama akan mengabaikannya. Versi baru harus memeriksa tekanan atribut atau sub-elemen dan menanganinya.
Misalnya Anda memiliki beberapa item dengan teks:
Dan di versi yang lebih baru Anda ingin menambahkan warna ke item sehingga Anda menambahkan atribut
color
:Versi yang lebih lama akan mengabaikan
color
atribut saat membuka dokumen. Versi baru memeriksa tekanancolor
atribut dan jika tidak ada menetapkan warna default.Dengan solusi sederhana ini Anda akan memiliki kompatibilitas mundur dan maju.
sumber