Reflection and Meta-Programming

أهلا بالجميع في كل مكان

تعرفنا سابقا علي ال object-oriented وكيفية بناء ال objects بطريقة منظمة سهلة عن طريق ال Nested structure أو ال Declarative programming

واليوم نتعرف علي موضوع بعنوان “Reflection and Meta-Programming” وهو ما يجعلنا نطور في اللغة ونعدل عليها بكل سهولة أثناء التشغيل (run time) – وذلك لان اللغة “dynamic language”.


ما معني reflection؟

تعني ان البرنامج قد يحتوي على بيانات ويستطيع عن طريقها ان يطور نفسه أو غيره من البرامج  ويعدل محتويات البرنامج ،ويغير بناءه وسلوكه أثناء التشغيل- وهذا المعني يعني ظهور تلك المحتويات بعد التعديل.

ما معني Meta-programming؟

تعني أن هناك برمجة تخضع لبرمجة أخري تتحكم فيها – وبالتالي نتعامل مع البرنامج كجزء من البيانات قابل للتعديل والتطوير فيه عن طريق برمجة أخري-وهذا المعني يعني التعديل والتحكم في البرنامج.

الشكل التالي يوضح الدوال المستخدمة في ال Meta-Programming

1.jpg

ونتعرف علي تلك الدوال من خلال برنامج صممته للتطبيق عليه.برنامج اختبار (مجموعة من الأسئلة الاختيارية) – والدرجة بناء علي الاجابات.

لفتح الكود الخاص بالبرنامج اضغط هنا

صور توضيحية للكود المكتوب:

3.jpg4.jpg


2.jpg


وفيما يلي شرح الدوال المستخدمة في التعرف والتطوير علي ال Variables وال attributes وال objects و ال methods و ال classes و ال packages و ال Functions في البرنامج.

Locals:تستخدم للحصول علي قائمة من المتغيرات المحلية.

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

IsLocal: لمعرفة اذا كانت أسماء المتغيرات المذكورة محلية”Local”  أو  لا.

  Islocal (CVariableName) --> returns 1 or 0 
(in (CVariableName تعني انه سلسلة حرفية c#

 

5.jpg


Globals: تستخدم للحصول علي قائمة من المتغيرات العامة.

IsGlobal: لمعرفة اذا كانت اسماء المتغيرات المذكورة عامة” النطاق العام”  أو  لا.

Islocal (cVariableName) --> returns 1 or 0

3.jpg

وهنا مقالة كاملة لشرح ال “Scopes” أو النطاقات المحلية والعامة


Packages: تستخدم للحصول علي قائمة تحتوي علي أسماء ال Packages.

IsPackage: لمعرفة اذا كان  الاسم المذكور عبارة عن Package أو لا.

Packagename: تستخدم للحصول علي اخر اسم Package -تم عمل import له.

PackageClasses: تستخدم للحصول علي قائمة تحتوي علي أسماء ال classes داخل ال Packages.

(Packageclasses (cPackageName

IsPackageClass: لمعرفة اذا كان  الاسم المذكور عبارة عن class داخل Package أو لا.

(Ispackageclass (cPackageName, cClassName

3.jpg


ObjectId: تستخدم للحصول على id لل Object .

Objectid (object) --> Returns the object id

IsObject: لمعرفة اذا كان  الاسم المذكور عبارة عن object أو لا.

4.jpg


Attributes:تستخدم للحصول علي قائمة تحتوي على ال attributes ل object .

Attributes (object) --> Returns a list contains the object attributes

IsAttribute:لمعرفة اذا كان  الاسم المذكور عبارة عن attribute ل object أو لا.

Isattribute (object, cAttributeName)  --> returns 1 or 0

IsPrivateAttribute:لمعرفة اذا كان  الاسم المذكور عبارة عن attribute خاص (Private) ل object أو لا.

5.jpg


GetAttribute:للحصول على قيم ال attributes ل object.

GetAttribute (oObject, cAttributeName) ---> Attribute Value

SetAttribute:لوضع قيم ال attributes ل objects.

(SetAttribute (oObject, cAttributeName, Value

AddAttribute: لإضافة attributes [أو قائمة من ال attributes] ل objects.

(AddAttribute (object, cAttributeName|aAttributesList

6.jpg


 

Methods:للحصول على قائمة تحتوي على ال methods  ل object.

Methods (object) --> Returns a list contains the object methods

IsMethod: لمعرفة اذا كان  الاسم المذكور عبارة عن method ل object أو لا.

(Ismethod (object, cMethodName

 

IsPrivateMethod:لمعرفة اذا كان  الاسم المذكور عبارة عن method خاص “Private” ل object أو لا.

(Isprivatemethod (object, cMethodName

AddMethod:تستخدم لإضافة method  ل object.

  •  أي object ينتمي لل class يستطيع استخدام هذا ال method المضاف.
(AddMethod (Object, cNewMethodName, cMethodName|AnonymousFunction

7.jpg


MergeMethods

  •  لمشاركة ال methods فقط دون ال attributes الموجودة في classes متعددة بدون وراثة.
  • بمجرد كتابة الدالة التي تدمج ال classes نستطيع استخدام ومشاركة ال methods بينهم.
(MergeMethods (cClassNameDestination, cClassNameSource

في المثال التالي تم الغاء عمل الوراثة واستبدالها ب MergeMethods”

2.jpg3.jpg


Classes:للحصول على قائمة تحتوي علي أسماء ال Classes في البرنامج.

IsClasses:لمعرفة اذا كان  الاسم المذكور عبارة عن class أو لا.

(Isclass (cClassName

ClassName:لمعرفة اسم ال class ل object .

Classname (object) --> Returns the object class name

4.jpg


Functions: تستخدم للحصول علي قائمة تحتوي علي أسماء الدوال.

ملحوظة:

  • استخدام  الدالة يكون خارج تعريف ال “Classes” في ال “Object-Oriented”. وما داخل ال “Classes” يسمي بال methods.

IsFunction: لمعرفة اذا كان  الاسم المذكور عبارة عن دالة أو لا.

Isfunction (cFunctionName) --> returns 1 or 0 

 CFunctions: تستخدم للحصول علي قائمة تحتوي علي أسماء الدوال في لغة رينج ومكتوبة بلغة c.

IsCFunction: لمعرفة اذا كان  الاسم المذكور عبارة عن دالة في لغة C أو لا.

المثال التالي تطبيق لتلك الدوال مع نفس البرنامج السابق ولكن بدون استخدام ال object-oriented.

لفتح الكود الخاص بالبرنامج اضغط هنا

2.jpg

وهنا مقالة كاملة عن الفرق بين ال “Function” وال “Methods” وال Scopes الخاص بهم


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

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

وشكرا لكم والي اللقاء

 

 

Advertisements

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

شعار وردبرس.كوم

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   /  تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   /  تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   /  تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   /  تغيير )

Connecting to %s