Şaka gibi ama, uzun süre refactor'ı bir "lüks", hatta zaman kaybı olarak gördüm. "Çalışıyor ya, dokunma bozulur" mantığıyla yığınla spaghetti code biriktirdim. Ta ki o feature'ı eklemek için 3 gün uğraşana kadar. Meğerse sorun, benim 5 dakikalık işi 3 saate çeviren o berbat koddaymış.
Olay şuydu: Kullanıcı profiline yeni bir istatistik ekleyecektim. Basit bir veri çekme ve gösterme işi. Ama kodda ilgili fonksiyonu bulmak, nerede neyin döndüğünü anlamak, global state'ten etkilenip etkilenmediğini debug etmek... Kafayı yiyecektim. Her seferinde "Burada bir şeyi kırıyor muyum?" paranoyasıyla test yazmak da cabası.
JavaScript:
// Eskiden (Korkunç):
function getUserData(userId) {
// ... 50 satırlık, her şeyi yapan, side effect'lerle dolu bir canavar
// İçinde API call, DB query, cache check, formatlama hepsi bir arada.
return magic; // ??
}
Dayanamayıp bir günü tamamen refactor'a ayırdım. O dev fonksiyonları parçaladım, sorumlulukları ayırdım, isimleri anlamlı yaptım. Pure function'lar yazdım. Şöyle bir şeye dönüştü:
JavaScript:
// Sonrası (Nefes Aldıran):
function fetchUserApiData(id) { / ... / }
function getUserFromCache(id) { / ... / }
function calculateStats(rawData) { / ... / }
function formatForDisplay(stats) { / ... / }
// Her biri test edilebilir, anlaşılır ve tek iş yapan.
İşte sihir burada oldu. Bir sonraki feature (benzer bir rapor ekranı) için, artık hazır, güvenilir yapı taşlarım vardı. Yeni şeyi birleştirmek yetti. O 3 günlük iş, 3 saate düştü. Refactor için harcadığım 1 gün, ilk feature'da kaybettiğim 2.5 günü hemen telafi etti. Sonrakilerde ise süre katlanarak azaldı. StackOverflow'da bile bulamayacağın bir verimlilik artışıydı.
Refactor, kod yazmak değil, gelecekteki kod yazma zamanını satın almaktı. Bu benim için bir dönüm noktası oldu. Siz de "çalışıyor" diye dokunmaktan korktuğunuz, sonra her seferinde içinizden küfrettiğiniz bir kod parçanız var mı? Temizlemek için ilk adımı ne zaman atacaksınız?