06

Kural başvurusu

14 kuralın her biri ayrıntılı: tam tespit mantığı, seçenekler, yanlış pozitif notları

6 dk okuma6 bölüm

CleanLens'te 14 kural vardır. Her biri .clean-code-tracker.json içinde rules.<ruleId> altında yapılandırılır:

json
"maxFunctionLines": { "enabled": true, "severity": "medium", "limit": 40 }
AlanTipAnlamı
enabledboolean, zorunluKural yalnızca bu true ise çalışır.
severitylow | medium | high | critical, zorunluİhlalin ağırlığını ve editördeki tanı düzeyini belirler.
limitpozitif sayı, isteğe bağlıSayısal kurallar için eşik.
optionssayı/boolean nesnesi, isteğe bağlıKurala özgü ek ayarlar.

Özet

Kural kimliğiBaşlıkKategoriVarsayılan önemVarsayılan sınır / seçeneklerJS/TSPython
maxFunctionLinesUzun fonksiyonstructuremediumlimit 40✅✅
maxFileLinesBüyük dosyastructuremediumlimit 400 (Django 500)✅✅
maxParametersÇok fazla parametrestructuremediumlimit 5✅✅
maxComplexityYüksek karmaşıklıkstructurehighlimit 10✅≈
maxNestingDepthDerin iç içelikstructurehighlimit 4✅≈
detectDuplicateCodeYinelenen kodduplicationmediumoptions.minLines 6✅✅
detectUnusedCodeKullanılmayan kodhygienelow—✅yalnızca import'lar
requireClearVariableNamesBelirsiz isimhygienelow—✅✅
requireErrorHandlingEksik hata yönetimihygienemedium—awaitriskli çağrılar
forbidEmptyCatchBlocksBoş catch bloğuhygienehigh—✅✅
forbidHardcodedSecretsKoda gömülü gizli bilgihygienecritical—✅✅
forbidDebugStatementsHata ayıklama ifadesihygienelow—✅✅
requireSingleResponsibilityBirden fazla sorumlulukstructuremediumoptions.maxMethods 10✅✅
requireDocumentationForComplexCodeBelgesiz karmaşık kodstructurelowoptions.complexityThreshold 15✅✅

≈ = yaklaşık (sezgisel, aşağıya bakın).

Varsayılanlar src/configuration/presets.ts içindeki BASE_RULES'tan gelir. Yapılandırmada bir kuralın limit/seçeneği yoksa analizör aynı varsayılan değeri kullanır.


Yapı kuralları

maxFunctionLines — Uzun fonksiyon

  • Kapsamı (ilk satırdan son satıra, dahil) limit değerinden büyük olan bir fonksiyonu raporlar.
  • JS/TS: ok fonksiyonları ve metotlar dahil her fonksiyon benzeri düğüm. İç içe fonksiyonlar ayrıca ölçülür; dış fonksiyonun kapsamı onları içerir.
  • Python: başlıktan son girintili satıra kadar def / async def.
  • Konum: fonksiyonun tamamı (başlangıç → bitiş satırı). Fonksiyon adını taşır.

maxFileLines — Büyük dosya

  • limit değerinden fazla satırı olan bir dosyayı raporlar. Dosya başına tek ihlal, 1. satırda.
  • Boş satırlar ve yorumlar dahil tüm satırları sayar.

maxParameters — Çok fazla parametre

  • limit değerinden fazla parametre bildiren bir fonksiyonu raporlar.
  • Python self, cls, *args ve **kwargs parametrelerini yok sayar.
  • JS/TS bildirilen her parametreyi sayar; yapı bozumlu (destructured) bir nesne tek parametre sayılır.

maxComplexity — Yüksek karmaşıklık

  • Döngüsel karmaşıklığı limit değerinden büyük olan bir fonksiyonu raporlar.
  • JS/TS: 1 + her if, ?:, döngü, catch, boş olmayan case, &&, ||, ??. İç içe fonksiyonlar dahil değildir.
  • Python (yaklaşık): 1 + if/elif/for/while/except/case ile başlayan her gövde satırı + her and/or. İç içe fonksiyonlar dahildir.

maxNestingDepth — Derin iç içelik

  • limit değerinden daha derin iç içe geçmiş bir kontrol ifadesini raporlar.
  • JS/TS: derinlik if, for, for…in, for…of, while, do, switch için artar. else if bir düzey eklemez. Sınırı aşan her ifade raporlanır.
  • Python (yaklaşık): derinlik = if/elif/else/for/while/with/try/except satırlarında girinti ÷ 4. Sayım kapsayan def/class düzeylerini içerir; bu yüzden Python kodu eşdeğer JS kodundan daha önce sınıra ulaşır. Python projeleri için daha yüksek bir sınır düşünün.

requireSingleResponsibility — Birden fazla sorumluluk

