Yazılım geliştiriciler olarak bazen eski yazdığımız kodlara bakarak bunları daha iyi yazabileceğimizi görürürüz. Bazen ise başka geliştiricilerin yazdıkları kodları inceler ve bu kodların daha iyi yazılabileceğini düşünürüz. Yazılan bu kodlar o an için en iyi çözüm gibi görünse de sonrasında daha iyi çözümler olduğunu görürüz. Böyle durumlarda eski kodu daha iyi hale getirmek için yapılan yeniden düzenleme işlemine refactoring denir.

Yazılım tek seferlik bir üretim değildir. Bunun aksine yazılım bir süreçtir. Örneğin linux kaynak kodunu gözünüzün önüne getirin. 1991 yılında ilk sürümü ortaya çıkan linux kaynak koduna yıllardır bir çok kod parçası eklendi. Pek tabi ki bu kodlar her zaman mükemmel değildi. Fakat linux bu süreç boyunca yapılan refactoring işlemleri sayesinde kötü veya gereksiz kodlar düzenlenerek çok daha kaliteli bir kod yapısına kavuştu. Bu basit örnekten de göreceğimiz üzere ilk defasında mükemeli yapmak mümkün değil. Ancak süreç boyunca yapılan düzenlemelerle en iyiye ulaşmak mümkün. Refactoring işleminin temelinde yatan fikirde aslında bundan ibaret.

Peki ne zaman refactoring yapmalıyım? Refactoring için bir zaman yok. Kodunuzda daha iyi hale getirebileceğiniz bölümler gördüğünüzde hemen kod düzeltmesi uygulayabilirsiniz. Sonuçta önemli olan kodunuzun bir önceki halinden daha iyi hale gelmesi. Refactoring işlemini kodunuzda gördüğünüz eksikleri gidermek adına yapabileceğiniz gibi bu konuda öne çıkar önerileri içeren refactoring tekniklerinide takip edebilirsiniz. Bu teknikler yazılımcıların genel olarak yaptıkları hatalardan yola çıkarak hazınlanmış bir rehber niteliğindedir.

1func printOwing(amount float64) {
2    printBanner()
3
4    //print details
5    fmt.Println("name:" + name)
6    fmt.Println ("amount" + amount)
7}

Yukarıdaki kod blogunda görünen sorun “print details” bölümünden kaynaklanıyor. Bu bölüm yeni bir fonksiyon içine taşınarak mevcut fonksiyonun karmaşıklığı azaltılabilir. Ayrıca başka yerlerde kullanmak gerektiğinde oluşturduğumuz yeni fonksiyonu çağırıp kullanmak çok daha pratik ve kullanışlı olur. Bu düşünce ile kodumuzu düzenlediğimizde ortaya şöyle bir kod parçası çıkacaktır.

1func printOwing(amount float64) {
2    printBanner()
3    printDetails(amount)
4}
5func printDetails(amount float64) {
6     fmt.Println("name:" + name)
7     fmt.Println("amount" + amount)
8}

Kod blogumuz yeni hali ile çok daha okunaklı ve temiz görünüyor. Ayrıca yeni oluşturduğumuz fonksiyonu bir çok farklı noktadan çağırıp kullanmak artık oldukça kolaylaştı. Bu ve bunun gibi bir çok durum böyle basit kodlarda net bir şekilde görünmektedir. Oysa çok fazla kod içeren büyük projelerde bu tür bir çok basit çözüm gözden kaçmakta ve diğer kod blokların içinde kaybolmaktadır. İşte bunun çözümü refactoring işlemidir.

Bu yazımda kısaca refactoring işlemini anlatmaya çalıştım. Eğer bu konu ilginizi çektiyse mutlaka refactoring teknikleri konusunu internetten araştırın. Ayrıca bu konuda Ali Rıza Adiyahşi tarafından hazırlanan Refactoring Guide in Turkish çalışmasını incelemenizi şiddetle tavsiye ediyorum.