RSS

المميزات الجديدة في لغة dynamic keyword – C# 4.0 الجزء الثاني

01 May

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

سوف اكمل في هذه المقالة الحديث عن (dynamic Keyword) والتي قمت بتعريفها سابقا في الجزء الاول فلنبدء على بركة الله بشرح القيمة الحقيقة وراء هذه الاضافة الجديدة .

لنفرض مثلا ان لديك دالة (Method) إسمها GetCalculatorهذه الدالة تقوم بارجاع فصيلة (Class) من نوع  حاسبة (Calculator) تحتوي على دالة إسمها (Add) هذه الدالة تقوم بارجاع الناتج من جمع رقمين كالتالي

Calculator calc = GetCalculator();
int sum = calc.Add(10, 20);

طبعا المثال السابق بسيط جدا ولكن لنفترض الان ان الدالة (GetCalculator) تقوم بارجاع نوع غير معروف بالنسبة اليك او ان المترجم (Compiler) لايستطيع التعرف على النوع الحقيقي فمالذي يمكن فعله في هذه الحالة ؟

طبعا الجواب بسيط وهو باستخدام دوال الانعكاس (Reflections) كما هو موضح في

المثال التالي

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

ملاحظة: هذه الاشياء تواجهك اذا كانت تتعامل مع مكتبات (COM).

من المثال السابق يتضح لنا مدى صعوبة التعامل مع دوال الانعكاس وصعوبة قراءة الشفرات المكتوبة.

الكلام جميل ولكن ماعلاقة كل ماسبق ذكره بكلمة ديناميك (dynamic keyword)

حسنا انظر معي الى المثال التالي وكيف يمكن إعادة ماكتبناه في السابق مرة أخرى باستخدام (dynamic keyword)

dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);

كما ترى في المثال السابق قمنا بنفس العمل الذي قمنا به باستخدام دوال الانعكاس

ولكن هذه المرة باستخدام (dynamic keyword) وكما ترى فانها تشبه لحد كبير المثال الاول ولكن الفرق اننا قمنا فط بوضع كلمة (dynamic) كنوع للمتغير.

كما هو موضح في الاعلى فإن التعرف على العملية سوف يتم وقت التنفيذ (Runtime)

اتمنى مما قدمته حتى الان ان تكون الصورة واضحة اليك .تخيل معي الان أنك تريد انشاء فصيلة (Class) وتريد إضافة حقول اليها ولكن وقت التنفيذ ؟؟؟

طبعا يمكنك فعل ذلك الان وبكل بساطة إنظر الى المثال التالي

dynamic contact = new ExpandoObject();
contact.Name = "Ahmed Naji";
contact.WebSite="www.dotnetfinder.wordpress.com";
Salary=1000;
Console.WritLine(contact.Name);
Console.WriteLine(contact.WebSite);

طبعا الغرض من هذه الإضافة حقا هو السهولة والبساطة في كتابة الشفرات وإعطاء قابلية كبيرة بأن تكون شفراتك أكثر مرونة.

والان سوف اتحدث عن جانب اخر مهم جدا جدا .لنفترض ان لدينا شفرة (Code) مكتوب بلغة من اللغات الديناميكة وأن هذه اللغة هي (IronPython) كما هو موضح بالأسفل

واننا نريد ان نستدعى الدالة (function) الموجودة في كود (IronPython) من خلال لغة سي شارب .هل هذا ممكن؟

والاجابة ايضا بسيطة وهي باستخدام (dynamic keyword) إنظر الى المثال التالي

مدهش بلا شك لقد قمنا بتنفيذ كود مكتوب بلفة (IronPython) داخل لغة سي شارب بكل يسر وسهولة .والان سوف ياتي سؤال مهم جدا كيف تم تنفيذ شفرة مكتوبة بلغة (IronPython) داخل شفرة مكتوبة بلغة سي شارب ؟؟؟

لكي إجيبكم على هذا السؤال أنظروا الى الصورة  بالاسفل.

كما ترى في المثال السابق فان اللغات مسبقة التعريف (Statically_Typed) تتخاطب مباشرة مع لغة التنفيذ المشتركة (CLR) ولكن الحال مختلف مع اللغات الديناميكية مثل (IronPython) فيوجد هنالك لغة التنفيذ الديناميكية (DLR) والتي تقوم بدورها بالتخاطب مع (CLR) ونفس الشيء ينطبق عندما تقوم بتنفيذ شفرات مكتوب بلغات ديناميكية داخل لغة سي شارب .

وكما ترى مماسبق فان لغة التنفيذ الديناميكية(DLR) تلعب هنا دور الوسيط بين لغة التنفيذ المشتركة (CLR) وبين اللغات الديناميكة من جهة وبين لغة السي شارب واللغات الديناميكية من جهة أخرى.

طبعا هنالك حالات اخرى فيمكن ان تقوم بتنفيذ ملف مكتوب بلغة الجافا سكريبت (JavaScript) داخل تطبيقات سيلفر لايت (Silverlight).

الرؤية التي تطمح اليه مايكروسوفت

قد يسئل البعض مالغرض الاساسي والرؤية التي تريدها شركة مايكروسوفت .

اولا قابلية التعدد

فيمكن ان يكون في المشروع الواحد مبرمجين بلغة السي شارب ومبرمجين بلغة (IronPython) ومبرمجين جافا سكريبت (JavaScript)

ثانيا جذب أنظار المبرمجين والمطورين من لغات مختلفة نحو منصة عمل دوت نت (.Net Framework) واستخدام المنتجات المختلفة مثل (Visual Studio)

ثالثا السهولة في التعامل مع مكتبات (Com) وخاصة المتعلقة بتطبيقات أوفيس

س/ هل معنى هذا الكلام ان لغة سي شارب سوف تصبح لغة ديناميكية؟؟؟

طبعا لا فالغة سي شارب لغة مسبقة التعاريف ولكن ان تسلك سلوك اللغات الديناميكية فهذا من أجل تسهيل العمليات ولجعل الامور اسهل فكما راينا الفرق الواضح عند استخدام دوال الانعكاس وعند استخدام (dynamic keyword).وايضا سهولة تنفيذ شفرات اخرى من لغات ديناميكية داخل لغة سي شارب.

الخلاصة

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

والله أعلم

 
Leave a comment

Posted by on May 1, 2010 in C#

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: