Özel durumunuzda yeniden düzenleme yapmanın amacı nedir?
TDD'ye (Test Odaklı Gelişim) hepimizin (bir dereceye kadar) inandığım cevabımı vermek amacıyla varsayın.
Yeniden düzenleme işleminizin amacı mevcut davranışı değiştirmeden mevcut kodu temizlemekse, yeniden düzenleme işleminden önce test yazmak, kodun davranışını değiştirmediğinizden emin olmanızdır, başarılı olursa, testler hem önce hem de sonra başarılı olacaktır. refactor.
Testler, yeni çalışmanızın gerçekten işe yaradığından emin olmanıza yardımcı olacaktır.
Testler muhtemelen de orijinal nasıl çalışır durumlarda ortaya çıkarmaya değil işi.
Ama nasıl eğer gerçekten davranışlarını etkilemeden önemli üstlenmeden yaparsınız bazı dereceye?
Yeniden düzenleme sırasında olabilecek birkaç şeyin kısa bir listesi:
- değişkeni yeniden adlandır
- yeniden adlandırma işlevi
- işlev ekle
- silme işlevi
- işlevi iki veya daha fazla işleve bölme
- iki veya daha fazla işlevi tek bir işlevde birleştirin
- bölünmüş sınıf
- sınıfları birleştir
- sınıfı yeniden adlandır
Listelenen etkinliklerin her birinin bir şekilde davranışı değiştirdiğini iddia edeceğim .
Ve yeniden düzenleme sizin davranışınızı değiştirirse, testlerinizin hala hiçbir şeyi kırmamanızı nasıl sağlayacağınızı tartışacağım .
Belki davranış makro düzeyde değişmez, ancak birim testin amacı makro davranışını sağlamak değildir. Bu entegrasyon testi. Birim testinin amacı, ürününüzü oluşturduğunuz parçaların ve parçaların kırılmamasını sağlamaktır. Zincir, en zayıf halka vb.
Bu senaryoya ne dersiniz:
Varsayalım function bar()
function foo()
aramak bar()
function flee()
ayrıca işlev çağrısı yapar bar()
Sadece çeşitli, flam()
bir çağrı yaparfoo()
Her şey muhteşem çalışıyor (en azından görünüşe göre).
Refactor ...
bar()
olarak yeniden adlandırıldı barista()
flee()
çağrı olarak değiştirildi barista()
foo()
olduğu değil çağrıya değiştirildibarista()
Açıkçası, her ikisi için de testler foo()
ve flam()
şimdi başarısız.
Belki ilk etapta foo()
aradığınızı fark etmediniz bar()
. Kesinlikle fark etmedi flam()
bağımlıydı bar()
yoluyla foo()
.
Her neyse. Nokta sizin testler her iki yeni kırık davranışı ortaya çıkarmak olacaktır foo()
ve flam()
, senin üstlenmeden çalışması sırasında artımlı moda.
Testler iyi bir şekilde yeniden düzenlemenize yardımcı olur.
Testiniz olmadığı sürece.
Bu biraz tartışmalı bir örnek. Molalar bar()
değişirse foo()
, o foo()
zaman başlamak için çok karmaşık olduğunu ve parçalanması gerektiğini iddia edenler var . Ancak prosedürler bir sebepten ötürü diğer prosedürleri çağırabilir ve tüm karmaşıklığı ortadan kaldırmak imkansızdır , değil mi? Bizim işimiz karmaşıklığı makul bir şekilde yönetmek .
Başka bir senaryo düşünün.
Bir bina inşa ediyorsunuz.
Binanın doğru bir şekilde inşa edilmesini sağlamak için bir iskele inşa ediyorsunuz.
İskele, diğer şeylerin yanı sıra bir asansör şaftı oluşturmanıza yardımcı olur. Daha sonra, iskele yırtılır, ancak asansör şaftı kalır. İskele tahrip ederek "orijinal işi" imha ettiniz.
Benzetme kıvrımlıdır, ancak asıl nokta, ürün oluşturmanıza yardımcı olacak araçlar oluşturmanın duyulmamış olmasıdır. Araçlar kalıcı olmasa bile faydalıdır (hatta gerekli). Marangozlar her zaman jig yaparlar, bazen sadece bir iş için. Sonra jigleri parçalara ayırırlar, bazen parçaları diğer işler için diğer jigleri oluşturmak için kullanırlar, bazen değil. Ama bu jigleri işe yaramaz veya boşa harcamaz.