Clean Code في PHP: مبادئ كتابة الكود النظيف مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هو الكود النظيف (Clean Code) ولماذا هو مهم في PHP؟



الكود النظيف (Clean Code) ليس مجرد مصطلح عصري، بل هو فلسفة تطوير تساعد في كتابة برامج مفهومة ليس فقط للآلة، بل للإنسان أيضًا. في سياق PHP، حيث غالبًا ما يتم صيانة الكود لسنوات بواسطة فرق مختلفة، يصبح اتباع مبادئ الكود النظيف مهارة بالغة الأهمية.



يتميز الكود النظيف بعدة خصائص رئيسية:

  • من السهل قراءته وفهمه دون تعليقات
  • يمكن التنبؤ به ولا يسبب "مفاجآت" عند التنفيذ
  • من السهل تعديله دون خطر كسر أجزاء أخرى من النظام
  • يحتوي على الحد الأدنى من التكرار (مبدأ DRY)


في هذه المقالة، سنشرح المبادئ الأساسية للكود النظيف (Clean Code) من خلال أمثلة محددة لكود PHP.



1. تسمية المتغيرات والدوال



مثال سيء: ما الخطأ في هذا الكود؟

// ❌ كود سيء$a = 5;$b = 10;$c = $a * $b;

function calc($x, $y) { return $x + $y * 0.2;}

$d = calc($a, $b);


في هذا المثال، من غير الواضح تمامًا ماذا تعني المتغيرات $a و $b و $c وماذا تفعل الدالة calc. بعد شهر، لن تتذكر أنت نفسك لماذا كتبت هذا الكود.



مثال جيد: أسماء ذات معنى

// ✅ كود جيد$productPrice = 5;$quantity = 10;$totalCost = $productPrice * $quantity;

function calculatePriceWithTax(float $basePrice, float $taxRate = 0.2): float { return $basePrice + ($basePrice * $taxRate);}

$finalPrice = calculatePriceWithTax($totalCost);


قواعد التسمية في PHP:

  • استخدم الأسماء للمتغيرات ($userName، $orderTotal)
  • استخدم الأفعال للدوال (getUser()، calculateTotal())
  • لا تختصر الأسماء (اكتب $customerAddress، وليس $custAddr)
  • تجنب المتغيرات المكونة من حرف واحد (باستثناء عدادات الحلقات $i، $j)
  • ابدأ المتغيرات المنطقية (Boolean) بـ is، has، can ($isActive، $hasPermission)


2. الدوال الصغيرة ومبدأ المسؤولية الواحدة (SRP)



المشكلة: دالة السكين السويسري

// ❌ كود سيء: الدالة تفعل كل شيء دفعة واحدةfunction processOrder(array $orderData): array {    // التحقق    if (empty($orderData['email'])) {        throw new Exception('Email required');    }        // الحفظ في قاعدة البيانات    $pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', '');    $stmt = $pdo->prepare("INSERT INTO orders (email, total) VALUES (?, ?)");    $stmt->execute([$orderData['email'], $orderData['total']]);        // إرسال البريد الإلكتروني    mail($orderData['email'], 'Order confirmed', 'Thank you!');        // تسجيل السجلات    file_put_contents('log.txt', 'Order processed: ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);        return ['status' => 'success'];}


هذه الدالة تنتهك مبدأ المسؤولية الواحدة (Single Responsibility Principle). فهي تقوم بالتحقق، والعمل مع قاعدة البيانات، وإرسال البريد، وتسجيل السجلات. أي تغيير في إحدى هذه العمليات سيتطلب تغيير الدالة بأكملها.



الحل: التقسيم إلى دوال صغيرة

// ✅ كود جيد: كل دالة مسؤولة عن إجراء واحدfunction validateOrderData(array $orderData): void {    if (empty($orderData['email'])) {        throw new InvalidArgumentException('Email is required');    }}

function saveOrderToDatabase(array $orderData): int { $pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', ''); $stmt = $pdo->prepare("INSERT INTO orders (email, total) VALUES (?, ?)"); $stmt->execute([$orderData['email'], $orderData['total']]); return (int)$pdo->lastInsertId();

المدونات

توصيات الكتب