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

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

## Signs and Symptoms

يكتشف المراجع التسمية متجاهلة السياق عندما تكون الأسماء في ملف الفروقات (diff) المولد بواسطة الذكاء الاصطناعي معقولة محلياً ولكنها منفصلة عن المستودع المحيط بها. العلامات التحذيرية:

* **عناصر نائبة عامة في كود النطاق:** استخدام `data`، `result`، `temp`، `item`، `obj`، `payload`، `response`، `value`، `handleStuff`، `processData` بينما تستخدم الوحدة بالفعل لغة محددة (`grossPremium`، `Customer`، `getCustomerById`).
* **انحراف الاصطلاحات:** إسقاط رمز مكتوب بطريقة `snake_case` في ملف يستخدم `camelCase`، أو غياب بادئة `is`/`has` للمتغيرات البولينية، أو استخدام فعل CRUD جديد (`fetch*`) في قاعدة كود موحدة على `get*`. كل ملف فروقات "يتبع أي أسلوب واجهه أخيراً، مما يقدم اصطلاحاً رابعاً، ثم خامساً".
* **تشتت المترادفات / مفاهيم مكررة:** يبتكر الذكاء الاصطناعي `fetchUser` بينما `getCustomerById` موجودة بالفعل، أو يخلط بين `customer`/`client`/`user` لكيان واحد — مما يعني إعادة التطبيق بدلاً من إعادة الاستخدام.
* **أسماء تصف الآلية وليس الغرض — أو تكذب بشأن السلوك:** مثل `processData()` التي تقوم في الواقع بحساب ضريبة المبيعات. يقرأ الوكلاء (والوكيل التالي) `processData()` ويتصرفون كما لو أن هذا الاسم يخبر بالقصة كاملة، مما ينشر المعنى الخاطئ لكل موضع استدعاء.

```ts
// يصدر المستودع بالفعل getCustomerById(id: CustomerId): Promise<Customer>
// يضيف الذكاء الاصطناعي كوداً شبه مكرر بأسماء تجهل السياق:
async function fetchData(id: string) {          // فعل عام، نوع غير محدد بدقة
  const result = await db.query("select * from customers where id = $1", [id]);
  const temp = result.rows[0];                  // 'temp' يخفي حقيقة أنه Customer
  return temp;                                  // لا يوجد شيء هنا يشير إلى "Customer"
}

```

## Reasons for the Problem

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

