أنماط التصميم في PHP: طريقك عشان تكتب كود نظيف واحترافي
أكيد مريت باللحظة اللي بتفتح فيها كود كنت كاتبه من 6 شهور وبدأت تسأل نفسك: هو أنا كنت بفكر في إيه لما كتبت ده؟ الكود متداخل، والتعديل فيه بقى كابوس، وأي إضافة بسيطة بتوقع الدنيا. ده الوجع الطبيعي لأي مبرمج بيكتب كود من غير ما يعتمد على أسس هندسية واضحة. هنا بيجي دور الـ (Design Patterns) أو أنماط التصميم. دي مش مجرد نظريات، دي "حلول جاهزة" لمشاكل برمجية اتكررت كتير، والناس العباقرة اللي سبقونا حطولنا "كتالوج" نمشي عليه.
Table of contents [Show]
يعني إيه أصلاً Design Patterns؟
هي ببساطة "وصفة" أو (Blueprint) لحل مشكلة متكررة في تصميم البرمجيات. بدل ما تخترع العجلة كل مرة، بتستخدم نمط معروف يخلي الكود بتاعك (Maintainable) يعني سهل الصيانة، و (Scalable) يعني يقدر يكبر معاك من غير ما ينهار.
1. نمط التصميم المفرد (Singleton Pattern)
تخيل إن عندك (Database Connection) وعاوز تتأكد إن النظام بتاعك بيفتح اتصال واحد بس طول فترة تشغيل السكريبت عشان يوفر في الموارد (Resources). الـ (Singleton) هنا بطل الحكاية، لأنه بيضمن إن الكلاس (Class) بتاعك ليه نسخة واحدة (Instance) بس في الذاكرة.
class Database {
private static $instance = null;
private function __construct() {}
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Database();
}
return self::$instance;
}
}
$db = Database::getInstance();
2. نمط المصنع (Factory Pattern)
أوقات بنحتاج ننشئ كائنات (Objects) مختلفة بناءً على معطيات معينة. بدل ما تعبي الكود بتاعك بـ (if/else) أو (switch) جوه الـ (Controllers)، الـ (Factory) بيعمل "مصنع" متخصص في إنتاج الكائنات اللي محتاجها. ده بيخلي الكود أنظف بكتير وبيسهل عليك إضافة أنواع جديدة في المستقبل.
interface Notification { public function send(); }
class Email implements Notification { public function send() { /* كود الإيميل */ } }
class SMS implements Notification { public function send() { /* كود الـ SMS */ } }
class NotificationFactory {
public static function create($type) {
if ($type == 'email') return new Email();
if ($type == 'sms') return new SMS();
}
}
3. نمط الاستراتيجية (Strategy Pattern)
ده واحد من أهم الأنماط. تخيل إنك بتعمل نظام دفع (Payment System) بيدعم فيزا، وباي بال، وتحويل بنكي. بدل ما تعمل (Class) عملاق فيه كل الطرق دي وتعدل عليه كل ما تضيف وسيلة جديدة، الـ (Strategy) بيخليك تفصل كل "استراتيجية" في كلاس منفصل، وبتبدل بينهم وقت التشغيل (Runtime).
interface PaymentStrategy { public function pay($amount); }
class VisaPayment implements PaymentStrategy { public function pay($amount) { /* كود الفيزا */ } }
class PaypalPayment implements PaymentStrategy { public function pay($amount) { /* كود الباي بال */ } }
class Checkout {
public function process(PaymentStrategy $payment, $amount) {
$payment->pay($amount);
}
}
نصيحة من أخ لمبرمج محترف
بلاش تقع في فخ "الإفراط في الهندسة" (Over-engineering). مش لازم تستخدم الـ (Design Patterns) في كل حتة وفي كل كود بسيط. استخدم النمط المناسب للمشكلة المناسبة. سر الاحتراف هو إنك تعرف امتى تطبق النمط وامتى الكود البسيط العادي يكون هو الحل الأمثل. ابدأ طبق نمط واحد في مشروعك الجاي، وشوف الفرق في راحة بالك لما تيجي تعدل الكود بعد فترة.