Kural
Çelişkili veya imkansız mantığı tespit
edin. Denetim akışı göz önüne alındığında
zaten ihlal edilmiş koşulları kontrol eden
veya imkansız durumları varsayan kod. control flow.
Desteklenen diller: 45+Giriş
Çelişkili mantık, kod önceki denetim akışına (control flow) göre zaten doğru veya yanlış olduğu bilinen koşulları kontrol ettiğinde ortaya çıkar. Bu durum, yeniden düzenleme sonrasında doğrulama sıralaması değiştirildiğinde veya geliştiriciler halihazırda hangi garantilerin mevcut olduğunu anlamadan savunmacı kontroller eklediğinde gerçekleşir. Bir fonksiyon if (user !== null) çağrıldıktan sonra user.email kontrolünü yapıyorsa çelişkili bir mantığa sahiptir; null kontrolü çok geç gelmektedir. Bu mantıksal imkansızlıklar, kod organizasyonundaki daha derin sorunlara veya her kod yolunun neyi garanti ettiğinin eksik anlaşılmasına işaret eder.
Neden önemli?
Güvenlik etkileri: Yanlış doğrulama, tehlikeli bir güvenli̇k illüzyonu yaratır. Güvenlik kontrolleri veriler zaten kullanıldıktan sonra gerçekleştirildiğinde, saldırganlar doğrulama yapılana kadarki zaman aralığını istismar edebilir. Ayrıcalıklı işlemler yürütüldükten sonra kullanıcı izinlerini doğrulayan kodlar gerçek bir koruma sağlamaz; yalnızca güvenlikle ilgili yanıltıcı yorumlar sunar.
Kodun sürdürülebilirliği: Çelişkili mantık, kodun geliştiricinin zihinsel modeliyle uyuşmadığını gösterir. Birisi bir koşulun kontrol edilmesi gerektiğine karar vermiş ancak bunu yanlış yere koymuş ya da ilgili kontroller güncellenmeden kod yeniden yapılandırılmış (refactor) olabilir. Gelecekte kodu sürdürecek kişiler, ihtiyaç duyulan yerde doğrulama olduğuna güvenemez ve gerçek güvenlik garantilerini anlamak için tüm fonksiyonları incelemek zorunda kalır.
Hata göstergeleri: İmkânsız koşullar nadiren tek başına var olur. Eksik hata yönetimi, fonksiyon sözleşmeleri hakkında yanlış varsayımlar veya başarısız yeniden yapılandırma gibi daha derin sorunların sinyalini verirler. Asla yürütülemeyen bir kontrol, genellikle bu durumu engellemesi gereken başka bir kontrolün başka bir yerde eksik olduğu anlamına gelir.
Kod örnekleri
❌ Kural dışı:
function processOrder(order) {
if (!order) {
return { error: 'Order required' };
}
const total = order.items.reduce(
(sum, item) => sum + item.price,
0
);
if (order.items && order.items.length > 0) {
applyDiscount(order);
}
if (total < 0) {
throw new Error('Invalid total');
}
return { total, status: 'processed' };
}
Neden yanlış: Kod, items order.items.reduce() değeri null veya undefinedçökmeye neden olduğunda çağrılır ve ardından öğelerin var olup olmadığını kontrol eder. Ayrıca total < 0 kontrolü de çelişkilidir çünkü reduce fonksiyonu fiyatları toplarken her zaman negatif olmayan değerler döndürür.
✅ Kurallara uygun:
function processOrder(order) {
if (!order || !order.items || order.items.length === 0) {
return { error: 'Valid order with items required' };
}
const hasInvalidPrice = order.items.some(
item => typeof item.price !== 'number' || item.price < 0
);
if (hasInvalidPrice) {
throw new Error('Invalid item prices');
}
const total = order.items.reduce(
(sum, item) => sum + item.price,
0
);
if (order.items.length >= 5) {
applyBulkDiscount(order);
}
return { total, status: 'processed' };
}
Neden önemli?: Tüm doğrulamalar veriler kullanılmadan önce gerçekleşir, kontroller mantıksal sırayla yapılır ve koşullar gerçek gereksinimleri yansıtır. Fonksiyon girdileri baştan doğrular, ardından gereksiz veya çelişkili kontroller olmaksızın geçerli verileri işler.
Sonuç
Doğrulamaları veriyi kullandıktan sonra değil, önce gerçekleştirin. Savunmacı gibi görünen ancak verilere zaten erişildikten veya veriler değiştirildikten sonra ortaya çıkan koşulları gözden geçirin. Yeniden yapılandırma (refactoring) sırasında, fonksiyon genelinde mantıksal tutarlılığı korumak için ilgili doğrulamaları güncelleyin veya kaldırın.