* **انحياز تكرار الرمز التالي (Next-token frequency bias).** عبر مجموعة بيانات التدريب، تكون المعرفات مثل `data`/`result`/`temp`/`foo` هي الأعلى احتمالاً، خاصة في الأكواد التعليمية والجاهزة (boilerplate) التي تلتهمها نماذج اللغة الكبيرة بشراهة. توليد الاسم المتوسط إحصائياً هو بالضبط ما تم تحسين متنبئ الرمز التالي للقيام به، مما يطمس تفاصيل النطاق المعني ([Towards Data Science](https://towardsdatascience.com/the-missing-curriculum-essential-concepts-for-data-scientists-in-the-age-of-ai-coding-agents/)).
* **غياب سياق المستودع (أو اقتطاعه).** نادراً ما يرى النموذج مسرد المصطلحات للموديول الشقيق أو دالة `getCustomerById` الحالية. يربط تقرير GitClear طفرة التكرار بهذا مباشرة: المساعد "يكون أقل احتمالاً لاقتراح إعادة استخدام دالة مماثلة في مكان آخر... ويعود ذلك جزئياً إلى حجم السياق المحدود" ([GitClear 2025](https://www.gitclear.com/ai%5Fassistant%5Fcode%5Fquality%5F2025%5Fresearch)).
* **التحسين المحلي / غريزة إعادة هيكلة الكود الضعيفة.** تعمل كل دورة محادثة على تحسين المدخلات الفورية، "دون النظر إلى التأثير المعماري التراكمي". وجدت شركة OX Security أن _تجنب إعادة الهيكلة_ يحدث في 80-90% من أكواد الذكاء الاصطناعي، وبالتالي يضيف النموذج رمزاً جديد التسمية بدلاً من إعادة تسمية أو إعادة استخدام رمز موجود بالفعل ([OX report](https://www.prnewswire.com/news-releases/ox-report-ai-generated-code-violates-engineering-best-practices-undermining-software-security-at-scale-302592642.html)).
* **تاريخ انتهاء التدريب (Training-cutoff staleness).** تعود الاصطلاحات وأسماء واجهات برمجة التطبيقات (API) من مجموعات البيانات القديمة للظهور مجدداً حتى بعد أن يكون المشروع قد تجاوزها.

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

* **قابلية القراءة/الاستدامة:** الأسماء هي التوثيق الأساسي لقاعدة الكود؛ وتجبر الأسماء العامة كل قارئ على استنتاج الغرض من متن الكود مجدداً.
* **التكرار والعيوب:** تؤدي إعادة تسمية مفهوم ما إلى إنشاء تطبيق موازٍ له. رصدت GitClear زيادة بمقدار 8 أضعاف تقريباً في الكتل المكررة وتجاوزت عمليات النسخ/اللصق السطور المنقولة (المعاد هيكلتها) لأول مرة في عام 2024؛ وتحمل النسخ المكررة عيوباً تقدر بنسبة 15-50% أكثر.
* **حلقة تغذية العميل البرمجي الارتدادية (الضرر الخاص بالذكاء الاصطناعي):** الأسماء هي الواجهة التي يقرأها العميل البرمجي (agent) التالي بقيمتها الظاهرية. الاسم المضلل أو العام "ينشر الأخطاء عبر كل الكود المولد بالوكلاء والذي يُبنى عليه" ([AI Pattern Book](https://aipatternbook.com/naming)).
* **عبء المراجعة والصحة:** يجب على المراجعين ربط `temp`/`data` ذهنياً بمفاهيم النطاق، مما يخفي الأخطاء؛ وتتسبب الأسماء المضللة في استخدام خاطئ عند الاستدعاء.
* **النقاط العمياء للأمن والمراجعة:** كلمة المرور السرية أو الرمز المميز (token) الموضوع في متغير باسم `data`/`tmp` يفلت من عمليات البحث النصي (grep) المبنية على الاسم وانتباه المراجعين.

ملاحظة: تُظهر أبحاث مثل arXiv [2509.20491](https://arxiv.org/abs/2509.20491) أن الأدوات الساكنة تلتقط الروائح _المحلية والواضحة_ بشكل جيد، ولكن جانب المعنى الخاص بالنطاق هنا يعتمد على القيمة والغرض، ويفلت إلى حد كبير من الاكتشاف التلقائي.

## Treatment

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

* **تغذية السياق بالاصطلاحات ومسرد المصطلحات.** احتفظ بدليل تسمية قصير (حالة الأحرف، البوادئ البولينية، أفعال CRUD، مصطلحات النطاق) في ملفات `CLAUDE.md`/وثائق الأسلوب واطلب من النموذج اتباعها. طبق مصطلحات مسرد النطاق باستمرار لدمج المترادفات في كلمة واحدة.
* **فرض إعادة الاستخدام قبل الإنشاء.** وجّه النموذج: "ابحث في المستودع عن دالة/نوع موجود لهذا الغرض قبل إضافة دالة جديدة؛ وأعد استخدامه". هذا يواجه مباشرة فشل تكرار المفهوم الذي أشارت إليه تقارير GitClear و OX.
* **تسمية الأشياء في الأمر الموجه.** توجيه مثل "سمِّ معالج الحدث `createRefund`" أفضل من "أضف معالجة استرداد الأموال". حدد أسماء النطاق (مثل `monthlyRevenue` وليس `float1`).
* **طلب تشغيل أداة الفحص (linter) + فحص التكرار** على الفروقات (diff) (مثل naming-convention + `id-denylist` \+ jscpd) واطلب من النموذج إصلاح الانتهاكات بدلاً من القيام بذلك يدوياً بنفسك.

**إعادة الهيكلة** — تطبيق _إعادة تسمية المتغير/الدالة (Rename Variable/Function)_ (ما يسميه Fowler "تغيير إعلان الدالة")، لإصلاح رائحة **الاسم الغامض (Mysterious Name)**، وتطبيق _دمج الكود المكرر (Consolidate Duplicate Code)_ عن طريق إعادة استخدام الرمز الحالي بدلاً من الجديد.

قبل:

```ts
async function fetchData(id: string) {
  const result = await db.query("select * from customers where id = $1", [id]);
  const temp = result.rows[0];
  return temp;
}

```

بعد (إعادة استخدام دالة المستودع الحالية؛ وأسماء وأنواع تطابق الاصطلاحات وتكشف عن الغرض):

```ts
// لا تقم بإعادة الاستعلام — أعد استخدام getCustomerById وحافظ على مصطلحات النطاق.
async function getCustomerById(id: CustomerId): Promise<Customer | null> {
  const { rows } = await db.query<Customer>(
    "select * from customers where id = $1",
    [id],
  );
  return rows[0] ?? null;
}

```

إذا تم شحن اسم مضلل بالفعل، فأعد تسميته ليتطابق مع السلوك (`processData` ← `calculateSalesTax`) قبل البناء عليه، حتى يرث الوكلاء اللاحقون والمطورون الإشارة الصحيحة.

## Detected by

- **ESLint (core)** `id-denylist` — منع المعرفات المحددة (https://eslint.org/docs/latest/rules/id-denylist)
- **ESLint (core)** `id-length` — فرض الحد الأدنى/الأقصى لطول المعرف (https://eslint.org/docs/latest/rules/id-length)
- **typescript-eslint** `@typescript-eslint/naming-convention` — فرض اصطلاحات التسمية (حالة الأحرف/البوادئ) (https://typescript-eslint.io/rules/naming-convention/)
- **eslint-plugin-unicorn** `unicorn/prevent-abbreviations` — منع الاختصارات / الأسماء العامة المفرطة (https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prevent-abbreviations.md)
- **SonarQube / SonarSource** `typescript:S117` — يجب أن تتوافق أسماء المتغيرات المحلية والمعاملات مع اصطلاح تسمية معين (https://rules.sonarsource.com/typescript/RSPEC-117/)
- **jscpd** `copy-paste-detection` — يكتشف الكتل المكررة الناتجة عن تكرار مفهوم موجود بعد إعادة تسميته (https://github.com/kucherenko/jscpd)
