Karmaşık bir eski uygulamaya yeni hatalar getirme olasılığını azaltmak için hangi yaklaşımları kullanabilirim?


10

Çalıştığım yerde genellikle kodları tam spagetti olan eski bir sistemde (.NET 1) geliştirmek zorunda kalıyorum (ve hata düzeltmesi) - değişken isimlere, program yapısına veya yorumlara çok az düşünce verildi.

Bu nedenle, hangi bitlerin değişmesi gerektiğini anlamak benim zamanımı alıyor ve mevcut yazılımı sık sık 'kırıyorum' çünkü bir değişiklik yaptım. Gerçekten gerçekten ne de bunun için gidecekseniz zaman (sistem masif) düşünmek - Her iki ihtiyacı göremiyorum geliştiriciler gözden geçirmeniz ona geçiyor ancak mevcut (meslektaşları ile) birkaç ay geçirmek istiyorum.

Ben sadece başka bir şey kırık bulmak için bir şey düzeltmek için gün alır gibi onun kod üzerinde çalışmak zorunda dehşet. Bu açıkça beceriksiz görünmemi sağlıyor - bununla nasıl başa çıkabilirim?


Yanıtlar:


16

Üzerinde çalıştığınız parçalar için testler yazmaya başlayın. Aşağıdaki gibi bir iş akışını deneyebilirsiniz:

  1. Değiştirmek üzere olduğunuz bölüm için testler yazın. Bu aynı zamanda mevcut kodun nasıl davrandığını anlamanıza yardımcı olacaktır.
    • Gerekirse testi desteklemek için refactor kodu, ancak süre kısaysa birim dışı testler yazmak isteyebilirsiniz.
  2. İşlerin beklediğiniz gibi çalıştığından emin olmak için testlerinizi yapın.
  3. Değişikliklerinizi yapın. Refaktör gerekirse sürekli kod iyileştirme ruhu içinde, ancak taşınmayın.
  4. Aynı işlevi sürdürdüğünüzden emin olmak için testlerinizi yeniden çalıştırın.

Testlerinizi atmazsanız, zaman içinde uygulamanın en önemli (ve / veya uçucu) kısımlarını kapsaması gereken bir test paketi oluşturacak ve değişiklik yapmak daha kolay ve daha güvenli hale gelecektir.

Ayrıca Michael Feathers'ın Eski Kod ile Etkili Çalışmasını yararlı bulabilirsiniz.


1
+1 için "... ancak süre kısaysa birim dışı testler yazmak isteyebilirsiniz."!
Marcie

1
İyi cevap. @ m.edmondson Ayrıca refactor olarak, kodun belirli bölümlerinin 'çok büyük' ​​olduğunu da görebilirsiniz, çünkü her yerde çoğaltma vardır ve refactor olarak hem küçülür hem de basitleşir.
Alb

6

Ben takip etmek Bob Amca Martin 'in İzci Kural :

"Büyük dağınık eski bir tomarınız olduğunda yapmanız gereken şey ... Yapmanız gereken dağınıklığı bırakmayı ve onları temizlemeye başlamak.

Bu, yöneticilerinizi bir konferans odasına çağırdığınız ve kodu yeniden düzenlerken önümüzdeki üç ay boyunca özellikler sunmayacağınızı söylemediğiniz anlamına gelmez. Bunu yapma! Bunun yerine, “İzci Kuralı” nı benimseyeceğiniz ve her modülü teslim aldığınız zamana göre biraz daha temiz bir şekilde kontrol edeceğiniz anlamına gelir.

Yinelemeden yinelemeye ve sürümden sürüme kadar, yeni özellikler ve işlevler eklemeye devam ederken bu sistemi temizleyeceksiniz. Başka yolu yok."


2

Yöneticiye, kod tabanının karışıklığı nedeniyle saatlerce gün sürmesi gereken düzeltmelerin açıklanabileceğini açıklayabilirsiniz. Diğer geliştiriciler, orijinal geliştiriciler ise yeniden düzenleme için herhangi bir ihtiyaç görmeyecekler - sistemi içeriden tanıyacaklar, ancak yönetim, bu geliştiriciler onlardan ayrılıp bilgilerini alırsa orada bir risk olduğunu bilmelidir.