İki tetikleyici:

  • options.maxMethods değerinden fazla metodu olan bir sınıf (JS/TS: metotlar, getter'lar, setter'lar; Python: sınıfın bir düzey içindeki def'ler).
  • 1.5 × maxFunctionLines.limit değerinden hem uzun hem de 1.5 × maxComplexity.limit değerinden daha karmaşık olan bir fonksiyon. Bu tetikleyici diğer iki kuralın sınırlarını okur; onları değiştirmek bu kuralı da değiştirir.

Bu bir sezgidir. Aşağıdaki yanlış pozitif notlarına bakın.

requireDocumentationForComplexCode — Belgesiz karmaşık kod

  • Karmaşıklığı options.complexityThreshold değerine eşit veya büyük olan ve belgesi olmayan bir fonksiyonu raporlar.
  • JS/TS: belge = fonksiyona bağlı bir JSDoc bloğu (/** … */). Düz bir // yorumu sayılmaz.
  • Python: belge = ilk gövde satırındaki bir docstring.

Tekrar kuralı

detectDuplicateCode — Yinelenen kod

  • En az options.minLines anlamlı satırdan oluşan (varsayılan 6, en az 3) ve boşluk normalleştirmesinden sonra daha önce görülmüş bir blokla aynı olan bir bloğu raporlar.
  • 12 karakterden kısa satırlar, yalnızca parantez içeren satırlar, yorumlar ve import/export satırları yok sayılır; böylece şablon kod bu kuralı tetiklemez.
  • Yinelenen blok başına bir ihlal; mesaj orijinalin nerede olduğunu söyler.
  • HEAD taraması dosyalar arası kopyaları, commit yürüyüşü dosya içi kopyaları tespit eder. Bkz. 05 — Analizörler.

Hijyen kuralları

detectUnusedCode — Kullanılmayan kod

  • JS/TS: adı dosyada yalnızca bir kez görünen bir import'u, modül düzeyinde dışa aktarılmamış bir değişkeni veya dışa aktarılmamış bir fonksiyon bildirimini raporlar. Tip bilgisi ve dosyalar arası analiz yoktur; bu yüzden yalnızca bariz durumlar bulunur. _ ile başlayan adlar yok sayılır.
  • Python: yalnızca kullanılmayan import'ları raporlar (ad dosyada bir kez görünür). from x import * yok sayılır.

requireClearVariableNames — Belirsiz isim

  • Değişkenler (JS/TS): izin listesinde olmayan 1–2 karakterlik adlar, rakamlı belirsiz kelimeler (data1, tmp2, obj3) ve rakamlı kısa harfler (abc1).
  • Parametreler ve fonksiyon/sınıf adları (iki dilde de): yalnızca rakamlı belirsiz kelimeler ve harf+rakam birleşimleri. Geleneksel kısa adlara (e, x, cb, i) izin verilir.
  • Serbest: _ önekli adlar ve teknik adlar (utf8, sha256, ipv6, oauth2, i18n, h1, …).

requireErrorHandling — Eksik hata yönetimi

  • JS/TS: (aynı fonksiyon içinde) bir try bloğunun içinde olmayan ve bir .catch(…) / .then(…) zincirinin parçası olmayan bir await.
  • Python: aynı fonksiyonun bir try: bloğu içinde olmayan ve open(, requests.*(, urllib, json.load(s)(, socket., subprocess., os.remove(, shutil., int(, float( çağıran bir satır.
  • Kod hataları çoğu zaman daha üst bir düzeyde (bir çatı veya çağıran fonksiyon) yönetir; bu yüzden en çok gürültü üretmesi muhtemel kural budur.

forbidEmptyCatchBlocks — Boş catch bloğu

  • JS/TS: ifade içermeyen bir catch cümlesi. Yalnızca yorum içeren bir catch boş sayılır.
  • Python: gövdesi yalnızca pass veya ... olan bir except …:.

forbidHardcodedSecrets — Koda gömülü gizli bilgi

  • Değişkenlere, nesne özelliklerine ve atamalara verilen dize değerlerini (JS/TS) ve atamaları veya satırdaki herhangi bir dizeyi (Python) denetler.
  • Bilinen token biçimlerini (AWS, GitHub, Slack, JWT, sk-…, özel anahtarlar) veya gizli bilgiye benzeyen bir ada verilmiş kimlik bilgisine benzeyen bir değeri raporlar. changeme, your_api_key, <token>, ${VAR}, example gibi yer tutucular yok sayılır.
  • Varsayılan önem derecesi critical'dır: tek bir gizli bilgi sekiz low bulgu kadar ağırdır.

forbidDebugStatements — Hata ayıklama ifadesi

  • JS/TS: console.log/debug/info/trace/dir/table(…) ve debugger. console.error ve console.warn serbesttir.
  • Python: print( ile başlayan bir satır ve her breakpoint().

Yanlış pozitifler ve nasıl ele alınır

KuralTipik yanlış pozitifÖnerilen çözüm
requireErrorHandlingBir çatı veya çağıran tarafından yönetilen hatalarlow seviyesine düşürün veya kapatın
requireSingleResponsibilityBüyük ama tutarlı sınıflar (örn. bir Django ModelAdmin, bir React sınıf bileşeni)maxMethods değerini yükseltin
requireDocumentationForComplexCode// yorumlarıyla belgeleyen ekiplercomplexityThreshold değerini yükseltin veya kapatın
maxNestingDepth (Python)Metotlar 2. derinlikten başlarPython için limit değerini 5–6'ya çıkarın
forbidDebugStatementsprint/console.log'un çıktının kendisi olduğu CLI'lar ve betiklerBetik klasörlerini hariç tutun veya kapatın
detectUnusedCodeYalnızca yeniden dışa aktarma veya dize araması ile kullanılan adlar_ öneki ekleyin veya low seviyesine düşürün
forbidHardcodedSecretsSahte token içeren test verileriTest verisi klasörünü hariç tutun

Satır içi susturma yorumları yoktur. Kuralı ayarlayın veya yolu hariç tutun. Tarifler 11 — Özelleştirme kılavuzu içindedir.

Kural değişiklikleri ve önbellek

rules içindeki her değişiklik analiz yapılandırma hash'ini değiştirir; bu da commit başına önbelleği geçersiz kılar. Bir sonraki çalıştırma her şeyi yeni kurallarla yeniden analiz eder. Bkz. 09 — Önbellek ve performans.