Önemli bir hatayı giderirken anlamsal sürüm oluşturma


18

Şu anda çok fazla kamusal kullanımı olan bir kütüphaneyi yönetiyorum ve semantik versiyonlama hakkında bir sorum vardı . Kütüphanenin yanlış uygulanmış ve her zaman yanlış uygulanmış oldukça önemli bir bölümünü yeniden gözden geçirmek istiyorum. Ancak bunu yapmak, büyük bir karar olan genel API'de değişiklikler anlamına gelir.

Yapmak istediğim değişiklik yineleyicilerin nasıl kullanıldığı hakkında. Şu anda, kullanıcılar bunu yapmak zorundadır:

while ($element = $iterator->next()) {
   // ...
}

Bu yanlış, en azından PHP'nin yerel Iterator arabiriminde . Bununla değiştirmek istiyorum:

while ($iterator->valid()) {
   $element = $iterator->current();
   // ...
   $iterator->next();
}

aşağıdakilere benzer:

foreach ($iterator as $element) {
    // ...
}

Eğer semantik sürüm için Tom'un kılavuzunda bakarsak, o açıkça kamu API herhangi bir değişiklik (yani olanlar belirtiyor değil geriye dönük olarak uyumlu), büyük bir tahliyesini haklı gerekir. Kütüphane 1.7.3'ten 2.0.0'a atlayacaktı ki bu benim için çok uzak bir adım. Sadece bir özelliğin düzeltildiğinden bahsediyoruz.

Sonunda 2.0.0 yayımlamayı planlıyorum, ancak kütüphaneyi tamamen yeniden yazdığınızda ve çok sayıda genel API değişikliği uyguladığınızda bunun olduğunu düşündüm . Bu yeniden düzenlemenin tanıtımı büyük bir sürüm sürümü gerektiriyor mu? Gerçekten nasıl olduğunu göremiyorum - 1.8.0 veya 1.7.4 olarak serbest bırakmaktan daha rahat hissediyorum. Kimsenin tavsiyesi var mı?


Geriye dönük uyumluluğu korumanıza ne engel olur?
mouviciel

Şu anda, next()yöntem geçerli elemanı almak VE dahili işaretçiyi ileriye taşımak için kullanılır. Hangisi yanlış. next()işaretçiyi hareket etmeli ve current()almak için kullanılır ...
hohner

6
Bu yüzden yeni sürümde insanlar next()sadece işaretçiyi hareket ettiren dönüş değerini önemsememelidir , bu gerçekten uyumluluğu bozmaz
cırcır ucube

Yanıtlar:


29

Tereddüt ediyorsun çünkü anlamsal versiyonlama yapmak istemiyorsun, "reklam destekli versiyonlama" yapmak istiyorsun. "2.0" sürüm numarasının dünyaya, API'nızı değiştirdiğinizi değil, kitaplığınızda bir sürü yeni harika özelliğe sahip olduğunuzu söylemesini beklersiniz. Sorun değil (birçok yazılım şirketi ve / veya geliştirici bunu yapıyor). IMHO aşağıdaki seçeneklere sahiptir:

  • anlamsal sürümlemeye sadık kalın ve sürüm numarasını 2.0.0 olarak değiştirmeniz gerektiği gerçeğini yaşayın
  • sürüm düzeninizi 4 sayı olarak değiştirin. "1.1.7.3" şu anki sürümünüz, API değiştirildikten sonraki "1.2.0.0" ve "tamamen yeni 2.x ürün ailesinin" ilk sürümü "2.0.0.0"
  • düzeltmenizi geriye doğru uyumlu hale getirin (işlevini değiştirmeyin next, yalnızca validve currentişlevlerini ekleyin ). Sonra bir sonraki sürüm numarası olarak "1.8.0" kullanabilirsiniz. Davranışını değiştirmenin nextgerçekten önemli olduğunu düşünüyorsanız , bunu 2.0.0'da yapın.

Son seçenek mükemmel bir çözüm olabilir: next()ne yaptığını yapmaya devam edemezsiniz . İşlevi doğru bir şekilde uygulamak için farklı bir şey yapması gerekir. Bu yüzden geriye doğru uyumlu hale getirirsem - yeni işlevsellik / düzeltme de yanlış olur ve değişikliğin tüm noktasını zayıflatır.
hohner

2
Üçüncü merminizde (düzeltmeyi geriye dönük olarak uyumlu hale getirmek) yaptığınız daha geniş öneri dikkate alınması gereken iyi bir şeydir. Bu özel durumda çalışmayabilir, ancak genel teknik dikkate değer. İşlev daha karmaşık hale gelir, ancak bu uygulanabilir bir rota olabilir.

Herkese teşekkürler: Eğer ikisini kabul edebilseydim yapardım. next()Tüm yeni işlevleri yapmak için yeni yöntemi hackledim , ayrıca geriye dönük olarak uyumlu hale getirmek için gerekli olanı. Bunun gibi yeni işlevleri karartmak korkunç bir şey ama hey ho.
hohner

10
@hohner: O zaman şimdi eski davranışı kullanımdan kaldırılmış olarak belgeleme zamanı geldi, böylece 2.0.0'da kaldırabilirsiniz.
Jan Fabry

7

Tom'un semantik versiyonlama kılavuzuna sadık kalın.

Bir kamu API Herhangi önemli bir değişiklik gerekir iki nokta birini yapılabilir:

  1. Asla
  2. Büyük bir sürüm güncellemesinde

Bu arada benim oyum birincisi. Ama bunun sadece bir şeyleri önemsemeye uygun olduğunu kabul ediyorum.

Sorun geriye dönük uyumluluğu korumak ve API'nizin önceki kullanıcıları için bir şeyleri kırmamanızı sağlamaktır.

Özünde, değişikliğin farkında olmayan kullanıcılarınız için bir dizin oluşturma hatası oluşturuyorsunuz. Böyle bir değişikliği zorlamak, tüm kullanıcılarınızı aşağıdakileri yapmaya zorlar:

  1. Yeni yaklaşımı kullanmak için düzeltmeyi kodlayın
  2. Düzeltmeyi doğrulayın ve hiçbir şeyi bozmadığından emin olun
  3. Ürünlerinin yeni sürümlerini son kullanıcılarına gönderin

Bu, özellikle bu gibi değişiklikleri doğrulamak için ne kadar az projenin test senaryosu olduğunu düşündüğünüzde çok fazla çaba harcayabilir. Kullanıcılarınızdan, kurulumlarını da güncellemeleri gereken alt kullanıcı sayısını düşündüğünüzde çaba miktarı artar.

Bu kadar küçük bir şey için, gitmesine izin verdim ve onunla uğraşmam.
Eğer gerçekten rahatsız (ki görünüşe göre yapar ya da sen-cekti istemek) o zaman ben aşağıdakileri yapardı.

  1. Kod ağacınızda v2.0.0 dalını oluşturun
  2. Bu değişiklik olan v2.0.0 şubesine ilk katkıyı yapın
  3. Release NotesDeğişikliğin geldiğini yayınlamak için önceden bir önizleme gönderin

Ve sonra sürüm numarasını yeni bir büyük sürüme yükseltmeyi haklı kılan diğer şeyleri biriktirmek biraz zaman alacağından sabırlı olun. Gelişmiş bildirim (bölüm 3), değişikliğin ne kadar etkili olacağını bulmak için son kullanıcılardan geri bildirim almanız için size zaman tanır.


Alternatif bir çözüm, istediğiniz şekilde çalışan yeni bir işlev eklemektir.

Varsa , düzeltmeyi sağlamak için foo()oluşturursunuz fooCorrect(), aynı zamanda geriye dönük uyumluluğu da tamamen korursunuz. Ve bir noktada foo()başkalarının onu kullanmamasını bilmesine izin vermeyebilirsiniz .

Meydan göreceksiniz ki doğası vardır başka bir şey içinde fooCorrect()hangi gerektirmektedir 's güncelleme ve ne kadar son fooCorrectedCorrect()veya başka saçma saçma.

Bunun gerçekten düzeltilmesini istiyorsanız , bu alternatif yaklaşım muhtemelen en iyi yoldur. API'nın çalışmasını zorlaştırdığı için bu şekilde birçok ek işlev oluşturmanın farkında olun ve bu konuda dikkatli olun. Ve bu farkındalık bu tür problemlerin en kötüsünü önlemek için yeterli olabilir.

Ancak bu, küçük bir şeyi düşünmek için "en az kötü" yaklaşım olabilir.


Size katılıyorum. Karşılaştığım sorun tamamen kütüphaneyi v2.0.0 için yeniden yazmak istiyorum (çünkü düzeltilmesi gereken bu sorunların birçoğu var ); dolayısıyla yineleyiciler bu büyük değişimin temelini oluşturacak kadar küçük bir değişiklik istemiyorum. Yani seçeneklerim ya: Bu hatayı yoksay ya da düzelt ve yeni bir büyük sürüme mi koyuyorsun?
hohner

@hohner - yeni işlevler oluşturmada alternatif bir yaklaşım sağlamak için cevap güncellendi. Yeni, benzer biçimde adlandırılmış fonksiyonları çok olduğunu dikkatli olun neredeyse API üzerinde değişiklik kadar kötü.

3
@hohner: Bu durumda sürekli yanlış> tutarsız bir şekilde doğru. Davranış hala çalışıyor, sadece deyimsel değil. Bu değişikliği yaparsanız istemci kodunu kırdığınızı düşünün . Bunu uyarı yapmadan yapmak takdir edilmeyecektir.
Phoshi

@ GlenH7 Bu durumda, alternatif olarak adlandırılmış bir yöntem kullanmak işe yaramaz. PHP'nin yerel yineleyicisi bu yöntemlere dayanır (yani next()değil nextCorrect()). Next () 'i değiştirip değiştiremeyeceğimi göreceğim, böylece geriye dönük uyumlu ve Iteratorarayüzü uygularken çalışıyor .
hohner

1
@Phoshi Sen yerinde - Tamamen katılıyorum. Şimdi imkansızı denemenin ve kodlamanın zamanı geldi: D
hohner
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.