Tam bir yeniden düzenleme yapmak genellikle mümkün değildir, bu nedenle genellikle bir seferde küçük bitleri yeniden düzenlersiniz - birkaç yöntem veya bir modül. Heck, bir düzeltme yapmak birkaç gün sürüyorsa, belki de sorunlu modülün aynı anda küçük bir yeniden düzenlenmesi de dahil edilebilir .


1
Kabul ediyorum - ve geçmişte kodu anlamak için ihtiyaç duyduğum gibi bu 'küçük' refaktörleri ekledim - ancak birileri genellikle "tamamen kırdınız" ve nasıl olduğunu geri almak için geri dönüyor ...
billy.bob

@ m.edmondson: Ah. Peki onlar kapsamlı bir birim testleri paketi olsaydı o zaman sadece çalışan bu refactor iyi olup olmadığını doğrular. Kulağa geldiği gibi, buna sahip değiller, bu yüzden birim testlerini kendiniz yazmanız gerekecek. Kolay olmadığını ve bu sorunun gerçek bir kesin cevabı olmadığını biliyorum (en azından bulduğum bir tane değil, yine de diğer insanların da orada olduğum gibi önerilerini görmek için izleyeceğim).
SinirliWithFormsDesigner

2

Gerçekten kodu yeniden düzenleyerek aylar geçirmeniz gerekiyor mu? Veya değişiklik yaparken kodu yeniden düzenleyebilir misiniz? Örneğin, Foo yönteminin değiştirilmesi gerektiğini belirlerseniz, Foo yöntemini yeniden düzenleme fırsatını kullanabilirsiniz. Ve Foo'nun sorun olduğunu anlamak için bir düzine başka yöntemden geçmeniz gerekiyorsa, bu yöntemlerde yorum bırakabilirsiniz, böylece siz veya gelecekte başka biri kodun ne yapması gerektiğini bilir. Tabii ki, bu hala bir yığın spagetti kodu olduğu anlamına gelir, ancak en azından kod tabanını doğru yönde hareket ettirebilir ve kendiniz için daha kolay hale getirebilirsiniz. Yeniden düzenleme koduna birkaç ay süre vermek büyük bir satış olacaktır, çünkü bu, son kullanıcının istediği hiçbir şeyi teslim etmediğiniz anlamına gelir.

Birim testleri oluşturmak (veya umarım varolan test paketini genişletmek) yanlışlıkla bir şeyi kırma olasılığınızı azaltır.


0

Başka bir ipucu. Böcek tezahür yaptığınızda kendileri ve bandaj uygulandıktan sonra yok orada dur!

Beş peynire sor, kırmızı hapı al ve tavşan deliğinin ne kadar derine gittiğini gör ve kök nedenini (ve oradaki yolu) düzelt.

Sistem hakkında çok şey öğreniyorsunuz. Düzeltme ve yeniden düzenleme işlemlerinin önceliklendirilmesine yardımcı olur. Ve bu tür birkaç yolculuktan sonra, yekpare spagetti yığınını güçlendirmek için bazı sağlam "destek kirişlerine" sahipsiniz.


0

Ayrıca, değişikliklerinizin ses geçirmez olduğundan kesinlikle emin olana kadar eski kodu yerinde tutabilirsiniz. Tüm değişiklikleriniz durumunda, çalışma zamanında değiştirebilir ve yeni regresyon hatasının yerini hızlı bir şekilde belirleyebilirsiniz:

// old code
...

if (!File.ReadAllText("c:\patch_control.txt").Contains("StrangeUIBugFix=0"))
{
    // new code goes here
    ...
}

// old + new code
int someValue = 
    IsEnabled("StrangeUIBugFix") ? a + b :  // new code
    a * b; // old code

0

Bir şey: Never change any existing code if you are not sure what effect change would have on complete application.

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.