Reflection and Meta-Programming

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

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

واليوم نتعرف علي موضوع بعنوان “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:تستخدم للحصول علي قائمة من المتغيرات المحلية.

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

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

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

 

5.jpg


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

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

Islocal (cVariableName) --> returns 1 or 0

3.jpg

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

Scope Rules for Variables and Attributes


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 الموجودة في 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”.

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

Isfunction (cFunctionName) --> returns 1 or 0 

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

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

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

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

2.jpg

اللينك التالي يوضح الفرق بين ال “Function” وال “Methods”

Scope Rules for Functions and Methods


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

ونختم مقالتنا الان والي لقاء اخر.

والسلام عليكم ورحمة الله وبركاته

المقالات الاخري من هذا اللينك: المحتوي

موقع اللغة: http://ring-lang.net

 

Advertisements

اترك رد

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

WordPress.com Logo

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

صورة تويتر

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

Facebook photo

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

Google+ photo

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

Connecting to %s