Kural başvurusu
14 kuralın her biri ayrıntılı: tam tespit mantığı, seçenekler, yanlış pozitif notları
CleanLens'te 14 kural vardır. Her biri .clean-code-tracker.json içinde rules.<ruleId> altında yapılandırılır:
"maxFunctionLines": { "enabled": true, "severity": "medium", "limit": 40 }| Alan | Tip | Anlamı |
|---|---|---|
enabled | boolean, zorunlu | Kural yalnızca bu true ise çalışır. |
severity | low | medium | high | critical, zorunlu | İhlalin ağırlığını ve editördeki tanı düzeyini belirler. |
limit | pozitif sayı, isteğe bağlı | Sayısal kurallar için eşik. |
options | sayı/boolean nesnesi, isteğe bağlı | Kurala özgü ek ayarlar. |
Özet
| Kural kimliği | Başlık | Kategori | Varsayılan önem | Varsayılan sınır / seçenekler | JS/TS | Python |
|---|---|---|---|---|---|---|
maxFunctionLines | Uzun fonksiyon | structure | medium | limit 40 | ✅ | ✅ |
maxFileLines | Büyük dosya | structure | medium | limit 400 (Django 500) | ✅ | ✅ |
maxParameters | Çok fazla parametre | structure | medium | limit 5 | ✅ | ✅ |
maxComplexity | Yüksek karmaşıklık | structure | high | limit 10 | ✅ | ≈ |
maxNestingDepth | Derin iç içelik | structure | high | limit 4 | ✅ | ≈ |
detectDuplicateCode | Yinelenen kod | duplication | medium | options.minLines 6 | ✅ | ✅ |
detectUnusedCode | Kullanılmayan kod | hygiene | low | — | ✅ | yalnızca import'lar |
requireClearVariableNames | Belirsiz isim | hygiene | low | — | ✅ | ✅ |
requireErrorHandling | Eksik hata yönetimi | hygiene | medium | — | await | riskli çağrılar |
forbidEmptyCatchBlocks | Boş catch bloğu | hygiene | high | — | ✅ | ✅ |
forbidHardcodedSecrets | Koda gömülü gizli bilgi | hygiene | critical | — | ✅ | ✅ |
forbidDebugStatements | Hata ayıklama ifadesi | hygiene | low | — | ✅ | ✅ |
requireSingleResponsibility | Birden fazla sorumluluk | structure | medium | options.maxMethods 10 | ✅ | ✅ |
requireDocumentationForComplexCode | Belgesiz karmaşık kod | structure | low | options.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)
limitdeğ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
limitdeğ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
limitdeğerinden fazla parametre bildiren bir fonksiyonu raporlar.- Python
self,cls,*argsve**kwargsparametrelerini 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ığı
limitdeğerinden büyük olan bir fonksiyonu raporlar. - JS/TS: 1 + her
if,?:, döngü,catch, boş olmayancase,&&,||,??. İç içe fonksiyonlar dahil değildir. - Python (yaklaşık): 1 +
if/elif/for/while/except/caseile başlayan her gövde satırı + herand/or. İç içe fonksiyonlar dahildir.
maxNestingDepth — Derin iç içelik
limitdeğerinden daha derin iç içe geçmiş bir kontrol ifadesini raporlar.- JS/TS: derinlik
if,for,for…in,for…of,while,do,switchiçin artar.else ifbir düzey eklemez. Sınırı aşan her ifade raporlanır. - Python (yaklaşık): derinlik =
if/elif/else/for/while/with/try/exceptsatırlarında girinti ÷ 4. Sayım kapsayandef/classdü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.maxMethodsdeğerinden fazla metodu olan bir sınıf (JS/TS: metotlar, getter'lar, setter'lar; Python: sınıfın bir düzey içindekidef'ler).- 1.5 ×
maxFunctionLines.limitdeğerinden hem uzun hem de 1.5 ×maxComplexity.limitdeğ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.complexityThresholddeğ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.minLinesanlamlı 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
trybloğunun içinde olmayan ve bir.catch(…)/.then(…)zincirinin parçası olmayan birawait. - Python: aynı fonksiyonun bir
try:bloğu içinde olmayan veopen(,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
catchcümlesi. Yalnızca yorum içeren bir catch boş sayılır. - Python: gövdesi yalnızca
passveya...olan birexcept …:.
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},examplegibi yer tutucular yok sayılır. - Varsayılan önem derecesi
critical'dır: tek bir gizli bilgi sekizlowbulgu kadar ağırdır.
forbidDebugStatements — Hata ayıklama ifadesi
- JS/TS:
console.log/debug/info/trace/dir/table(…)vedebugger.console.errorveconsole.warnserbesttir. - Python:
print(ile başlayan bir satır ve herbreakpoint().
Yanlış pozitifler ve nasıl ele alınır
| Kural | Tipik yanlış pozitif | Önerilen çözüm |
|---|---|---|
requireErrorHandling | Bir çatı veya çağıran tarafından yönetilen hatalar | low seviyesine düşürün veya kapatın |
requireSingleResponsibility | Bü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 ekipler | complexityThreshold değerini yükseltin veya kapatın |
maxNestingDepth (Python) | Metotlar 2. derinlikten başlar | Python için limit değerini 5–6'ya çıkarın |
forbidDebugStatements | print/console.log'un çıktının kendisi olduğu CLI'lar ve betikler | Betik klasörlerini hariç tutun veya kapatın |
detectUnusedCode | Yalnızca yeniden dışa aktarma veya dize araması ile kullanılan adlar | _ öneki ekleyin veya low seviyesine düşürün |
forbidHardcodedSecrets | Sahte token içeren test verileri | Test 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.