Eski Kod ile Etkili Çalışmanın Anahtar Noktaları nelerdir? [kapalı]


133

Eski Kod ile Etkili Çalışma kitabını birkaç kez tavsiye ettim . Bu kitabın kilit noktaları nelerdir?

Eski kodlarla başa çıkmak için birim / entegrasyon testleri eklemek ve sonra yeniden düzenleme yapmaktan daha fazlası var mı?



2
Tabii ki mesele testler ve sonra refactor eklemektir. Kitap, büyük ölçüde test altında imkansız şekilde sarsılmış bir kod almayı nasıl başardığınızla ilgilidir ve bu noktada birçok göz açıcı bulunmaktadır. Diyelim ki Tüylerin mahkum almadığını söyleyelim!
Kilian Foth,

9
Belki de kitabı okumalısın
HLGEM

Burada güzel incelemesi: andreaangella.com/2014/03/...
rohancragg

Yanıtlar:


157

Eski kodla ilgili en önemli sorun, test olmamasıdır. Bu yüzden biraz eklemek gerekir (ve daha sonra ...).

@ Mattnz'ın belirttiği gibi, bu kendi başına çok fazla çalışma gerektirecektir. Ancak eski kodların özel sorunu, asla test edilebilir olması için tasarlanmamış olmasıdır . Bu nedenle tipik olarak, küçük parçaların ünite testine tabi tutulmasının çok zor veya düpedüz olarak imkansız olduğu, çok geniş bir kıvrımlı spagetti kodu karmaşasıdır. Bu nedenle , birim testinden önce, daha test edilebilir hale getirmek için kodu yeniden yapılandırmanız gerekir .

Ancak, güvenli bir şekilde yeniden inceltmek için, değişikliklerinizle ilgili hiçbir şey kırmadığınızı doğrulamak için birim testlerine sahip olmalısınız ... Bu, eski kodların 22'sidir.

Kitap, sadece ilk ünite testlerini mümkün kılmak için kodda mutlak minimum, en güvenli değişiklikleri yaparak bu yakalamanın nasıl çözüleceğini öğretir. Bunlar tasarımı daha güzel kılmak değil, yalnızca ünite testlerini mümkün kılmak içindir. Aslında, bazen tasarımı çirkin veya daha karmaşık hale getirirler. Bununla birlikte, testler yazmanıza izin verir - ve birim testleri gerçekleştirdikten sonra, tasarımı daha iyi hale getirmekte özgürsünüz.

Kodu test edilebilir hale getirmek için birçok püf noktası var - bazıları açık, bazıları hiç değil. Kitabı okumadan kendim hakkında asla düşünmediğim yöntemler var. Ancak daha da önemlisi, Tüylerin bir kod birimini kesin olarak test edilebilir kılan şeyin ne olduğunu açıklamasıdır . Bağımlılıkları azaltmanız ve kodunuza engeller eklemeniz gerekir, ancak iki farklı nedenden dolayı:

  • algılama - bir kod parçasının yürütülmesinin etkilerini kontrol etmek ve doğrulamak için ve
  • Ayırma - Öncelikle belirli bir kod parçasını bir test donanımına sokmak için.

Bağımlılık güvenli bir şekilde kesme zor olabilir. Arayüzler, alaylar ve Bağımlılık Enjeksiyonu tanıtımı, hedef olarak temiz ve güzeldir, ancak bu noktada yapılması kesinlikle güvenli değildir. Bu yüzden bazen normalde örneğin bir DB'ye doğrudan bir istek başlatacak bazı metotları geçersiz kılmak için test altındaki sınıfı alt sınıfa koymak zorundayız. Diğer zamanlarda, bağımlılık sınıfını / kavanozunu test ortamında sahte bir taneyle değiştirmemiz bile gerekebilir ...

Bana göre, Tüylerin getirdiği en önemli kavram dikişlerdir . Bir kod, kodun kendisini değiştirmeden programınızın davranışını değiştirebileceğiniz kodda bir yerdir . Kodları içine dikiş yapmak, test edilen kod parçasını ayırmayı sağlar , ancak doğrudan yapmak zor veya imkansız olsa bile test altındaki kodun davranışını hissetmenizi sağlar (örneğin, çağrı başka bir nesnede veya alt sistemde değişiklik yaptığı için) , durumu doğrudan test yöntemi içinden sorgulamak mümkün değildir.

Bu bilgi, en kötü kod yığınında test edilebilirlik tohumlarını fark etmenize ve oraya ulaşmanız için en az, en yıkıcı, en güvenli değişiklikleri bulmanıza olanak sağlar. Başka bir deyişle, fark etmeden kodu kırma riski taşıyan "belirgin" yeniden düzenlemeler yapmaktan kaçınmak için - çünkü bunu algılamak için birim testlerine henüz sahip değilsiniz .


5
Yukarıdaki cevabın "birim testleri" dediğinde, bunun aslında "otomatik testler" anlamına geldiğine dikkat edin . Eski bir uygulama için başlangıçta faydalı otomatikleştirilmiş testlerin büyük bir kısmı aslında entegrasyon testleri olacaktır (buradaki test mantığı, genel kodun daha büyük bir bölümünü yürütür ve gerçek birimden ziyade farklı yerlerde hatalar nedeniyle arızalar üretebilir) Testler (sadece bir modülü analiz etmek ve her birinin kodunun daha küçük bölümlerini çalıştırmak).
Lutz Prechelt

99

Eski Kodla Etkili Çalışmanın anahtar noktalarını hızlıca elde etmenin hızlı yolları


3
O Hanselminutes sayfadaki MP3 bağlantı bozulur ama üzerinde bir hanselminutes.com/165/... değil - s3.amazonaws.com/hanselminutes/hanselminutes_0165.mp3 .
Peter Mortensen

PDF bağlantısını düzeltmek için teşekkürler rosston. Objectmentor.com gitti gibi görünüyor - belki "Bob Amca" işsiz kaldı?
MarkJ

Akıl hocalarına ne olduğuna emin değilim, ama bugünlerde Bob Amca 7. Işık için çalışıyor.
Jules

40

Bazıları 1980'lerden kalma milyonlarca kod satırında çalışıyorum. Bu sadece bir yazılımdır, bu yüzden birkaç ünite testi yazmaktan ibarettir, bu yüzden gidip tekrar gözden geçirebilir ve daha iyi hale getirebilirsiniz.

Buradaki anahtar kelime, sadece - eski sistemler üzerinde çalışanlar dışında, herhangi bir programcının kelime haznesine ait olmayan dört harfli bir kelimedir.

Bir saatlik test geliştirme, bir saatlik geliştirme çabasını test etmenin ne kadar zaman alacağını düşünüyorsunuz? Tartışma aşkına, başka bir saat diyelim.

20 milyon yıllık bu eski miras sistemine milyonlarca zaman harcanıyor? Diyelim ki, 20 yıl boyunca 20 geliştirici 2000 saat / yıl (oldukça çalıştılar). Şimdi bir sayı seçelim - yeni bilgisayarlarınız ve yeni araçlarınız var, ve ilk başta% $ ^^ yazısını yazanlardan çok daha zekisin - en önemlisi de onlardan biri olduğunuzu varsayalım. 40 erkeğin var mı?

Yani sorunuzun cevabı çok daha fazlası var. Örneğin, 1000 satırlık rutin (5000'den fazla olan birkaç tane var), aşırı karmaşık ve bir parça spagetti. Sadece (yine dört harfli bir kelime) birkaç 100 satır rutini ve birkaç 20 satır yardımcısına yeniden katmak için birkaç gün alacak, değil mi? YANLIŞ. Bu 1000 satırda gizli olan her biri belgelenmemiş bir kullanıcı gereksinimi ya da belirsiz bir uç durum olan 100 hata düzeltmesidir. Bu 100 satırdır, çünkü orijinal 100 satırlık rutin iş yapmadı.

Zihin seti ile birlikte çalışmanız gerekir ( eğer kırılmazsa, düzeltmeyin) . Kırıldığı zaman, tamir ederken çok dikkatli olmalısınız - daha iyi yaptıkça, yanlışlıkla başka bir şeyi değiştirmemeniz gerekir. "Kırdı" nın sisteme ve kullanımına bağlı olarak sürdürülemez ancak doğru çalışan bir kod içerebileceğini unutmayın. "Bunu mahvedip daha da kötüleştirirsem ne olur" diye sor, çünkü bir gün bunu yapacaksın ve patronlarına neden bunu yapmayı seçtiğini söylemelisin.

Bu sistemler her zaman daha iyi hale getirilebilir. Çalışmak için bir bütçe, bir zaman çizelgesi, her neyse. Eğer yapmazsan - git ve bir tane yap. Para / zaman tükendiğinde daha iyi yapmayı bırak. Bir özellik ekleyin, biraz daha iyi hale getirmek için kendinize zaman verin. Bir hatayı düzeltin - yine biraz daha fazla zaman harcayın ve düzeltin. Asla başladığındakinden daha kötü teslim etme.


2
ipuçları için teşekkürler! Bunlar senin mi yoksa kitaptan mı?
Armand

3
Muhtemelen her ikisinden de biraz - bu işi yaptıktan birkaç yıl sonra kitabı okudum ve muhtemelen agian okumalıyım. Herhangi bir iyi kitap gibi, şu anda yaptığınız işlerden bazılarını zorlaştırır, yaptığınız işlerin çoğunu yeniden uygular, ancak belirli sorunlarınız için tüm cevaplara sahip olmaz.
mattnz

7
“Bu 1000 satır, çünkü orijinal 100 satır rutini bu işi yapmadı.” Çok nadiren bu aslında durum böyle görünüyor. Daha çok çoğu zaman 1.000 satırdan ibaret değildir, çünkü orijinal geliştirici kolları sıvadı ve planlama veya tasarım için bir an bile ayırmadan önce kodlamaya başladı.
Stephen Touset

3
Hayır. Diyorum ki, çoğu durumda (şahsen karşılaştığım), 1000 satır rutini insanların doğru bir soyutlamayı nasıl yazacağını düşünmeden önce kod yazmaya başladığının açık bir göstergesidir. Bin satır rutini neredeyse tanımı gereği çok karmaşık - yüzlerce gizli, yorumlanmamış hataya sahip bin satırlık rutinin sorumlu bir geliştiricinin işareti olduğunu mu söylüyorsunuz?
Stephen Touset

16
Bu sitedeki her gönderiye inandıysanız, herkes 1000 satırlık spagetti kodu ile uğraşmak zorundadır, henüz kimse yazmamıştır. Tecrübelerime göre, 1000 (ve 10000) satır rutini, ücretlerini ödeyen patronun talep ettiği şeyi sunmak için ellerinden gelenin en iyisini yapan geliştiricilerin damgasıdır. Kendisini hakaret edici ve kibirli buluyorum, bu yüzden birçok geliştirici, koşullardan habersiz bir şekilde yanlarından yorum yapmaktan çekinmekte, eleştirmek için kendi çalışmalarını asla ortaya koymak zorunda kalmamaktadır.
mattnz

19

Kitaptan almak için iki önemli nokta var.

  1. Eski kod, test kapsamı içermeyen herhangi bir koddur.
  2. Eski kodu değiştirmek istediğinizde, kapsamı dahil olduğundan emin olmalısınız.

Diğer cevaplayıcıların da belirttiği gibi, mevcut eski kodunuzu önleyici olarak güncellemeye çalışmak bir aptalın işidir . Bunun yerine, eski kodda değişiklik yapmanız gerektiğinde (yeni bir özellik veya hata düzeltmesi için), eski durumunu kaldırmak için zaman ayırın.


6
+1 Mükemmel nokta: "Eski kodda bir değişiklik yapmanız gerektiğinde, eski durumunu kaldırmak için zaman ayırın."
John

3
Miras statüsünü kaldırmak, benim oyum olsun :)
Rachel

7

Gerçek bir somun kabuğunda - testler ve yeniden düzenleme yapmak her şeyiyle ilgili.

Ancak kitap, güvenli bir şekilde test edilmesi ve düzeltilmesi çok zor olan kodlarla bunu yapmak için size birçok farklı teknik sunar.

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.