Code Smell
Kod Kokusu
- Okunuşu
- koud smel
Kısaca
Code smell (kod kokusu), kod hâlâ çalışsa bile çoğu zaman daha derin bir tasarım sorununa işaret eden yüzeysel bir belirtidir.
Code smell nedir?
Terim Kent Beck tarafından bulundu ve kokuları ve onları gideren refactoring'leri kataloglayan, Martin Fowler'ın 1999'da yayımlanan Refactoring kitabıyla geniş çapta tanındı. Bir koku bir hata değildir: program kusursuz çalışabilir. Kodun anlaşılmasının, değiştirilmesinin ya da test edilmesinin zor olacağına ve daha yakından bakmaya değer olduğuna dair bir ipucudur.
Yaygın kokular arasında çok fazla şey yapan uzun metotlar ve büyük sınıflar; birkaç yerde düzeltilmesi gereken tekrarlanan kod; uzun parametre listeleri; bir metodun kendi verisinden çok başka bir sınıfın verisini kullandığı feature envy; tek bir değişikliğin birçok dosyada düzenleme gerektirdiği shotgun surgery; küçük türler yerine düz string'ler ve sayılar kullanmak olan primitive obsession ve onları açıklayan bir adı olmayan sihirli sayılar (magic number) vardır.
Her koku belirli refactoring'ler önerir: bir fonksiyon çıkarmak, bir parametre nesnesi getirmek, bir metodu verisini kullandığı sınıfa taşımak, sihirli bir sayıyı adlandırılmış bir sabitle değiştirmek. Linter'lar ve SonarQube gibi araçlar bazı kokuları otomatik olarak işaretler; çoğunun fark edilip tartışıldığı yer de kod incelemesidir.
Sık yapılan bir yanlış, her kokunun giderilmesi gerektiğini düşünmektir. Kokular kural değil, buluşsal yöntemlerdir: yukarıdan aşağıya açıkça okunan uzun bir fonksiyon olduğu gibi bırakılsa daha iyi olabilir; tekrarı çok erken kaldırmak da yanlış bir soyutlama yaratabilir. Amaç sinyali fark edip bilinçli karar vermektir; ideal olarak refactoring'den önce testler hazır olmalıdır.
Önemli noktalar
- Code smell, bir hatanın değil, olası bir tasarım sorununun belirtisidir.
- Terimi Kent Beck buldu; Fowler'ın Refactoring'i (1999) onu yaygınlaştırdı.
- Uzun metotlar, tekrar ve uzun parametre listeleri klasik kokulardır.
- Her koku onu gidermek için belirli refactoring'ler önerir.
- Kokular buluşsal yöntemlerdir: her birini bağlamında değerlendirin.
Örnek
// Smells: magic numbers, duplicated logic, long parameter list
function price(base, isMember, isHoliday, country, couponCode, quantity) {
let total = base * quantity;
if (isMember) total = total * 0.9;
if (isHoliday) total = total * 0.9;
if (country === "TR") total = total * 1.2;
if (country === "DE") total = total * 1.19;
return total;
}
// Refactored: named constants, one option object, a lookup table
const MEMBER_DISCOUNT = 0.9;
const HOLIDAY_DISCOUNT = 0.9;
const VAT = { TR: 1.2, DE: 1.19 };
function priceFor({ base, quantity, member = false, holiday = false, country }) {
let total = base * quantity;
if (member) total *= MEMBER_DISCOUNT;
if (holiday) total *= HOLIDAY_DISCOUNT;
return total * (VAT[country] ?? 1);
}Sık sorulan sorular
Code smell bir hata mı?
Hayır. Kokusu olan kod doğru çalışabilir. Koku, kodun bakımının ya da genişletilmesinin zor olabileceğine işaret eder; bu da gelecekteki hataları daha olası kılar.
En yaygın code smell'ler nelerdir?
Uzun metotlar, büyük sınıflar, tekrarlanan kod, uzun parametre listeleri, feature envy, shotgun surgery, primitive obsession, sihirli sayılar, ölü kod ve kodu netleştirmek yerine kafa karıştırıcı kodu açıklayan yorumlar.
Bir code smell nasıl giderilir?
Davranışın değişmediğini doğrulamak için testlerle, küçük adımlarla yapılan, bir fonksiyon çıkarmak, adlandırılmış bir sabit eklemek ya da bir metodu taşımak gibi eşleşen bir refactoring'le.
İlgili sayfalar
- RefactoringYazılım Mimarisi, s. 32Refactoring, mevcut kodun dışarıdan görünen davranışını değiştirmeden daha temiz ve bakımı kolay hâle getirmek için yeniden yapılandırılması sürecidir.
- Teknik BorçYazılım Mimarisi, s. 43Teknik borç, daha uzun sürecek daha iyi bir yaklaşım yerine şimdi hızlı ya da sınırlı bir çözüm seçilmesiyle doğan, gelecekteki ek iş maliyetidir.
- Code ReviewSürüm Kontrolü, s. 4Code review, kod değişikliklerinin birleştirilmeden önce başka geliştiricilerce incelenmesidir; hataları yakalar, kaliteyi artırır, bilgi paylaşımını sağlar.
- LintingTest ve Kalite, s. 15Linting, kaynak kodu çalıştırmadan otomatik olarak analiz edip olası hataları, stil sorunlarını ve şüpheli kalıpları kod yayına çıkmadan işaretleme işlemidir.
- Statik AnalizTest ve Kalite, s. 26Statik analiz, hataları, güvenlik açıklarını ve kalite sorunlarını erken bulmak için kaynak kodun çalıştırılmadan otomatik olarak incelenmesidir.
- DRYYazılım Mimarisi, s. 13DRY, her bilgi ya da mantık parçasının çoğaltılmak yerine tek bir yetkili temsile sahip olması gerektiğini söyleyen bir yazılım tasarım ilkesidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin