---
title: "الكود الجاهز المطول"
type: "ai-smell"
slug: "verbose-boilerplate"
url: "http://localhost:3000/ar/ai-smells/verbose-boilerplate.md"
category: "الوضوح"
description: "يقوم مساعدو الذكاء الاصطناعي بحشو المنطق البسيط بتعليقات مكررة، ومظاهر دفاعية زائدة، وكتل شبه مكررة تم نسخها ولصقها بدلاً من إعادة استخدام أو استخراج الكود الحالي، مما يؤدي إلى تضخيم عدد السطور دون إضافة أي قيمة حقيقية."
---
# الكود الجاهز المطول

> يقوم مساعدو الذكاء الاصطناعي بحشو المنطق البسيط بتعليقات مكررة، ومظاهر دفاعية زائدة، وكتل شبه مكررة تم نسخها ولصقها بدلاً من إعادة استخدام أو استخراج الكود الحالي، مما يؤدي إلى تضخيم عدد السطور دون إضافة أي قيمة حقيقية.

## Signs and Symptoms

يكتشف المراجع الكود الجاهز المطول عندما يكون ملف الفروقات (diff) أطول بكثير مما تتطلبه المشكلة: حيث يتم شرح كل سطر بتعليق يعيد صياغته ببساطة، وتلتف التعبيرات البسيطة بسلالم شروط دفاعية لفحص `null`/`undefined`، ويظهر نفس شكل الكود مرتين أو ثلاث مرات بدلاً من تجميعه في دالة مساعدة واحدة. العلامة الفاضحة هي النسبة المرتفعة للتعليقات مقابل المنطق والسطور مقابل السلوك، بالإضافة إلى كتل كان يمكن كتابتها في ثلاثة سطور نموذجية.

```ts
// دالة للحصول على الاسم الكامل للمستخدم
function getFullName(user: User): string {
  // فحص ما إذا كان المستخدم معرفاً
  if (user === null || user === undefined) {
    // إرجاع سلسلة نصية فارغة في حال عدم تقديم مستخدم
    return "";
  }
  // الحصول على الاسم الأول، القيمة الافتراضية سلسلة فارغة
  const firstName = user.firstName ? user.firstName : "";
  // الحصول على الاسم الأخير، القيمة الافتراضية سلسلة فارغة
  const lastName = user.lastName ? user.lastName : "";
  // دمج الاسم الأول والأخير بمسافة
  const fullName = firstName + " " + lastName;
  // إزالة المسافات الفارغة وإرجاع النتيجة
  return fullName.trim();
}

```

ثلاثة سطور من السلوك الفعلي مدفونة في \~12 سطراً من التفاصيل الشكلية. وفي طلب سحب (PR) حقيقي، ترى عادةً هذا النمط \*نفسه\* منسوخاً وملصقاً كـ `getDisplayName`، و `getLabel`، و `getInitials`، وكل منها تكتب المنطق يدوياً على الرغم من وجود دالة مساعدة لـ `formatName()` تغطي ذلك بالفعل — وهي رائحة \*\*الكود المكرر (Duplicate Code)\*\* الكلاسيكية. علامات أخرى: وجود منشئات/أغلفة تمريرية فارغة، وتفاصيل شكلية لـ `try { ... } catch (e) { throw e }`، وأداة تحقق مخصصة للبريد الإلكتروني/رابط URL تجلس بجوار موديول التحقق الموجود مسبقاً في المشروع.

## Reasons for the Problem

**لماذا تنتجها النماذج؟**

