الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الإنعكاسات

بدأه mhewedy في 14 مارس 2012 · 2 رد · 872 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

ترجمة مقال من ويكيبيديا عن الإنعكاسيه (بتصريف)

المصدر http://en.wikipedia.org/wiki/Reflection_(computer_programming)

بسم الله نبدأ ...

تعريف

الإنعكاسيه هي كلمة تطلق على العمليه التي يقوم فيها البرنامج بتعديل هيكله الداخلى و عملياته في وقت التشغيل.

في العديد المعماريات (Architectures) يتم تخزين تعليمات البرامج (Instructions) كبيانات (Data) و من هنا يتجلى الفارق بين البيانات و التعليمات في الطريقه التي يتم معالجة كل منهما بالحاسوب و بلغة البرمجه.

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

إذن لكى تكون لغة برمجه ما قادره على تبنى مبدأ الإنعكاسيه فإنها يلزمها معالجة تعليماتها البرمجيه (عوضا عن تنفيذها) و لذا نجد أن الإنعكاسيه تكون واضحه و جليه في اللغات العاليه المستوى المبينه على حاسوب وهمى (Virtual Machine) - مثل Smalltalk - و اللغات الإسكربتيه وتكون موجوده بقله أو معدومه في اللغات ذات الطابع المترجم و التى تستخدم الأنواع الساكنه (static typing) - مثل السى و الجافا و Haskell.

الإستخدامات

الإنعكاسيه تستخدم لقراءه أو تعديل بنية البرنامج في وقت التشغيل.

ففي الجافا على سيبل المثال فإن الإنعكاسيه تمكنا من معرفة معلومات عن الفئات (classes) و الواجهات (interfaces) و الحقول و الدوال في وقت التشغيل ... أيضا يمكننا إنشاء كائنات جديده في وقت التشغيل. لاحظ أنك في الجافا تستطيع فحص بينة البرنامج دون التعديل فيها (فهى ليست لغة كاملة الإنعكاسيه على عكس لغات أخري كالجافا-إسكربت مثلا). و إن كانت الإنعكاسية في الجافا تؤثر في أداء البرنامج (حتى و لو بقدر 1% فهى لاتزال تؤثر على الأداء).

أيضا ربما نجد بعض اللغات المترجمه تقدم لنا الإنعكاسيه .. فعلي سبيل المثال Objective-c تعتمد على ال runtime system الخاص بها لمدنا بكل المعلومات التى نجتاجها .. فالملف التنفيذي لل Objective-c يتحتوى على الكثير من المعلومات حول أسماء الدوال و غيرها. أما اللغات المترجمه التى تسمح بإنشاء دوال جديده في قوت التشغيل مثل Common Lisp فإنها ال runtime-system يجب عليه أن يتضمن مترجم أو مفسر.

أمثله

سنعرض مثال يقوم بإنشاء كائن من فئة إسمها Foo و يستدعى الداله hello في عدة لغات برمجيه:

Javascript

// بدون إنعكاسيه
new Foo().hello()

// بالإنعكاسيه
new (eval('Foo'))()['hello']()
// أو 
eval('new Foo().hello()')

جافا

// بدون إنعكاسيه
new Foo().hello();

// بالإنعكاسيه
Class<?> clazz = Class.forName("Foo");
clazz.getMethod("hello").invoke(clazz.newInstance());

PHP

// بدون إنعكاسيه
$foo = new Foo();
$foo->hello();

// بإستخدام الإنعكاسيه
$reflector = new ReflectionClass('Foo');
$foo = $reflector->newInstance();
$hello = $reflector->getMethod('hello');
$hello->invoke($foo);

// بإستخدام ال callbacks
$foo = new Foo();
call_user_func(array($foo, 'hello'));

تمت بحمد الله.

تم تعديل هذه المشاركة بواسطة __Unknown في 14 مارس 2012 في 14:05

1
#2

+1

أشكرك جدا من زمان ودي اعرف المفهوم هذا وانتا اختصرت علينا الكثير بشرحك الرائع

تم تعديل هذه المشاركة بواسطة بـارع في 14 مارس 2012 في 15:57

#3

مقالة رائعة ومعلومات جديدة

شكرا لك :)


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