Software Engineering

ما وراء الكتاب المدرسي: تطبيق أنماط التصميم في معماريات البرمجيات الحديثة

غالبًا ما يُساء فهم أنماط التصميم على أنها قواعد صارمة أو "تعويذات سحرية" تضمن كتابة أكواد قابلة للتوسع. في الواقع، هي حلول مجربة للمشكلات المتكررة في تصميم البرمجيات. ومع ذلك، معرفة اسم النمط هي نصف المعركة فقط؛ فهم متى وكيف يتم تطبيقه دون مبالغة في الهندسة هو المكان الذي يُثبت فيه الكفاءة الحقيقية. يغوص هذا المقال في الفئات الثلاث الأساسية لأنماط التصميم—الإنشائية، والهيكلية، والسلوكية—مع التركيز على التطبيق العملي بدلاً من التعريفات النظرية فقط.

الأنماط الإنشائية: إدارة إنشاء الكائنات

تعنى الأنماط الإنشائية بآليات إنشاء الكائنات، وتسعى إلى إنشاء الكائنات بطريقة مناسبة للموقف. الأكثر شيوعًا هو طريقة المصنع (Factory Method). بدلاً من إنشاء الكائنات مباشرة، تطلب من مصنع أن ينشئها نيابةً عنك. هذا يفصل كود العميل عن الفئات الملموسة، مما يجعل النظام أكثر قابلية للتوسع.

class NotificationService {
    public send() { /* ... */ }
}

class EmailNotification extends NotificationService {
    public send() { console.log("Email sent"); }
}

class SMSService extends NotificationService {
    public send() { console.log("SMS sent"); }
}

class NotificationFactory {
    public static create(type: string): NotificationService {
        switch(type) {
            case 'email': return new EmailNotification();
            case 'sms': return new SMSService();
            default: throw new Error("Invalid type");
        }
    }
}

// Usage
const notifier = NotificationFactory.create('email');
notifier.send();

تسمح لك هذه المنهجية بإضافة أنواع إشعارات جديدة (مثل الإشعارات الدافعة) دون تعديل كود العميل الحالي، بما يتوافق مع مبدأ المفتوح/المغلق.

الأنماط الهيكلية: تركيب الكائنات والفئات

تتعلق الأنماط الهيكلية بكيفية تركيب الفئات والكائنات لتكوين هياكل أكبر. يُعد نمط الزينة (Decorator Pattern) مفضلاً لدى المطورين لأنه يتيح لك توسيع وظائف كائن فردي دون تعديل بنيته. غالبًا ما يكون هذا بديلاً أفضل من الوراثة عندما تحتاج إلى إضافة مسؤوليات ديناميكيًا.

interface Coffee {
    cost(): number;
    description(): string;
}

class BasicCoffee implements Coffee {
    cost() { return 1.50; }
    description() { return "Black Coffee"; }
}

class MilkDecorator implements Coffee {
    private component: Coffee;
    constructor(component: Coffee) { this.component = component; }

    cost() { return this.component.cost() + 0.50; }
    description() { return this.component.description() + " + Milk"; }
}

class SugarDecorator implements Coffee {
    private component: Coffee;
    constructor(component: Coffee) { this.component = component; }

    cost() { return this.component.cost() + 0.10; }
    description() { return this.component.description() + " + Sugar"; }
}

const coffee = new SugarDecorator(new MilkDecorator(new BasicCoffee()));
console.log(coffee.description()); // "Black Coffee + Milk + Sugar"

الأنماط السلوكية: التواصل بين الكائنات

تتعلق الأنماط السلوكية بالخوارزميات وتوزيع المسؤوليات بين الكائنات. يتيح لك نمط الاستراتيجية (Strategy Pattern) تعريف عائلة من الخوارزميات، وتغليف كل منها، وجعلها قابلة للاستبدال وقت التشغيل. هذا مثالي للسيناريوهات التي يحتاج فيها سلوك الكائن إلى التغيير بناءً على السياق، مثل خوارزميات الفرز المختلفة أو طرق معالجة الدفع.

interface PaymentStrategy {
    pay(amount: number): void;
}

class CreditCardPayment implements PaymentStrategy {
    pay(amount: number) { console.log(`Paid $${amount} via Credit Card`); }
}

class PayPalPayment implements PaymentStrategy {
    pay(amount: number) { console.log(`Paid $${amount} via PayPal`); }
}

class ShoppingCart {
    private paymentStrategy: PaymentStrategy;

    setPaymentMethod(strategy: PaymentStrategy) {
        this.paymentStrategy = strategy;
    }

    checkout(amount: number) {
        this.paymentStrategy.pay(amount);
    }
}

الخاتمة

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

Share: