إن كنت تتعامل مع OOP فأنصحك أن تطلع على AOP أيضاً

لا شك أن الغالبية من المبرمجين يعرفوا ما هي الـ OOP Object Oriented Programming

التي يقابلها عدة ترجمات مثل :

البرمجة غرضية التوجه

أو البرمجة غرضية المنحى

أو البرمجة الشيئية

أو البرمجة الموجهة نحو الهدف

وما شابه ذلك

باختصار هي نمط برمجي ولا دخل للغة بها إلا من كون اللغة تدعم هذا النمط أو لا

وما نقصد بالنمط يعني طريقة أو أسلوب ما يستخدم في كتابة البرامج من خلال أي لغة تدعم هذا النمط

وللتوضيح سنضرب مثالا من حياتنا

فاللغات لدينا العربية والإنجليزية والفرنسية و غيرها الكثير

أما الأنماط فلدينا الكتابة العادية ولدينا الشعر ولدينا النثر ولدينا الحوار ولدينا عدة أنماط

ومن هنا فيمكن كتابة شعر باللغة العربية كما يمكننا كتابة الشعر بلغات أخرى تدعم كتابة الشعر

لن أخوض في شرح نمط الـ OOP فمصادرها أكثر من أن تحصى

ولكن فقط سأتطرق ما سيلزمنا لاستكمال الحديث عن AOP

في الـ OOP لدينا شيء اسمه كلاس Class يضم أعضاء عبارة عن خصائص Property و مناهج Method و أحداث Event و حقول Field

وكان الهدف الرئيسي هو تغليف مجموعة الأعضاء بفئة واحدة لها خصوصيتها

ومنطق AOP Aspect Oriented Programming والتي لها عدة ترجمات مثل :

البرمجة جانبية المنحى

أو البرمجة تقاطعية المنحى

أو البرمجة اعتراضية التوجه

وجاء هذا النمط لتلافي عدة سلبيات في نمط OOP

مثل تكرار الكود التشاركي

بمعنى لو أنني أريد حفظ العمليات التي تجري كأرشيف للمراجعة فأنا مطالب بزرع كود حفظ كل عملية في كل ميثود في كل كلاس وعندما أريد التعديل يجب أن أمر عليها جميعا لتعديلها

وقس على هذا الأمر مثلا كود التحقق من صلاحية المستخدم أو كود قياس زمن التنفيذ أو كود إرسال إشعار لمركز التنبيهات

وغيرها من الأكواد التي لا تتعلق بنوع الفئة أو المنهج

وقس عليه مثلا التقاط الأخطاء

وقس عليه بعض العمليات الافتتاحية من تهيئة القيم الأولية للبارمترات أو الخصائص

هذه الأمور تعتبر تشاركية و لا دخل لها بالهدف أي أنها تعتبر جانبية

ولهذا تجدونها أثناء تمثيل التطبيق كرسم طبقي على أنه في طبقة مستقلة عمودية مقابلة لكل الطبقات أي أنها مشتركة للكل

وطالما أنها ليست متعلقة بنوع الهدف أي ال كلاس Class أو أي من أعضاءه

إذا فهي تعتبر جانبية وتكرارها يعتبر سلبي من حيث زيادة الكود و إضاعة الوقت وحاجة أكبر للتصحيح مع احتمال الإصلاح في مكان ونسيان مكان آخر

من هنا جاءت فكرة نمط AOP أي البرمجة وفق المنحى الجانبي أو الاعتراضي وهو عزل كل ما هو تشاركي في مكان مستقل والإشارة إليه من حيث نريد أو زرعه حيث يكون

طبعا اللغات التي تعتمد نمط OOP بشكل كبير مثل #C لا تدعم نمط AOP بشكل مباشر أي لا تدعمه ضمنا

ولكن وجدت أطر عمل أو تطبيقات طرف ثالث وسيطة تضيف دعم النمط AOP إلى مثل هذه اللغات

منها ما هو مفتوح المصدر ومنها ما هو بشراء رخصة

خذ مثال شركة بوست شارب PostSHARP

http://www.postsharp.net

فهي تقدم إضافة وأدوات تدعم نمط AOP بشكل كامل

لديها ترخيص مجاني ولديها تراخيص متقدمة

وأنا استخدمها حاليا لأني بعد بحث وجدتها قوية جدا

حيث يقوم مبدأها على حشر الكود أثناء الترجمة

مثال :

أنا أريد أن أسجل كل عملية في سجل التغييرات

فيكفي أن أصرح عن منهج تقاطعي أو اعتراضي Aspect موروث من إحدى الفئات الجاهزة في المكتبة لديهم وتضع فيه الكود الذي تريد

وطبعا المنهج هو يرث الفئة Attribute وعليه

يكفي أن تضع اسم الفئة التي صنعتها فوق أي كلاس أو ميثود أو خاصية كأتربيوت Attribute ليتم حشر الكود ضمنه

طبعا يوجد عدة أنواع من الفئات الاعتراضية منها ما هو مخصص لاعتراض المناهج أثناء الدخول و الخروج وفي حال النجاح أو الفشل لتضع كودك في المكان المناسب

ويوجد أتربيوت Attribute خاص باعتراض المتغيرات والخصائص كأن يعترضها أثناء الكتابة أو القراءة لتضع كود فحص أو تعيين قيمة أو غيرها

كما يوجد شيء اسمه حشر بالجملة

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

فيكفي أن تصرح عن فئة اعتراض الاستثناء مرة واحدة

ثم تضع في ملف تعريف التطبيق أنك تريد تطبيقه على كل المناهج فيقوم هو بحشر الكود في الجميع

ومن هنا أي خطأ يحصل في أي مكان ودون الحاجة لاستخدام try catch سيمر على الكود الاعتراضي حاملا نوع الاستثناء ومكانه

وقس عليها مثلا يمكنك اعتراض المناهج بحيث تبدأ عداد الوقت أثناء الدخول و توقفه عند الخروج لتفحص أداء جميع المناهج وأين يستهلك الوقت

أو أن تضع عدادات ضمن المناهج لقياس مقدار التكرارات لتعرف ما هي المناهج التي يتم استدعاءها عدة مرات متعاقبة دون مبرر

ويوجد أنواع كثيرة من الاعتراضات تجدونها في الموقع المذكور

http://doc.postsharp.net/##conceptual-documentation

طبعا مفهوم AOP أوسع مما ذكرت ولكن أردت تبسيط الأمر لجعله كمفتاح لدخول هذا العالم ومن ثم يمكن التوسع إلى المفاهيم الأخرى داخله

عبد الرحمن أحمد

11-02-2014

دمتم بخير