* **انحياز الإطناب للرمز التالي.** يتم تدريب نماذج اللغة الكبيرة على كميات هائلة من الدروس البرمجية، وإجابات Stack Overflow، وأكواد المبتدئين حيث التعليقات التفصيلية والمظاهر التوضيحية هي القاعدة العامة. التكملة الأكثر _احتمالاً_ هي الأكثر شرحاً وتفصيلاً، وليست الأكثر إيجازاً.
* **عملية RLHF تكافئ "المظهر الدقيق والمفصل".** يدفع ضبط الفائدة والإطناب النماذج نحو مخرجات تبدو كاملة وتوضح نفسها بنفسها — تعليقات على كل سطر، وفحوصات دفاعية في كل مكان — وهو ما يكافئه المقيمون والمستخدمون حتى في حال عدم إضافة أي قيمة حقيقية.
* **غياب سياق المستودع = لا إعادة استخدام.** بدون سياق قاعدة الكود المحيطة، لا يستطيع النموذج معرفة وجود أداة مساعدة لـ `formatName()` أو `validateEmail()` بالفعل، لذلك يعيد استنتاجها بشكل مدمج. هذا هو بالضبط ما تصفه Ox Security بـ \*\*الإفراط في التخصيص\*\* ("حلول ضيقة للغاية وأحادية الاستخدام بدلاً من مكونات عامة قابلة لإعادة الاستخدام"، وتظهر في 80-90% من أكواد الذكاء الاصطناعي) و\*\*تجنب إعادة الهيكلة\*\* (80-90%).
* **التوليد وليس الدمج.** يصدر الوكلاء البرمجيون كوداً جديداً لكل أمر موجه ولا يعودون أبداً لدمجه أو تقليله. وجد تحليل GitClear لعام 2025 لـ 211 مليون سطر متغير أن الكود المنسوخ/الملصق ارتفع من 8.3% (2020) إلى 12.3% (2024) وتجاوز السطور "المنقولة" (المعاد هيكلتها) لأول مرة، بينما انخفضت السطور المعاد هيكلتها من \~24% إلى 9.5% ونمت كتل التكرار المكونة من 5 سطور أو أكثر بمعدل \~8 أضعاف.
* **الافتراض المتمثل في التعليق على كل شيء.** وجدت Ox Security ظاهرة "التعليقات في كل مكان" بنسبة 90-100% في الكود المولد بالذكاء الاصطناعي.

**لماذا يسبب ضرراً؟**

* **قابلية الصيانة:** مساحة أكبر للقراءة والتعديل؛ وتنفصل التعليقات المكررة عن الكود بمرور الوقت مع تغيره وتصبح مضللة تماماً (وهي رائحة \*\*التعليقات\*\* الكلاسيكية لدى Fowler).
* **الصحة والأمان:** تعني الكتل المكررة ضرورة إصلاح الأخطاء أو الثغرات في N من الأماكن — وهي ظاهرة \*\*أخطاء مكررة مألوفة (Bugs Déjà-Vu)\*\* لدى Ox (تحدث بنسبة 70-80%). ويرتبط الكود المستنسخ بزيادة في العيوب تتراوح بين 15-50%.
* **عبء المراجعة:** تخفي الفروقات الكبيرة ذات المؤشرات الضعيفة التغييرات الحقيقية وتسبب إرهاق المراجعين، مما يؤدي إلى تسلل المشكلات الحقيقية دون ملاحظتها.
* **تراكم الديون التقنية:** كل نسخة شبه مكررة تجعل الاستخراج \*التالي\* أصعب، مما يرسخ المشكلة التي لا يستطيع النموذج رؤيتها عبر الملفات.

## Treatment

**تكتيكات المراجعة وصياغة الأوامر**

