البرمجيات المظهرية التوجه
برمجيات مظهريه توجه
Aspect-oriented software development -
غيداء ربداوي
تطوير البرمجيات المظهرية التوجه
أدوات وبيئات للبرمجة المظهرية التوجه
عندما ظهرت فلسفة بناء النظم البرمجية الغرضية التوجه وتطويرها Object-Oriented Software Development (OOSD) ظن الجميع أن جميع مشاكل بناء البرمجيات قد حُلَّت؛ غير أن الواقع أثبت أن لكل تقنية نواقصها، وقد تكفي في حالة معيّنة، غير أنها لا تكون كافية في أحوال أخرى. يُعدّ تطوير البرمجيات المظهرية التوجه dAspect-Oriente (Software Development (AOSD أحد التطورات التي ظهرت؛ لتسد نقصاً في التطوير الغرضي التوجه للبرمجيات. ويُعدّ جريجور كيكزاليس Gregor Kiczales من الرواد الذين عملوا على تطويرِ مفاهيم البرمجة المظهرية التوجه وصنعِ تنجيز لها في مركز الأبحاث زيروكس في بال ألتو Xerox Palo Alto Research Center (PARC) خلال الفترة 1984- 1999.
ستتوضح المفاهيم الأساسية من خلال المثال الآتي: يُفترض أنه يوجد في مؤسسة ما نظام برمجي كبير، يتضمن وظيفة لإدارة الموظفين ورواتبهم. يطلب المدير أن تعدّل البرمجية بحيث يسجّل النظام كل تغيير يطرأ على معطيات أي موظف، سواء ما يطرأ على الراتب من حسميات أو زيادات أو عمل إضافي أو غير ذلك؛ أم ما يطرأ على المعطيات الخاصة بالموظف نفسه كتغيير التسمية الوظيفية أوالمعلومات الشخصية، وتسجّل هذه التغييرات في سجل (ملف) خاص. كيف يمكن تحقيق هذا المتطلب؟ قد يقوم معظم المبرمجين بمراجعة الرماز المكتوب في هذه البرمجية، وفي المواضع المناسبة يُدرِجون استدعاءً للطريقة المسؤولة عن الكتابة في السجل الخاص. في معظم النظم، سيُدرَج هذا الاستدعاء في العديد من المواضع؛ مما يُعدّ عبئاً على المبرمج، ويأخذ وقتاً لاستعراض كامل الرماز، ويتطلب إعادة ترجمة رماز التطبيق، هذا بافتراض أن المبرمج لم ينسَ بعض المواضع! إذا كان النظام غرضي التوجه؛ قد يخطر ببال المطوّر أن يصنع صفاً يدير الكتابة في السجل، ويستخدم غرضاً منه للتعامل مع عملية الكتابة. غير أنّه عندها يُحتاج إلى هرمية من الصفوف المشتقة من هذا الصف لمعالجة تسجيل التعديلات في الأنواع المختلفة من الملفات وقواعد المعطيات. تتعامل هذه الهرمية مع هرمية الصفوف المطورة أصلاً لهذا النظام؛ مما يُعدّ تعقيداً كبيراً في البنية.
تندرج مسألة الكتابة في سجل التغييرات تحت ما يسمى الاهتمام المشترك بين الأغراض أو «الاهتمام الشامل» cross-cutting concern. يوجد العديد من الأمثلة على مفهوم الاهتمام الشامل، مثل: إدارة الأمن security في النظام، أو صنع لائحة للنظام profiling تبين أين يقضي النظام معظم الوقت عند التنفيذ، أو التعقب tracing لمعرفة أي طريقة يجري استدعاؤها ومتى، وتعقب الجلسات session tracking، وجميعها تحتاج إلى طرائق (عمليات) تتوزع في معظم الأغراض؛ لأنها تهمّها جميعاً.
لمعالجة المسائل ذات الاهتمام الشامل من دون اللجوء إلى الإدراج اليدوي للرماز أو بناء هرمية جديدة تتفاعل مع الهرمية الأصلية؛ اقتُرحت فكرة البرمجة المظهرية التوجه
(aspect-oriented programming (AOP، وهي تقدم آلية تدعى المظهر aspect. والمظاهر وحدات إضافية يجري ضمنها تنجيز الاهتمامات المشتركة بين الصفوف بدلاً من دمجها في الصفوف الأصلية.
يبين الشكل (1) أن جميع الأغراض (الجدول، بطاقة الدخول، المالية) تهتم بالأمن والتعقب. وفق النموذج الغرضي التوجه؛ يجب إدراج هذه الاهتمامات في كل منها:
الشكل (1) الاهتمامات المشتركة بين الأغراض مكررة في رماز كل غرض. |
في بناء وحدات جديدة (هي المظاهر) تُستخدم البرمجة المظهرية التوجه، وهي تهتم بالأمن والتعقب، كما يظهر في الشكل (2)، ثم تُدمج بطريقة خاصة مع الأغراض المبنية آنفاً، فينتج التطبيق المطلوب.
الشكل (2) الاهتمامات المشتركة بين الأغراض أصبحت معزولة في وحدات خاصة. |
تطوير البرمجيات المظهرية التوجه
يُعرَّف تطوير البرمجيات المظهرية التوجه بأنه المنهجية ومجموعة التقنيات والمفاهيم التي تعالج موضوع فصل الاهتمامات separation of concerns المشار إليه آنفاً، وهو مبدأ تصميمي أساس، ويعني أن يجريَ تصميمُ المكون البرمجي بحيث يقوم بعملٍ واحد فقط. أما الاهتمامات الشاملة -وهي في عمومها متطلبات غير وظيفية- فيجري تنجيزها على أنها «مظاهر».
إن أهم خصائص البرمجة المظهرية التوجه AOP أنها لا تحل محل النموذج الغرضي التوجه OOP، بل تدعمه لتحسين قدرته على التعبير، وتزيد فائدته. إنها تزيد من القدرة على فصل الاهتمامات الشاملة المختلفة عن رماز الطرائق، وتسمح بالتعبير عن كل من هذه الاهتمامات في بنية تسمى المظهر؛ مما ينتج برمجيات أفضل تصميماً، وأكثر قابلية للصيانة، كما يبين الشكل (3).
الشكل (3) الفرق بين التوجهين الغرضي والمظهري في توزع أجزاء الرماز. |
مصطلحات:
قبل الدخول في آلية دمج المظاهر مع الأغراض؛ لابد من التطرق إلى بعض المصطلحات التي تخص هذه البرمجيات:
- نقطة ضم join point: هي مواضع محددة في رماز البرنامج الأصلي يتقاطع فيها أحد الاهتمامات مع التطبيق البرمجي؛ بمعنى آخر: هي المواضع التي يجب أن يُضمّ «المظهر» إليها.
- نقطة فاصلة pointcut: هي مجموعة معرفة جيداً من نقاط الضم.
- النصيحة advice: هو الرماز الذي يجب تنفيذه في النقطة الفاصلة.
تعرّف المظاهر كما سيرد لاحقاً بدلالة النقاط الفاصلة والنصائح.
لا بد من تعرّف مراحل العمل اللازم اتباعها لبناء المظاهر ودمجها مع المكونات الأخرى. يمر العمل بثلاث خطوات:
1- تحديد نقاط الضم وتجميعها في نقاط فاصلة، وذلك بهدف تحديد المواضع التي يجب أن يُدرج فيها رماز المظهر.
2- كتابة الرماز الخاص بالمظهر.
3- دمج رماز المظهر مع الرماز الأصلي للتطبيق، وهنا تتم عملية ترجمة سبقية تسمى نسج المظاهر aspect weaving يتم فيها ربط المظاهر مع الرماز المصدري باستخدام الناسج weaver. يبين الشكل(4) الآلية المعتمدة للحصول على البرنامج التنفيذي في حال وجدت مظاهر أو لا. ففي حال عدم وجود مظاهر كما في (أ)؛ تجري ترجمة الرماز المصدري باستخدام المترجم للحصول على البرنامج التنفيذي، أما عند وجود المظاهر كما في (ب)؛ فيستخدم الناسج أولاً لربط المظاهر مع الرماز، ثم تأتي مرحلة الترجمة النهائية للحصول على البرنامج التنفيذي.
الشكل (4)
(أ): استخدام المترجم لتوليد البرنامج التنفيذي من دون مظاهر.
(ب): استخدام الناسج لربط الرماز مع المظاهر قبل توليد البرنامج التنفيذي.
ستُطبَّق هذه الخطوات على المثال السابق لكتابة التغييرات الطارئة على الموظف في سجل التغييرات. سيُستخدَم تنجيز للبرمجة المظهرية التوجه يسمى AspectJ، وهو أفضل تنجيزات البرمجة المظهرية التوجه وأكثرها انتشاراً.
يبين الشكل (5) طريقة لتصميم التعديلات التي ستُجرى على النظام. يمتلك نظام المالية Finance واجهةً وعدة طرائق لتحديث المعطيات المالية للموظف. يبدأ اسم جميع هذه الطرائق بالكلمة update (مثل: updateFederalTaxInfo)، وتأخذ كل طريقة من الطرائق المالية وسيطاً من نوع موظف. أما المعلومات الشخصية للموظف؛ فتحدّثها الطرائق الموجودة في كل غرض من الصف Employee.
الشكل (5) الصفوف المعنية بتحديث معلومات الموظف.
عندما يُراد إجراء تعديل على إحدى المعلومات؛ تستدعى التوابع المتعلقة بها، وعندما يتم التعديل يُكتب في سجل التعديلات عبارة مناسبة. في هذا الجزء سيُفترض للتبسيط أن الكتابة تتم على شاشة المستخدم؛ في حين أنها في الحقيقة ستكون في سجل خاص. في AspectJ تمر خطوات ثلاث:
1- تحديد نقاط الضم وتجميعها في نقاط فاصلة: تُحدَّد نقطتان فاصلتان، إحداهما تجمع نقاط الضم في الصف employee؛ والأخرى؛ تجمع نقاط الضم في iemployeefinance، ويُعطى لكلّ نقطة فاصلة اسم معرّف لها. تبين أسطر الرماز التالية هذه الخطوة:
pointcut employee Updates(Employee e):
call(public void Employee.update*Info()) && target(e);
pointcut employee FinanceUpdates(Employee e) :
call (public void update*Info(Employee)) && args(e);
سُميت النقطة الفاصلة الأولى في هذا الرمازupdates employee؛ وهي تصف جميع نقاط الضم التي تُستدعى فيها إحدى طرائق الغرض employee التي تبدأ بالكلمة update، وتنتهي بالكلمة Info، ولا تأخذ أي موسطات. أما النقطة الفاصلة الثانية فتسمى employeeFinanceUpdates، وهي تصف جميع نقاط الضم التي تُستدعى فيها أي طريقة تبدأ بالكلمة update، وتنتهي بالكلمة Info، وتأخذ موسطاً من الصف Employee. تعرّف هاتان النقطتان الفاصلتان جميع نقاط الضم التي يُهتمّ بها. في حال إضافة طرائق أخرى للتعديل سواءً إلى الصف
Employee أم إلى المكون EmployeeFinance؛ فالنقطتان الفاصلتان ستمكّن من استدعاء الطرائق الجديدة شريطة أن تكون هذه الطرائق قد سميت بمراعاة اصطلاحات التسمية التي أشير إليها، وهكذا لا حاجة إلى إدراج رماز جديد للتسجيل في حال أضيفت طرائق جديدة للتعديل.2- كتابة الرماز الخاص بالتسجيل: يكتب هذا الرماز ضمن ما يسمى «مظهراً»، وهو الآلية التي يُغلّف بها اهتمام شامل محدد. إن كتابة المظهر يشبه كتابة أي طريقة في لغة جافا، مع إضافة الكلمة المفتاحية aspect لتحديد نوع الطريقة. تبين أسطر الرماز التالية كيفية كتابة المظهر الخاص بالتسجيل:
public aspect EmployeeChangeLogger
pointcut employeeUpdates(Employee e) : call
public void Employee.update*Info())
&& target(e);
pointcut employeeFinanceUpdates(Employee e) : call
public void update*Info(Employee))
&& args(e);
after(Employee e) returning : employeeUpdates(e)
|| employeeFinanceUpdates(e)
System.out.println(“\t>Employee : “ +e.getName
“ has had a change “
System.out.println(“\t>Changed by “
thisJoinPoint.getSignature
من الواضح أن بنية المظهر تشبه بنية الصف في جافا. يوضع المظهر عادة في ملف مستقل كما يوضع كل صف في جافا في ملف مستقل. يُلاحظ هنا إدراج الرماز الخاص بالنقطتين الفاصلتين اللتين عُرِّفتا في الخطوة السابقة.
بعد النقطتين الفاصلتين توجد بضعة أسطر من الرماز تشبه في شكلها طريقة من الطرائق المكتوبة بلغة جافا، وهي تمثل ما سمي «النصيحة»؛ أي الرماز الذي سينفذ عند نقاط الضم. هناك ثلاثة أنواع من النصائح: قبل before، بعد after، حول around، وهي تنفذ قبل نقطة الضم أو بعدها أو بدلاً منها على الترتيب. وقد تم في المثال الكتابة في السجل مباشرة بعد التعديل.
3- ترجمة رماز التسجيل ودمجه مع الرماز الأصلي للتطبيق: قبل ترجمة الرماز المتعلق بالصفوف والمكونات في المشروع البرمجي؛ يضاف رماز المظاهر، ثم يُطلب من المترجم الخاص بـ Aspectوالمسمى ajc أن يترجم الرماز. يأخذ المترجم كل مظهر، وينشئ ملفاً يتضمن رماز النصيحة، ثم تجري حياكة هذا الرماز مع رماز الصفوف الأصلية. يمثل الشكل (6)هذه العملية.
الشكل (6) حياكة رماز المظاهر مع البرنامج الأصليّ للحصول على النظام النهائي.
والآن، يُكتب البرنامج الاختباري التالي:public static void main(String[] args) {
Employee e = new Employee(“Chris Smith”);
// Do something to change some of the employee’s
// information here.
e.updateJobInfo();
e.updateOfficeInfo();
EmployeeFinance.updateFederalTaxInfo(e);
EmployeeFinance.updateStateTaxInfo(e);
بعد ترجمة المشروع باستخدام مترجم AspectJ ثم تنفيذه يتم الحصول على الخرج التالي:
Updating job information
>Employee : Chris Smith has had a change
>Changed by void
employee.Employee.updateJobInfo()
Updating office information
>Employee : Chris Smith has had a change
>Changed by void
employee.Employee.updateOfficeInfo()
Updating federal tax information
>Employee : Chris Smith has had a change
>Changed by void
employee.EmployeeFinance.updateFederalTaxInfo(Employee)
Updating state tax information
>Employee : Chris Smith has had a change
>Changed by void
employee.EmployeeFinance.updateStateTaxInfo(Employee)
من الملاحظ عند كل عملية update؛ تُرسل رسالة إلى السجل (وهو في هذا المثال شاشة المستخدم) تبين التعديل الحاصل، وهذا بفضل حياكة المظهر المسؤول عن الكتابة في السجل مع الأغراض التي تمثل البرنامج الأصلي.
ذُكر آنفاً أن البرمجة المظهرية التوجه تسمح بتحديد الاهتمامات الشاملة وحصرها وتغليفها؛ مما يسهّل تطوير النظام وصيانته. يمكن باستخدام المظاهر إضافة خصائص جديدة إلى النظام إضافةً منهجية ومنظّمة من دون المساس برمازه الأصلي أو إيقافه لإجراء التعديلات. كما يُعدّ استخدام AOPإضافة قيّمة إلى أدوات التطوير والاختبار؛ إذ يتيح اختبار التطبيق من دون التداخل مع الرماز.
غير أن استخدام AOP لا يخلو من المخاطر، فكيف سيندرج هذا التوجه الجديد ضمن إجرائية التطوير؟ تعتمد بعض إجرائيات التطوير على تفتيش الرماز والمراجعات التقنية بهدف البحث عن الأعطال الموجودة في النظام، وفيها يستعرض المفتشون الرماز كاملاً للتحقق من تلبيته للمتطلبات. في البرمجة الغرضية التوجه يجري فحص الصفوف كاملة مع العلم بأن كل صف يتضمن كامل الوظائف التي يحتاج إليها النظام. إن استخدام AOP يمكن من اختبار بعض الوظائف، في حين سيتم لاحقاً إضافة مظاهر قد يؤدي تكاملها مع الأغراض إلى توليد أخطاء. وقد يضاف رماز النصيحة إلى رماز التطبيق الأصلي؛ غير أنه قد يحل محله في بعض الحالات. لذا يجب فحص الرماز الخاص بكل صف ورماز كل مظهر يحتمل إضافته إلى التطبيق، وهذا غير منطقي؛ لأن المظاهر قد تدرج في مراحل متقدمة! فهو إذاً رماز غير مكتمل للتطبيق! يبدو الأمر معاكساً لما يُفعل عندما يُستخدم OOP؛ إذ يتمّ بناء الصف ثم اختباره، ثم اختبار تكامله مع الصفوف الأخرى، أمّا في AOP فيُتوقع الإضافات التي قد تطرأ على النظام، ويُدرس أثر المظاهر المحتمل إضافتها إلى كل نقطة ضم في الصفوف الموجودة.
أدوات وبيئات للبرمجة المظهرية التوجه
يوجد العديد من اللغات المظهرية التوجه المدعمة بأطر عمل، يُذكر منها:
AspectJ: وهي اللغة التي استخدمت في شرح المثال آنفاً، وهي توسعة للغة جافا باستخدام مفاهيم تتعلق بفصل الاهتمامات والمظاهر
.(www.eclipse.aspectj/org)
Spring: تستخدم المظاهر لإضافة خدمات تصريحية خاصة بالشركة إلى إطار عمل J2EE، وتسمح للمستخدمين بتنجيز مظاهر مناسبة (www.springframework.org).
JBossAOP: يقدم إطار عمل للمظاهر في جافا يتضمن مظاهر معدّة سلفاً للاتصال غير المتزامن والمداولات والأمن والتخبئة (jboss.com/products/aop)
AspectC++: يدعم البرمجة المظهرية التوجه في ++C (www.aspectc.org).
Aspecthttps://mail.arab-ency.com.sy/scitech/details/169275#: هو إطار عمل مظهري التوجه خاص بالبنية الأساسية للغة المشتركة لميكروسوفت Microsoft Common Language Infrastructure
(www.castleproject.org/index.php/AspectSharp).
تتضمن هذه اللغات وأطر العمل المشار إليها آنفاً أدوات دعم التطوير وتنقيح الرماز.
مراجع للاستزادة:
-J. D. Gradecki and N. Lesiecki, Mastering AspectJ, John Wiley, 2003.
- Communications of the ACM, October 2001, many
articles on AOSD.-N. Lesiecki , Improve Modularity with Aspect-oriented Programming, http://www-106.ibm.com/developerworks/java/library/j-aspectj/.
- N. Lesiecki , Test Flexibility with AspectJ and Mock Objects, http://www-106.ibm.com/developerworks/java/library/aspectj2/?open&l=007
- التصنيف : كهرباء وحاسوب - النوع : كهرباء وحاسوب - المجلد : المجلد الرابع مشاركة :