• 0
VB Helper

Dynamic Programming

سؤال

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

ان تطور الكثير من اللغات مثل الـ Ruby والـ Python وكثرة استخدام الجافا سكربت اثارت الكثير من الاهتمام للبرمجة الديناميكية. بدأت السي شارب طريقها إلى "dynamic" في الاصدارات السابقة للدوت نت وذلك من خلال الكلمة المحجوزه var والاجراءات المجهولة anonymous methods

في الإصدار الرابع تم اضافت النوع dynamic, بالرغم من ان السي شارب مازالت لغة statically typed, فتلك الاضافات اعطتها القدرة الديناميكية التي يبحث عنها بعض المطورين

النوع dynamic يسمح لك بكتابة كود يتعدى مرحلة فحص المترجم, بمعنى اخر ان المترجم يفترض ان اي عملية معرفة على الكائن من النوع dynamic صحيحة. فإذا كانت العملية غير صحيحة لايتم اكتشافها إلا في زمن التشغيل, وهذا يتضح في المثال التالي


Calculator calc = GetCalculator();
int sum = calc.Add(12, 25);

في المثال اعلاه لنفترض ان لدينا الاجراء GetCalculator الذي يرجع كائن من نوع Calculator وبالتأكيد سيتعرف المترجم على الاجراء Add داخل الفئة نفسها لوجود فئة CLR ضمن المشروع ,ومن ثم سيتم تمرير الوسيطين 12 و 25 وجمعها وبعدها سيتم ارجاع النتيجة في المتغير sum

لنتخيل عدم وجود فئة CLR في المشروع, فما العمل؟!! فأكيد من خبرتنا في اللغة سيتم كتابة كود باستخدام الـ Reflection على النحو التالي

object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, calc, new object[] { 12, 25 });
int sum = Convert.ToInt32(res);

سنلاحظ في المثال اعلاه ان تم تعريف كائن من نوع object ومن ثم تم جلب نوعه عبر الاجراء GetType واخيرا تم استدعاء الاجراء InvokeMember ليتم تمرير اسم الاجراء كنص والمتغيرات التي ستمرر لها, واخيرا تم تحويل المرجع الى نوع صحيح وحفظه في المتغير sum

وهو نفس الحال لو كان الكائن Calculator معرف ضمن الجافاسكربت

ScriptObject calc=GetCalculator();
object res=calc.Invoke("Add",12,25);
int sum=Convert.ToInt32(res);

سنلاحظ تم تعريف كائن من نوع ScriptObject ليتم حفظ النوع المرجع من ثم استدعاء الاجراء Add وتمرير وسائطه عبر الاجراء Invoke واخير تحويل الناتج الى نوع صحيح وحفظه في المتغير sum

اما الان تم توحيد جميع الطرق السابقة ليتم معاملة الكائنات الديناميكية بصورة ستاتيكية

dynamic calc = GetCalculator();
int sum = calc.Add(12, 25);

فقد تم تعريف المتغير calc من نوع dynamic والان يمكننا كتابة اي شيء بعد calc. ولقد تم كتابة الاجراء Add بالرغم انه المترجم لن يتنبأ بذلك .. لماذا؟!! لأنه في الاساس لن يتم التعرف على النوع calc الا في زمن التشغيل, وحينها سيقوم المترجم بالتأكد من صحة وجود الاجراء Add وتحويل القيمة اوتوماتيكيا الى نوع صحيح وسيتم فظها في المتغير sum

5

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

8 إجابة على هذا السؤال .

  • 0

شكرا ً لك استاذنا VB Helper

افهم من كلامك انه يستخدم Dynamic في حالة عدم عدم وجود فئة CLR

فهي تغني عن استخدام الـ Reflection

حسنا ً في حالة وجود فئة CLR هل يفضل استخدام Dynamic وهل هي سريعة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

اخي M.B.O البرمجة الديناميكية تغني عن عمل الكود المضجر باستخدام الـ Reflection, اما اذا كنت تتعامل مع فئة لها كود CLR فلا افضل الديناميك من عدة نواحي: Error Checking, Debugging, Tooling والكثير الكثير

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا ً لك استاذنا الغالي على الاجابة :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

لاشكر على واجب .. بالتوفيق ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

اخي M.B.O البرمجة الديناميكية تغني عن عمل الكود المضجر باستخدام الـ Reflection, اما اذا كنت تتعامل مع فئة لها كود CLR فلا افضل الديناميك من عدة نواحي: Error Checking, Debugging, Tooling والكثير الكثير

بالفعل انه كود مزعج .. شخصيا عانيت منه كثيرا .. GetType و ReadValue و InvokeMember و SetValue بصراحة شي مقيت تماما. و الـ dynamic type كان خطوة قوية باتجاه الكود الديناميكي متل ما تفضلت أخي الكريم.

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تطوير مهم للغة ولكن أظن له عدة سلبيات منها ماذا لو تم نسيان التعريف عن الفئة او برمجتها وتم إستدعائها في مرحلة من المراحل أكيد في الترمجة لن يتم إعتبارها كخطأ لأنه سيتم تجاوزها إلى وقت التنفيذ وهنا المشكلة تخيل معي مشروع كبير جدا أين ستعرف الخطأ إذا نسيت أي فئة لم تعرفها ؟

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

 

اخي بالتأكيد الـ Static Type افضل بكثير من الـ Dynamic Type, ولكن في الاماكن التي تعجز فيها عن استخدامها يمكنك استخدام الـ Dynamic Programming

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله يعطيك العافية ... أخي للأمانة العلمية بس أحب نصحح الملصطلحات

مصطلح Dynamic Programming هو فرع من الرياضيات يهتم بحل مسائل الأمثلية Optimization وبحوث العمليات Operation Research

مصطلح أن اللغة Static Type هو في الواقع Strongly Typed حيث Static Type تعني استخدام الكلمة المفتاحية static مع الكلاس

الكلمة المفتاحية var مختلفة تماما عن dynamic لأن var ميزة من بيئة visual studio حيث يقوم المفسر compiler بتخمين نوع المتحول أي أن النوع محدد تماما وليس object ولا dynamic

 

شكرا جزيلا لكم

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .