تخطَّ إلى المحتوى

🧩 شرح أنماط التصميم (Design Patterns)

الأنماط المضادة (Anti-Patterns)

الدرس 15 من 24· ⏱ 3 دقائق قراءة

مقدمة

الـ Anti-Pattern هو نمط يبدو كحلّ جيد في البداية لكنه يؤدي إلى مشاكل على المدى الطويل. معرفتها تمنعك من الوقوع في الأخطاء الشائعة.

1. God Object (الكائن الإلهي)

كلاس واحد يتحكم بكل شيء — يعرف أكثر مما يجب ويفعل أكثر مما يجب.

// ❌ Anti-Pattern
class GodClass {
  constructor() {
    this.users = [];
    this.orders = [];
    this.products = [];
    this.invoices = [];
  }

  addUser(name) { /* ... */ }
  deleteUser(id) { /* ... */ }
  processOrder(orderId) { /* ... */ }
  generateInvoice(orderId) { /* ... */ }
  sendEmail(userId, message) { /* ... */ }
  generateReport(type) { /* ... */ }
  backupDatabase() { /* ... */ }
}

⚠️ الـ God Object ينتهك Single Responsibility Principle ويصعب فهمه وتعديله.

الحل: فصل المسؤوليات إلى كلاسات متخصصة (UserService, OrderService, InvoiceService).

2. Spaghetti Code (كود المعكرونة)

كود متشابك يصعب تتبّعه — Goto statements، شروط متداخلة، تبعيات دائرية.

// ❌ Spaghetti Code
function process(data) {
  if (data) {
    if (data.type === "A") {
      for (let i = 0; i < data.items.length; i++) {
        if (data.items[i].active) {
          if (data.items[i].value > 10) {
            console.log(data.items[i].name);
          }
        }
      }
    } else if (data.type === "B") {
      // 50 سطر أخرى
    }
  }
}

الحل: استخراج الدوال، تقليل nesting، استخدام Guard Clauses.

3. Copy-Paste Programming (نسخ ولصق)

تكرار نفس الكود في أماكن متعددة بدلاً من إعادة الاستخدام.

// ❌ Copy-Paste
function validateEmail(email) {
  return email.includes("@");
}

function validateUsername(username) {
  // نفس المنطق تقريبًا
  return username.includes("@"); // خطأ!
}

الحل: استخراج الكود المشترك إلى دالة واحدة، مبدأ DRY.

4. Premature Optimization (تحسين مبكر)

تحسين الأداء قبل معرفة أين تكمن المشكلة الحقيقية.

// ❌ Premature Optimization
const cache = new Map();
const memoizedResults = {};

function calculate(x) {
  if (memoizedResults[x] !== undefined) {
    return memoizedResults[x];
  }
  // ... حسابات معقدة
  memoizedResults[x] = result;
  return result;
}

"التحسين المبكر هو أصل كل الشرور." — Donald Knuth

الحل: اكتب كودًا نظيفًا أولًا، ثم قس الأداء، ثم حسّن.

5. Lava Flow (كود الحمم)

كود قديم لا أحد يعرف لماذا هو موجود ولا أحد يجرؤ على حذفه.

مؤشرات: تعليقات مثل // TODO: delete this later، كود غير مستخدم، imports مهملة.

الحل: نظف بانتظام — الكود الميت يموت النّظام.

6. Golden Hammer (المطرقة الذهبية)

استخدام نفس الحل لكل المشاكل لمجرد أنه نجح مرة.

// ❌ Golden Hammer — كل شيء Singleton
class ConfigManager { static instance; /* ... */ }
class Logger { static instance; /* ... */ }
class Database { static instance; /* ... */ }
class APIClient { static instance; /* ... */ }

الحل: اختر النمط المناسب للمشكلة — ليس كل شيء يحتاج أن يكون Singleton.

جدول مقارنة

Anti-Patternالمشكلةالحل
God Objectكلاس واحد مسؤول عن كل شيءفصل المسؤوليات (SRP)
Spaghetti Codeتشابك غير منظمتنظيم وهيكلة واضحة
Copy-Pasteتكرار الكودDRY — إعادة استخدام
Premature Optimizationتحسين غير مبررقس أولًا، ثم حسّن
Lava Flowكود قديم غير مفهومتنظيف دوري
Golden Hammerحل واحد لكل المشاكلتقييم الحلول المختلفة

كيف تتجنب Anti-Patterns؟

  1. اعرفها — الوعي هو الخطوة الأولى.
  2. قواعد الكود — استخدم ESLint, Prettier, SonarQube.
  3. Code Review — عين ثانية تكتشف الأنماط الخاطئة.
  4. Refactoring — لا تتردد في إعادة هيكلة الكود.
  5. مبادئ SOLID — تذكّرها دائمًا.

الخلاصة

  • الـ Anti-Patterns هي ممارسات تبدو مفيدة لكنها تضر على المدى الطويل.
  • تعرّف عليها في كودك وصحّحها مبكرًا قبل أن تتفاقم.
  • تعريف الأنماط الصحيحة لا يكفي — تجنب الأنماط الخاطئة لا يقل أهمية.

🎯 التالي: مبادئ SOLID — تطبيق عملي

شرح الأنماط المضادة (Anti-Patterns) — أنماط التصميم (Design Patterns) بالعربي
الأنماط المضادة (Anti-Patterns)أنماط التصميم (Design Patterns) بالعربي · The Code Fix

📚 لمزيد من التعمّق في أنماط التصميم (Design Patterns)، راجِع البرمجة الكائنية على ويكيبيديا.

هل كان هذا الدرس مفيدًا؟