Refactoring nedir? Davranışı koruyarak kodu iyileştirmek
Refactoring, yazılımın dış davranışını değiştirmeden iç yapısını iyileştirmektir. Kod kokuları, temel teknikler, test güvencesi ve küçük adımlarla ilerleme.
Refactoring nedir?
Refactoring (Türkçede kod yeniden düzenleme ya da refaktör), bir yazılımın dışarıdan görünen davranışını değiştirmeden iç yapısını daha anlaşılır, daha sade ve daha kolay değiştirilebilir hale getirme çalışmasıdır. Yeni özellik eklemez, hata düzeltmez; kodun okunabilirliğini ve bakım kolaylığını artırır.
Temel fikir şudur: kod bir kez yazılır ama defalarca okunur ve değiştirilir. İç yapı bozuldukça her yeni değişiklik yavaşlar ve hata riski artar. Refactoring bu birikimi düzenli olarak temizler.
Ne zaman refactoring yapılır?
Refactoring ayrı bir büyük proje olarak değil, günlük çalışmanın içinde yapılır. Tipik anlar: • Yeni bir özellik eklemeden önce, mevcut kodu o özelliğe uygun hale getirmek. • Bir hatayı düzeltirken kodun anlaşılmaz olduğunu fark ettiğinizde. • Kod incelemesinde okunabilirlik sorunları çıktığında. • Aynı kodun birden çok yerde tekrarlandığını gördüğünüzde.
Önemli bir kural, refactoring ile davranış değişikliğini aynı adımda karıştırmamaktır. Önce yapıyı düzenlersiniz, testler geçtiğini görürsünüz, sonra davranışı değiştirirsiniz.
Kod kokuları: neyi düzeltmeli?
Kod kokusu (code smell), kodda daha derin bir tasarım sorunu olabileceğini işaret eden belirtidir. Hata değildir ama bakımı zorlaştırır. Yaygın örnekler: • Uzun fonksiyon: çok iş yapan, okumak için kaydırma gerektiren fonksiyon. • Büyük sınıf: birden çok sorumluluğu üstlenmiş sınıf. • Tekrarlanan kod: aynı mantığın birkaç yerde kopyalanması. • Çok parametreli fonksiyon: ilişkili parametrelerin dağınık geçirilmesi. • Belirsiz isimler: değişken ya da fonksiyonun amacını anlatmayan adlar. • Özellik hasedi: bir sınıfın başka bir sınıfın verisine sürekli uzanması.
Kokuyu fark etmek, hangi tekniğin uygulanacağını belirler.
Temel teknikler
- Fonksiyon çıkarma: uzun bir fonksiyondan anlamlı bir parçayı ayrı ve adı amacını anlatan bir fonksiyona taşımak.
- Yeniden adlandırma: değişken, fonksiyon ya da sınıfa niyetini yansıtan ad vermek.
- Taşıma: bir fonksiyonu ya da alanı asıl ilgili olduğu sınıfa götürmek.
- Koşulu sadeleştirme: iç içe koşulları erken dönüşle ya da ayrı fonksiyonlarla düzleştirmek.
- Tekrarı birleştirme: kopyalanan mantığı tek yerde toplamak.
- Sihirli değeri sabite çevirme: anlamı belli olmayan değeri adlandırılmış sabite dönüştürmek.
Her teknik küçük bir adımdır; büyük dönüşümler bu küçük adımların güvenle üst üste konmasıyla yapılır.
Test güvencesi ve küçük adımlar
Refactoring'in güvenli yapılabilmesi için davranışın korunduğunu doğrulayan testler gerekir. Testler olmadan yapılan düzenleme, farkında olmadan davranışı bozabilir. Test yoksa önce mevcut davranışı yakalayan testler yazılır, ardından düzenlemeye geçilir.
Adımlar küçük tutulur. Her adımdan sonra testler çalıştırılır; bir şey kırılırsa son küçük adım geri alınır. Büyük, tek seferlik yeniden yazım ise genellikle riskli ve gözden kaçan davranışlarla doludur.
Küçük bir örnek
Örneğin bir sipariş fonksiyonu hem stok kontrolü yapıyor, hem fiyat hesaplıyor, hem de e-posta gönderiyor. Okumak zor, değiştirmek riskli. Refactoring ile önce testler yazılır. Sonra fiyat hesaplama bölümü ayrı bir fonksiyona çıkarılır, ardından stok kontrolü ve e-posta gönderimi de kendi fonksiyonlarına taşınır. Her adımda testler geçer.
Sonuçta sipariş fonksiyonu, anlamlı adımları sırayla çağıran kısa bir akışa dönüşür. Dışarıdan bakıldığında hiçbir şey değişmemiştir; ama bir sonraki değişiklik çok daha güvenli yapılabilir.
Refactoring ve teknik borç
Düzenlenmeyen kod zamanla teknik borç biriktirir: her değişiklik biraz daha pahalı hale gelir. Refactoring bu borcu ödemenin başlıca yoludur. Ancak her kötü kod hemen düzeltilmez; sık değişen ve riskli bölgelere öncelik verilir.
Temiz kod ilkeleri (anlamlı isimler, küçük fonksiyonlar, tek sorumluluk) refactoring'in hedef noktasını tanımlar. Refactoring ise mevcut kodu bu hedefe yaklaştırma yoludur.
Mindset programlarında refactoring
Mindset kataloğundaki Refactoring Teknikleri ve Kod Kokularını Giderme programı refaktör disiplini ve güvenlik ağı, kod kokusu kataloğu ve tarama, çıkarma ve taşıma teknikleri, koşul ve veri yapısı dönüşümleri, bağımlılık kırma ve büyük ölçekli refaktör planlaması başlıklarını içerir. Clean Coding Uzmanlığı Eğitimi programında ise isimlendirme ve kod düzeni, hata yönetimi, refactoring ve performans optimizasyonu ile kod inceleme konuları yer alır.
İlgili Mindset programı
Refactoring Teknikleri ve Kod Kokularını Giderme
Sık sorulan sorular
Refactoring ile yeniden yazma aynı mıdır?
Hayır. Refactoring mevcut kodu küçük, güvenli adımlarla ve davranışı koruyarak düzenler. Yeniden yazma ise kodu sıfırdan oluşturmaktır ve gözden kaçan davranışları kaybetme riski taşır. Refactoring'de uygulama her adımdan sonra çalışır durumda kalır; yeniden yazmada ise yeni kod eskisinin yaptığı her şeyi yapana kadar sistem yarım kalabilir.
Refactoring için test şart mı?
Güvenli refactoring için davranışı doğrulayan testler büyük avantaj sağlar. Test yoksa önce mevcut davranışı yakalayan testler yazmak, sonra düzenlemeye geçmek önerilir. Her küçük adımdan sonra testlerin geçtiği görülür; bir test kırılırsa son adım geri alınır ve hata nedeni dar bir alanda aranır.
Kod kokusu hata demek midir?
Hayır. Kod çalışıyor olabilir. Kod kokusu, tasarımda bakım zorluğu yaratabilecek bir sorun olabileceğini gösteren belirtidir ve incelenmesi gerekir. Uzun fonksiyon, tekrarlanan kod ya da belirsiz isimler buna örnektir; her koku hemen düzeltilmez, sık değişen ve riskli bölgelerdekiler önceliklendirilir.
Refactoring performansı artırır mı?
Amacı performans değil, yapıyı iyileştirmektir. Bazen dolaylı olarak performansa katkı yapar, bazen etkisizdir. Performans iyileştirmesi ayrı ölçüm gerektiren bir çalışmadır. Refactoring ile davranış değişikliği aynı adımda karıştırılmaz; hız sorunu varsa önce ölçüm yapılır, darboğaz bulunur ve düzenleme bundan sonra, testlerle korunarak yapılır.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme