في هذا الدرس البسيط، سنحاول تسليط الضوء على واحدة من أقوى التكنولوجيات المستخدمة في مجالات كثيرة ومن بينها خادمات البرمجيات (أو Application servers) والتي بموجبها يستطيع الخادم تغيير عمل برنامج اعطي له على شكل ملف مأرشف (jar, war, ...) من دون تغيير الكود سورس. وتغيير العمل يعني مثلا اضافة خصائص إلى هذا البرنامج لم تكن موجودة فيه كالـ Authentification, logging, Transaction management...
ما كل هذا التعقيد ؟؟!!!
طيب، خلينا نبسط الأمور إلى أقصى حد، ولنأخذ المثال الحلو والظريف التالي :
فلنفرض بأنه عندنا برنامج على شكل ملف jar، وأردنا اضافة شيء ما إلى هذا البرنامج مباشرة من دون تغيير كوده الداخلي.
مثلا عندنا البرنامج hello.jar (انظر في المرفقات) والذي يقوم بعرض العبارة التالية على الشاشة :
وأردنا اضافة تحية السلام قبل هذه العبارة (كما في الصورة أسفله)، وذلك من دون تغيير الكود سورس لهذا البرنامج :
اتضحت الصورة؟ طيب فما الحل؟
من بين الحلول المقترحة مثلا، هو استعمال أدوات الهندسة العكسية، غير أن تحويل البرنامج إلى كود سورس، اضافة التعديل ثم اعادة ترجمة البرنامج من جديد يأخذ وقت معتبر.
طيب، واحد آخر قد يقترح علينا استخدام الأدوات التي تستطيع النظر داخل مكونات البرنامج المترجم ثم اضافة التغييرات التي نريد. هذا حل سليم وهو مستعمل كثيرا، غير أنه ليس في متناول الجميع للتعقيد الكبير في التعامل مع الــ Bytecode.
طيب، فما رأيكم بأن نستعمل الـ : Aspect Oriented Programming.
ماهذا الكلام؟ ماذا نقصد بهاذي الــ AOP؟
وحدة وحدة,,,,
------------------------------------------------------------------------------------------------------------------------------------------------------------------
طيب,
لو نعود إلى برنامجنا الضحية hello.jar ، ولنفرض بأنه عندنا الكود سورس الخاص بهذا البرنامج وهو التالي :
فعرض عبارة السلام يعني اضافة تعليمة لعرض الجملة Salam aleekoum, قبل الجملة How are you? (أو في بداية الميثود main)، وبطريقة كودية، يجب بأن يكون لدينا البرنامج التالي :
ماذا لو كان عندنا برنامج يقوم بهذه الخدمة؟؟!! وعلى برامج مترجمة أصلا، وفي أثناء تنفيذ البرنامج!!
يعني تقدم له مثلا الطلب التالي وهو يقوم بالتنفيذ :
اقتباس"الله يرحم والديك! من فضلك! والله انت برنامج بن حلال (لست من جماعة القرصنة) ومعروف عليك تساعد الناس، لي عندي طلب بسيط لو تفظلت : قبل أن تنفذ الأوامر الموجودة في الميثود main للبرنامج hello قم باضافة عبارة تقوم بعرض تحية السلام".
لكن هذا البرنامج للأسف لا يفهم العربية، خليها اذن انجليزي :
اقتباسplease, before executing the main method, add the following code :System.out.println("Salam aleekoum,");
thanks
فماذا لو قلت لكم بأن هذا الأمر موجود فعلا، وهو ليس من أمور المشعوذين والسحرة :)
وهو ما نسميه الـ AspectJ.
وفي لغة الـ AspectJ نقوم بكتابة الطلب الذي عبرنا عنه فوق بالعربي ثم بالانجليزي كالتالي :
أنظروا كم هي سهلة اللغة التي يستعملها الـ AspectJ وكم هو قريب من لغة الجافا. في الحقيقة هو طبقة اضافية فوق الجافا.
------------------------------------------------------------------------------------------------------------------------------------------------------------------
فلنقم بتنظيم أوراقنا من جديد ولنضع المخطط التالي لكيفية عمل الــ AspectJ في هذه الحالة :
- لدينا البرنامج الضحية hello.jar (أو الكلاس Hello).
- لدينا الكود الذي سيحقن في مواقع معية في الكلاس Hello. والكود في هذه الحالة هو الأمر الذي يعرض تحية السلام، وموقع الحقن هو قبل بداية تنفيذ الميثود main (السطر 3).
- ولدينا في النهاية البرنامج الذي يقوم بعملية الحقن في المكان المناسب عند تشغيل البرنامج hello والذي هو الـ AspectJ. ويستعمل في هذا الحقنة HelloAspect.
انتهى، ماعليك سوى الضغط على الأبرة :S
أفضل بأن نتوقف هنا، ومن أراد تعلم عملية الحقن، فليتبع دروس الطبيب aspectJ :D
والله ولي التوفيق.
شكرا.