Farklı yazılım sürümleri arasında dosyaların geriye dönük uyumluluğuna izin vermek için iyi bir tasarım nedir?


14

Bir dosya türünün farklı yazılım sürümleri arasında geriye dönük uyumluluğa izin vermek için iyi bir tasarım nedir?

Örneğin, microsoft 2007, 2010 ve 2013 vb. Kelimelerini tüm açık docx dosyalarına nasıl alır, ancak farklı sürümler daha fazla / daha az veri kaydedebilir ve verileri aynı dosya türüne, biraz farklı şekillerde kaydedebilir ve bir bir sürümde kaydedilen dosya başka bir sürümde açılabilir, ancak dosyanın belirli öğeleri eski sürümlerde bulunmayabilir mi?

Demek istediğim, bunu yapmanın en bariz yolu,

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
            .....
}

ancak bu inanılmaz derecede yekpare, çok genişletilemez ve çok sayıda kopyalanmış / yapıştırılmış koda yol açıyor gibi görünüyor.

Bu yüzden, başlıkta, dosyada bulunması gereken değişmez yapıları ve serileştirme / serileştirme için kullanılabilir olması gereken yöntemleri, ardından çoklu kalıtımları tanımlayan tüm sürümler için bir taban arayüzü kullanmayı düşünüyordum. arabirimi uygulayan yeni sürümün sınıfı eski sürümü devralır ve yalnızca dosya değiştiğinden çoğunlukla değişen şeyleri geçersiz kılar.

Dosyanın yapısı hakkında gerçekten rahatsız değilim, çünkü zaten XML kullanacağımıza karar verildi ve ilk şema genel olarak zaten karar verdi. Ancak hiç şüphesiz gelecekte değişiklikler olacak ve ben sadece kodu bu değişiklikleri kolaylaştıracak şekilde tasarlayabilmek istiyorum.


6
Dosya biçimini, yalnızca kaynak önceki bir sürümden olduğu için eksik olan bilgileri değil, aynı zamanda kaynak daha yeni bir sürümden olduğu için beklemediği bilgileri de göz ardı edecek şekilde tasarlamalısınız . Sıfırdan başlıyorsanız, lütfen lütfen ileri uyumluluğu da yapın. Neredeyse hiç çaba harcamadan ve yazılımınızın kullanışlılığını iki katına çıkarır.
Kilian Foth

Açık bir şekilde, hangi dosya sürümü ile uğraştığınızı her zaman ön tarafta (örn. Başlıktan) bilir misiniz? Ayrıca, başka bir istekte bulunmak için lütfen bozuk veya kötü amaçlı dosyaları kontrol edin ve sorunlara neden olmalarına izin vermeyin. Sistem yöneticileriniz size teşekkür edecek :).
cxw

1
Evet, sürüm numarası her zaman dosya üstbilgisinde olur ve üstbilgi biçimi hiçbir zaman değişmez. Küçük yazılım revizyonları arasında oluşturulan dosyaların uyumlu olması gerektiği fikrine devam ediyoruz, yani v1.1'de oluşturulan bir dosya v1.2'de açılabilir ve tersi de geçerlidir, ancak 1.2'deki bazı işlevler 1.1'de eksik olabilir, ancak büyük revizyonlar ileriye dönük uyumluluğu bozar, bu nedenle v2'de yazılmış şeyler v1'de açılmaz, ancak v1'de yazılmış şeyler v2'de açılır.
JJBurgess

Ve yolsuzluk konusuna gelince, dosyalar DSL içerir ve bunları açan / kapatan program özel bir kurum içi IDE / derleyicidir. Bunlar üretim ortamının yakınında hiçbir yere gitmeyecektir, bu nedenle yöneticinin endişelenmesine gerek yoktur.
JJBurgess

Yanıtlar:


10

PNG dosya biçimine ve sürüm uyumluluğunu nasıl ele aldığına bir göz atabilirsiniz. Her bloğun ne tür bir blok olduğunu açıklayan bir kimliği vardır ve yazılıma bu kimliği anlayamıyorsa ne yapması gerektiğini söyleyen bazı bayrakları vardır. Örneğin, "bu bloğu anlamıyorsanız dosyayı okuyamazsınız" veya "dosyayı okuyabilir ancak değiştiremezsiniz" veya "dosyayı değiştirebilirsiniz ancak bu bloğu silmeniz gerekir". Geriye dönük uyumluluk için, yazılımınızın beklenen veriler olmadığında durumu ele alması gerekir.


İyi fikir! PNG formatı sürümlere değil özelliklere dayanır. Bununla birlikte, temel formatın asla değişmemesi gerektiği anlamına gelir. (yani özelliği tanımlayan başlık.)
Florian Margaine

İlginç. Şu anda dosya spesifikasyonunu okuyorum. Kritik ve yardımcı parçalar fikrini seviyorum ve bunu deneyip çalışabilirim.
JJBurgess

3

Bunu yapmanın bir yolu, dosya işleme için temel işlevlere sahip bir temel sınıf ve arabirim kullanmak olabilir. Ardından, sürüme özel tüm durumları işlemek için temel sınıftan uzanan her sürüm için sınıfları kullanın. Yalnızca sürüme özgü uygulamalar varsa, soyut temel sınıfınızda değiştirebileceğiniz işlevler sanal olabilir. Dosyayı işlemek için bir sınıfa ihtiyacınız olduğunda, dosya işleme arabiriminin sürüme özgü uygulamasını sağlayan bir fabrika kullanın.


Bununla ilgili tek sorunum, sonraki her düzeltme için sürüme özgü uygulamayı çoğaltmanızdır. Üç temel sınıf yönteminiz olduğunu varsayalım: ReadNames (), ReadAges () ve ReadAddresses () ve sınıfın V2'sinde ReadAges () üzerinde değişiklik yaparsınız. V3'te, ReadNames () üzerinde değişiklik yapmaya karar verirsiniz, sürüme özgü tüm sınıflarınız tabandan devralıyorsa, V2 değişikliklerinizi kaybedersiniz veya V2'deki değişiklikleri kopyalamanız / yapıştırmanız gerekir V3 uygulamasına da dahil.
JJBurgess

1
Reaktiflerin uygulanması, bu sürüm için yaşların nasıl okunacağına ilişkin gerçek uygulamayı tutan farklı bir sınıfı çağırabilir. Sınıfınızı oluşturmak gerçek programlamadan daha fazla arayüz / fabrika konfigürasyonu olacaktır.
akran

2

XML ile bunu yaptım ve iyi çalışıyor:

Belgenizdeki herhangi bir öğenin, niteliklere ve alt öğelere sahip olmasına (ve sipariş önemli olmadığında - herhangi bir sırayla) izin vermeniz yeterlidir. Programın ilk sürümünden başlayarak - belgeyi okurken, geçerli sürümde bilmediğiniz nitelikleri ve alt öğeleri yok sayın.

Gelecekte, programın yeni sürümüne yeni bir özellik eklerken öznitelik veya alt öğe ekleyin. Eski sürümler bunu görmezden gelir. Yeni sürüm, öznitelik veya alt öğenin basıncını kontrol etmeli ve onunla baş etmelidir.

Örneğin, metin içeren bazı öğeleriniz var:

<item text="Hello, world!"/>

Ve yeni sürümde, öğeye renk eklemek istersiniz, böylece özellik eklersiniz color:

<item text="Hello, world!" color="008000"/>

Eski sürüm, colorbelge açılırken niteliği görmezden gelir. Yeni sürümler colorözniteliğin varlığını kontrol eder ve yoksa varsayılan renk atar.

Bu basit çözüm ile hem geriye hem de ileri uyumluluğa sahip olacaksınız.


"Basit" bir seçenek olarak bununla ilgili küçük bir sorun, belgeyi kaydederken tüm beklenmeyen nitelikleri kaldırmanız (veya değişmeden kalmanız). Diğer cevaplarda belirtildiği gibi, daha iyi bir çözüm, en azından bazı versiyonlarda, bir niteliğin düşürülmesi, saklanması veya belgenin onu anlamayan sürümler için salt okunur olmasına neden olup olmayacağını belirsiz bir şekilde belirler.
Mark Hurd

@Mark Hudr: Evet, sessizce geriye dönük uyumluluğun olması gerektiğini ve ileri uyumluluğun bonus olduğunu varsayıyorum. Birisi uygulamaların eski sürümünde yeni bir belge açtığında, kaydettiklerinde eski uygulamada görünmeyen bir şeyi kaybettiklerine şaşırmamalılar. Ek mantıklar bana göre ayarlanmış gibi görünüyor.
user3123061
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.