* **فرض إعادة الاستخدام قبل التوليد:** "ابحث في قاعدة الكود عن دوال مساعدة موجودة (مثل `formatName`، و `validate*`) وأعد استخدامها؛ ولا تعيد كتابتها". وفر الأدوات المساعدة ذات الصلة في السياق.
* **حدد ميزانية للمخرجات:** "حافظ على هذا الكود تحت \~15 سطراً؛ ولا تضع تعليقات تعيد صياغة الكود — ضع فقط تعليقات توضح \*السبب\*".
* **أجبر النموذج على تشغيل الأدوات:** اطلب منه تشغيل `eslint`/`ruff` وفحص التكرار `jscpd`، واطلب منه كتابة تقرير بالانتهاكات وإصلاحها قبل الإرجاع.
* **اطلب أصغر ملف فروقات (diff) ممكن** وخطوة دمج صريحة: "إذا تكررت أي كتلة، فاستخرج دالة مشتركة (Extract Function) واستدعها".
* **ادمج في المراجعة:** عندما ترى النسخة شبه المكررة الثالثة، طبق \*\*استخراج الدالة (Extract Function)\*\*، أو \*\*رفع المنهج (Pull Up Method)\*\*، أو \*\*دمج أجزاء الشروط المكررة (Consolidate Duplicate Conditional Fragments)\*\*، و\*\*استبدال التعليق بالكود (Replace Comment with Code)\*\* (أعد التسمية بحيث يوثق الكود نفسه بنفسه).

**إعادة الهيكلة (قبل ← بعد)**

```ts
// بعد: إزالة التعليقات (الكود واضح بذاته)، تقليص المظاهر الشكلية،
// وإعادة استخدام الأداة المشتركة بدلاً من إعادة استنتاجها
function getFullName(user?: User): string {
  return [user?.firstName, user?.lastName].filter(Boolean).join(" ");
}

```

واحذف النسخ المكررة تماماً — إذا كانت `getDisplayName`/`getLabel` تفعل الشيء نفسه، فقم بحذفها ووجه المستدعين إلى الدالة الموحدة (\*\*إزالة الكود الميت / Remove Dead Code\*\* / \*\*تضمين الدالة / Inline Function\*\*). استبدل أداة التحقق المكتوبة يدوياً باستيراد الموديول الحالي بدلاً من الاحتفاظ بنسخة موازية.

قاعدة ذهبية: تعامل مع أي كتلة ذكاء اصطناعي تتجاوز فيها التعليقات سطور المنطق، أو حيث يمكنك تحديد دالة مساعدة تجاهلها النموذج، كمرشح للحذف وإعادة الاستخدام — فأسرع حل للكود الجاهز المطول هو عادةً كود \*أقل\*، وليس أكثر.

## Detected by

- **jscpd** `duplication threshold (--min-tokens / --threshold)` — كشف النسخ/اللصق (حد أدنى للرموز) (https://github.com/kucherenko/jscpd)
- **SonarQube / SonarCloud** `typescript:S4144` — يجب ألا تمتلك الدوال والأساليب تطبيقات متطابقة (https://rules.sonarsource.com/typescript/RSPEC-4144/)
- **SonarQube / SonarCloud** `typescript:S1192` — يجب ألا تتكرر السلاسل النصية الحرفية (https://rules.sonarsource.com/typescript/RSPEC-1192/)
- **SonarQube / SonarCloud** `javascript:S1871` — يجب ألا يمتلك فرعان في بنية شرطية نفس التطبيق تماماً (https://rules.sonarsource.com/javascript/RSPEC-1871/)
- **ESLint (eslint-plugin-sonarjs)** `sonarjs/no-identical-functions` — يجب ألا تمتلك الدوال تطبيقات متطابقة (https://github.com/SonarSource/eslint-plugin-sonarjs/blob/master/docs/rules/no-identical-functions.md)
- **ESLint (eslint-plugin-sonarjs)** `sonarjs/no-duplicate-string` — يجب ألا تتكرر السلاسل النصية الحرفية (https://github.com/SonarSource/eslint-plugin-sonarjs/blob/master/docs/rules/no-duplicate-string.md)
- **ESLint (core)** `no-useless-constructor` — منشئ فارغ مكرر / كود جاهز ممرر (https://eslint.org/docs/latest/rules/no-useless-constructor)
- **ESLint (core)** `max-lines-per-function` — طول الدالة المتضخم/المطول (مؤشر جزئي) (https://eslint.org/docs/latest/rules/max-lines-per-function)
