مرجع القواعد
القواعد الأربع عشرة بالتفصيل: منطق الكشف الدقيق، والخيارات، وملاحظات الإنذارات الخاطئة
في CleanLens 14 قاعدة. كل واحدة تُضبط في .clean-code-tracker.json تحت rules.<ruleId>:
"maxFunctionLines": { "enabled": true, "severity": "medium", "limit": 40 }| الحقل | النوع | المعنى |
|---|---|---|
enabled | منطقي (boolean)، إلزامي | القاعدة تعمل فقط إذا كان true. |
severity | low | medium | high | critical، إلزامي | يحدد وزن المخالفة ومستوى تنبيهها في المحرر. |
limit | رقم موجب، اختياري | الحد للقواعد الرقمية. |
options | كائن من أرقام/قيم منطقية، اختياري | إعدادات إضافية خاصة بالقاعدة. |
ملخص
| معرّف القاعدة | العنوان | الفئة | الخطورة الافتراضية | الحد / الخيارات الافتراضية | JS/TS | Python |
|---|---|---|---|---|---|---|
maxFunctionLines | دالة طويلة | structure | medium | limit 40 | ✅ | ✅ |
maxFileLines | ملف كبير | structure | medium | limit 400 (Django 500) | ✅ | ✅ |
maxParameters | معاملات كثيرة | structure | medium | limit 5 | ✅ | ✅ |
maxComplexity | تعقيد عالٍ | structure | high | limit 10 | ✅ | ≈ |
maxNestingDepth | تداخل عميق | structure | high | limit 4 | ✅ | ≈ |
detectDuplicateCode | كود مكرر | duplication | medium | options.minLines 6 | ✅ | ✅ |
detectUnusedCode | كود غير مستخدم | hygiene | low | — | ✅ | الاستيرادات فقط |
requireClearVariableNames | اسم غير واضح | hygiene | low | — | ✅ | ✅ |
requireErrorHandling | غياب معالجة الأخطاء | hygiene | medium | — | await | الاستدعاءات الخطرة |
forbidEmptyCatchBlocks | كتلة catch فارغة | hygiene | high | — | ✅ | ✅ |
forbidHardcodedSecrets | سرّ مكتوب في الكود | hygiene | critical | — | ✅ | ✅ |
forbidDebugStatements | أمر تصحيح | hygiene | low | — | ✅ | ✅ |
requireSingleResponsibility | مسؤوليات متعددة | structure | medium | options.maxMethods 10 | ✅ | ✅ |
requireDocumentationForComplexCode | كود معقد بلا توثيق | structure | low | options.complexityThreshold 15 | ✅ | ✅ |
≈ = تقريبي (قاعدة تقديرية، انظر أدناه).
القيم الافتراضية مأخوذة من BASE_RULES في src/configuration/presets.ts. إذا لم يكن للقاعدة limit/خيار في الإعدادات، يستخدم المحلل نفس القيمة الافتراضية.
قواعد البنية
maxFunctionLines — دالة طويلة
- تُبلّغ عن دالة يزيد امتدادها (من أول سطر إلى آخر سطر، شاملاً) على
limit. - JS/TS: كل عقدة شبيهة بالدالة، بما فيها الدوال السهمية والـ methods. الدوال المتداخلة تُقاس منفصلة؛ وامتداد الدالة الخارجية يشملها.
- Python:
def/async defمن الترويسة حتى آخر سطر بمسافة بادئة. - الموقع: الدالة كلها (من سطر البداية إلى سطر النهاية). وتحمل اسم الدالة.
maxFileLines — ملف كبير
- تُبلّغ عن ملف عدد أسطره أكبر من
limit. مخالفة واحدة لكل ملف، على السطر 1. - تحسب كل الأسطر، بما فيها الفارغة والتعليقات.
maxParameters — معاملات كثيرة
- تُبلّغ عن دالة تعرّف أكثر من
limitمعاملاً. - Python تتجاهل
selfوclsو*argsو**kwargs. - JS/TS تحسب كل معامل معرّف؛ والكائن المفكك (destructured) يُحسب معاملاً واحداً.
maxComplexity — تعقيد عالٍ
- تُبلّغ عن دالة تعقيدها الدوري أكبر من
limit. - JS/TS: 1 + كل
ifو?:وحلقة وcatchوcaseغير فارغ و&&و||و??. الدوال المتداخلة غير مشمولة. - Python (تقريبي): 1 + كل سطر في جسم الدالة يبدأ بـ
if/elif/for/while/except/case+ كلand/or. الدوال المتداخلة مشمولة.
maxNestingDepth — تداخل عميق
- تُبلّغ عن جملة تحكم متداخلة أعمق من
limit. - JS/TS: يزيد العمق مع
ifوforوfor…inوfor…ofوwhileوdoوswitch. الـelse ifلا تضيف مستوى. كل جملة تتجاوز الحد يُبلَّغ عنها. - Python (تقريبي): العمق = المسافة البادئة ÷ 4 على أسطر
if/elif/else/for/while/with/try/except. العدّ يشمل مستوياتdef/classالمحيطة، فيصل كود Python إلى الحد أسرع من كود JS المكافئ. فكّر في حد أعلى لمشاريع Python.
requireSingleResponsibility — مسؤوليات متعددة
محفّزان:
- class فيه أكثر من
options.maxMethodsمن الـ methods (JS/TS: الـ methods والـ getters والـ setters؛ Python: الـdefفي المستوى الأول داخل الـ class). - دالة هي في الوقت نفسه أطول من 1.5 ×
maxFunctionLines.limitوأعقد من 1.5 ×maxComplexity.limit. هذا المحفّز يقرأ حدود القاعدتين الأخريين، فتغييرهما يغيّر هذه القاعدة أيضاً.
هذه قاعدة تقديرية. انظر ملاحظات الإنذارات الخاطئة أدناه.
requireDocumentationForComplexCode — كود معقد بلا توثيق
- تُبلّغ عن دالة تعقيدها أكبر من أو يساوي
options.complexityThresholdوليس لها توثيق. - JS/TS: التوثيق = كتلة JSDoc (
/** … */) ملحقة بالدالة. تعليق//العادي لا يُحسب. - Python: التوثيق = docstring في أول سطر من جسم الدالة.
قاعدة التكرار
detectDuplicateCode — كود مكرر
- تُبلّغ عن كتلة من
options.minLinesسطراً مهماً على الأقل (افتراضياً 6، وأقل قيمة 3) تطابق، بعد توحيد المسافات، كتلة ظهرت قبلها. - الأسطر الأقصر من 12 حرفاً، وأسطر الأقواس فقط، والتعليقات، وأسطر import/export تُتجاهل، فلا يثير الكود الروتيني هذه القاعدة.
- مخالفة واحدة لكل كتلة مكررة؛ والرسالة تذكر مكان الأصل.
- فحص HEAD يكشف النسخ عبر الملفات؛ ومرور الـ commits يكشفها داخل الملف الواحد. انظر 05 — المحللات.
قواعد النظافة
detectUnusedCode — كود غير مستخدم
- JS/TS: تُبلّغ عن import، أو متغير غير مُصدَّر على مستوى الوحدة، أو تعريف دالة غير مُصدَّرة، يظهر اسمه مرة واحدة فقط في الملف. لا توجد معلومات أنواع ولا تحليل عبر الملفات، فتُكتشف الحالات الواضحة فقط. الأسماء التي تبدأ بـ
_تُتجاهل. - Python: تُبلّغ عن الاستيرادات غير المستخدمة فقط (الاسم يظهر مرة واحدة في الملف). و
from x import *يُتجاهل.
requireClearVariableNames — اسم غير واضح
- المتغيرات (JS/TS): الأسماء من حرف أو حرفين غير الموجودة في قائمة المسموح، والكلمات المبهمة مع رقم (
data1وtmp2وobj3)، والأحرف القليلة مع أرقام (abc1). - المعاملات وأسماء الدوال والـ classes (في اللغتين): فقط الكلمات المبهمة مع رقم والأحرف مع أرقام. الأسماء القصيرة المتعارف عليها (
eوxوcbوi) مسموحة. - مسموح: الأسماء التي تبدأ بـ
_والأسماء التقنية (utf8وsha256وipv6وoauth2وi18nوh1، …).
requireErrorHandling — غياب معالجة الأخطاء
- JS/TS:
awaitليس داخل كتلةtry(في نفس الدالة) وليس جزءاً من سلسلة.catch(…)/.then(…). - Python: سطر يستدعي
open(أوrequests.*(أوurllibأوjson.load(s)(أوsocket.أوsubprocess.أوos.remove(أوshutil.أوint(أوfloat(وليس داخل كتلةtry:في نفس الدالة. - كثيراً ما يعالج الكود الأخطاء في مستوى أعلى (إطار عمل أو دالة مستدعية)، لذلك هذه القاعدة هي الأكثر احتمالاً لإنتاج إنذارات زائدة.
forbidEmptyCatchBlocks — كتلة catch فارغة
- JS/TS: جملة
catchبلا تعليمات. الـ catch التي تحتوي تعليقاً فقط تُعدّ فارغة. - Python:
except …:جسمهاpassأو...فقط.
forbidHardcodedSecrets — سرّ مكتوب في الكود
- تفحص القيم النصية المسندة إلى المتغيرات وخصائص الكائنات وعمليات الإسناد (JS/TS)، وعمليات الإسناد أو أي نص في السطر (Python).
- تُبلّغ عن صيغ الرموز المعروفة (AWS وGitHub وSlack وJWT و
sk-…والمفاتيح الخاصة)، أو عن قيمة تشبه بيانات دخول مسندة إلى اسم يوحي بسرّ. النصوص البديلة مثلchangemeوyour_api_keyو<token>و${VAR}وexampleتُتجاهل. - الخطورة الافتراضية
critical: سرّ واحد يزن مثل ثماني نتائجlow.
forbidDebugStatements — أمر تصحيح
- JS/TS:
console.log/debug/info/trace/dir/table(…)وdebugger. أماconsole.errorوconsole.warnفهما مسموحان. - Python: سطر يبدأ بـ
print(، وأيbreakpoint().
الإنذارات الخاطئة وكيف تتعامل معها
| القاعدة | إنذار خاطئ نموذجي | المعالجة المقترحة |
|---|---|---|
requireErrorHandling | أخطاء يعالجها إطار عمل أو الدالة المستدعية | اخفضها إلى low أو عطّلها |
requireSingleResponsibility | classes كبيرة لكنها مترابطة (مثل ModelAdmin في Django، أو class component في React) | ارفع maxMethods |
requireDocumentationForComplexCode | فرق توثّق بتعليقات // | ارفع complexityThreshold أو عطّلها |
maxNestingDepth (Python) | الـ methods تبدأ من العمق 2 | ارفع limit إلى 5–6 لـ Python |
forbidDebugStatements | أدوات سطر أوامر وسكربتات يكون print/console.log فيها هو المخرج | استثنِ مجلدات السكربتات أو عطّلها |
detectUnusedCode | أسماء تُستخدم فقط عبر إعادة تصدير أو بحث نصي | أضف البادئة _ أو اخفضها إلى low |
forbidHardcodedSecrets | بيانات اختبار فيها رموز وهمية | استثنِ مجلد بيانات الاختبار |
لا توجد تعليقات لإسكات القاعدة داخل الكود. عدّل القاعدة أو استثنِ المسار. الوصفات موجودة في 11 — دليل الضبط والتخصيص.
تغيير القواعد والذاكرة المؤقتة
أي تغيير في rules يغيّر بصمة إعدادات التحليل، وهذا يُلغي الذاكرة المؤقتة لكل commit. التشغيل التالي يعيد تحليل كل شيء بالقواعد الجديدة. انظر 09 — التخزين المؤقت والأداء.