26-12-16, 11:43 AM
أثناء قراءتي في الرابط التالي و الخاص بموقع مايكروسوفت
الرابـــــــــــــــــــــــــط
تذكرت و أنا أبتسم أياما قديمة كان مفهوم Delegate Function يمثل غموضا كبيرا بالنسبة لي
لكن يوما بعد يوم ومع ازدياد الخبرة قليلا أصبح هذا المفهوم أمر يسيرا
لذلك و حين قرأت الموضوع في موقع مايكروسوفت قررت مشاركتكم بعضا من الأفكار التي قد توضح الكيفية في كتابة و استخدام Delegate Function في اي مشروع
بشكل عام إن أبسط توضيح لكلمة Delegate Function هي أنها مثلها مثل أي Function أو دالة قد تكتبها من خلال أي كود
لذلك إن مجرد فهمك لكيفية كتابة دالة عادية تسترجع منها قيمة معينة فهذا معناه أنك أيضا تفهم Delegate Function
و لنأخذ المثال البسييط الموجود في موقع مايركوسوفت كنقطة بداية
للأسف أن من يكتبون الأمثلة التوضيحية في موقع مايكروسوفت غالبا وقتهم ضيق أو ربما لأي أسباب أخري فهم لا يوضحون كافة الأمور من خلال كتابة أمثلة كثيرة و مختلفة ..... أو ربما هم فقط يكتبون أي مثال سريع و انتهي الأمر و يتركون المبرمج ليبحث و يقرأ حتي يجد و يكتشف الحلول بنفسه
و إسمحوا لي أن أعيد كتابة المثال الخاص بمايكروسوفت بشكل مختلف
كيف نقوم بتعريف Delegate Function
الكيفية التي تحتاجها لإستدعاء اي Delegate Function هي التي تحدد نوعيتها من حيث ان تكون عبارة عن Public أو Friend او Protected او حتي Private
بشكل مبدئي الأفضل استخدامها علي صورة Public Function حتي يتثني لك استدعاؤها من اي مكان وثم بعد ذلك نمرر لها اي متغيرات تريدها و تسترجع منها اي قيمة تريدها
و الكود التالي يوضح شكل الدالة
لتوضيح الدالة أعلاه هي عبارة عن دالة سنمرر لها متغيران رقميان لا نعلم قيمتهما أي أن القيم الخاصة بهم قد تكون اي رقم و من ثم نقارن بين القيمتان و نسترجع متغير عبارة عن Boolean
الأمر الجميل في Delegates بشكل عام انها تسمح لك بتمريرها الي اي كلاس و تسمح لك بتعريفها من خلال استخدم Sub New
واسمحوا لي أن أستمر علي نفس نهج المثال الخاص بمايكروسوفت مع التعديل عليه قليلا
و من ثم سنكتب الكلاس التالي
كما ذكرت فإن الأمر الرائع في Delegates انه يمكن تمريرها كمتغير إلي أي كلاس كما هو واضح في الكلاس أعلاه
الكود التالي يوضح كيفية تعريف Delegate Function ثم تمريرها للكلاس و العودة بالنتائج
أو يمكن كتابة الكود علي الشكل التالي
السؤال الأهم هل أنا أصلا في حاجة لكتابة الكلاس أعلاه و لماذا لا استخدم Delegate Function مباشرة
عموما نحن لا نحتاج للكلاس و يمكننا استخدام Delegate Function مباشرة عن طريق تمرير القيم الي Invoke
و الكود التالي يوضح ذلك
أو يمكن كتابة الكود كالتالي
أو يمكن كتابة الكود كالتالي أيضا
أو كالتالي
وكما ذكرت مسبقا الجميل في Delegate Function أن لها Constructor اي أن لها Sub New
أهم شئ في Delegate Function هو تعريفها بوضوح و إعطاؤها اسما مناسبا لا يتكرر من داخل الكود و ايضا ان نمرر لها المتغيرات الصحيحة او نمرر لها الدوال التي لها نفس Signature و المقصود هنا نمرر لها دوالا تشبهها في كل شئ و تختلف عنها في المسمي او يمكننا استخدام Lambada Function
في الكود التالي ستجدون بعضا من الأشكال لهذه النوعية من Delegates
و لتضعوا في اعتباركم ان مجال استخدام هذه النوعية من الدوال لس له حدود
لأي استفسارات تتعلق بالموضوع يمكنكم كتابة اي سؤال ترغبون به
الرابـــــــــــــــــــــــــط
تذكرت و أنا أبتسم أياما قديمة كان مفهوم Delegate Function يمثل غموضا كبيرا بالنسبة لي
لكن يوما بعد يوم ومع ازدياد الخبرة قليلا أصبح هذا المفهوم أمر يسيرا
لذلك و حين قرأت الموضوع في موقع مايكروسوفت قررت مشاركتكم بعضا من الأفكار التي قد توضح الكيفية في كتابة و استخدام Delegate Function في اي مشروع
بشكل عام إن أبسط توضيح لكلمة Delegate Function هي أنها مثلها مثل أي Function أو دالة قد تكتبها من خلال أي كود
لذلك إن مجرد فهمك لكيفية كتابة دالة عادية تسترجع منها قيمة معينة فهذا معناه أنك أيضا تفهم Delegate Function
و لنأخذ المثال البسييط الموجود في موقع مايركوسوفت كنقطة بداية
للأسف أن من يكتبون الأمثلة التوضيحية في موقع مايكروسوفت غالبا وقتهم ضيق أو ربما لأي أسباب أخري فهم لا يوضحون كافة الأمور من خلال كتابة أمثلة كثيرة و مختلفة ..... أو ربما هم فقط يكتبون أي مثال سريع و انتهي الأمر و يتركون المبرمج ليبحث و يقرأ حتي يجد و يكتشف الحلول بنفسه
و إسمحوا لي أن أعيد كتابة المثال الخاص بمايكروسوفت بشكل مختلف
كيف نقوم بتعريف Delegate Function
الكيفية التي تحتاجها لإستدعاء اي Delegate Function هي التي تحدد نوعيتها من حيث ان تكون عبارة عن Public أو Friend او Protected او حتي Private
بشكل مبدئي الأفضل استخدامها علي صورة Public Function حتي يتثني لك استدعاؤها من اي مكان وثم بعد ذلك نمرر لها اي متغيرات تريدها و تسترجع منها اي قيمة تريدها
و الكود التالي يوضح شكل الدالة
PHP كود :
Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean
لتوضيح الدالة أعلاه هي عبارة عن دالة سنمرر لها متغيران رقميان لا نعلم قيمتهما أي أن القيم الخاصة بهم قد تكون اي رقم و من ثم نقارن بين القيمتان و نسترجع متغير عبارة عن Boolean
الأمر الجميل في Delegates بشكل عام انها تسمح لك بتمريرها الي اي كلاس و تسمح لك بتعريفها من خلال استخدم Sub New
واسمحوا لي أن أستمر علي نفس نهج المثال الخاص بمايكروسوفت مع التعديل عليه قليلا
و من ثم سنكتب الكلاس التالي
PHP كود :
Public Class OrderingCallBack
Private _callBack As CompareCallBack
Public Sub New(callBack As CompareCallBack)
_callBack = callBack
End Sub
Public Function GetCallBackResult(x As Integer, y As Integer) As Boolean
Return _callBack(x, y)
End Function
End Class
كما ذكرت فإن الأمر الرائع في Delegates انه يمكن تمريرها كمتغير إلي أي كلاس كما هو واضح في الكلاس أعلاه
الكود التالي يوضح كيفية تعريف Delegate Function ثم تمريرها للكلاس و العودة بالنتائج
PHP كود :
Public Class Form1
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim x As Integer = 10
Dim y As Integer = 8
Dim greaterCallBack As New OrderingCallBack(Function(m, n) m > n)
Dim result As Boolean = greaterCallBack.GetCallBackResult(x, y)
Me.Text = result
End Sub
End Class
أو يمكن كتابة الكود علي الشكل التالي
PHP كود :
Public Class Form1
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim x As Integer = 10
Dim y As Integer = 8
Dim greaterCallBack As New OrderingCallBack(Function(m, n) m > n)
Dim result As Boolean = greaterCallBack.GetCallBackResult(x, y)
Me.Text = result
End Sub
Private Function GreaterThan(x As Integer, y As Integer) As Boolean
Return x > y
End Function
End Class
السؤال الأهم هل أنا أصلا في حاجة لكتابة الكلاس أعلاه و لماذا لا استخدم Delegate Function مباشرة
عموما نحن لا نحتاج للكلاس و يمكننا استخدام Delegate Function مباشرة عن طريق تمرير القيم الي Invoke
و الكود التالي يوضح ذلك
PHP كود :
Public Class Form1
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim x As Integer = 10
Dim y As Integer = 8
Dim greaterCallBack As CompareCallBack = (Function(m, n) m > n)
Dim result As Boolean = greaterCallBack.Invoke(x, y)
Me.Text = result
End Sub
End Class
Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean
أو يمكن كتابة الكود كالتالي
PHP كود :
Public Class Form1
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim x As Integer = 10
Dim y As Integer = 8
Dim greaterCallBack As CompareCallBack = AddressOf GreaterThan
Dim result As Boolean = greaterCallBack.Invoke(x, y)
Me.Text = result
End Sub
Private Function GreaterThan(x As Integer, y As Integer) As Boolean
Return x > y
End Function
End Class
Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean
أو يمكن كتابة الكود كالتالي أيضا
PHP كود :
Public Class Form1
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim x As Integer = 10
Dim y As Integer = 8
Dim greaterCallBack As CompareCallBack = New CompareCallBack(AddressOf GreaterThan)
Dim result As Boolean = greaterCallBack.Invoke(x, y)
Me.Text = result
End Sub
Private Function GreaterThan(x As Integer, y As Integer) As Boolean
Return x > y
End Function
End Class
Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean
أو كالتالي
وكما ذكرت مسبقا الجميل في Delegate Function أن لها Constructor اي أن لها Sub New
PHP كود :
Public Class Form1
' https://msdn.microsoft.com/en-us/library/ms172879.aspx
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim x As Integer = 10
Dim y As Integer = 8
Dim greaterCallBack As CompareCallBack = New CompareCallBack(Function(m, n) m > n)
Dim result As Boolean = greaterCallBack.Invoke(x, y)
Me.Text = result
End Sub
End Class
Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean
أهم شئ في Delegate Function هو تعريفها بوضوح و إعطاؤها اسما مناسبا لا يتكرر من داخل الكود و ايضا ان نمرر لها المتغيرات الصحيحة او نمرر لها الدوال التي لها نفس Signature و المقصود هنا نمرر لها دوالا تشبهها في كل شئ و تختلف عنها في المسمي او يمكننا استخدام Lambada Function
في الكود التالي ستجدون بعضا من الأشكال لهذه النوعية من Delegates
و لتضعوا في اعتباركم ان مجال استخدام هذه النوعية من الدوال لس له حدود
PHP كود :
' Example: 01
Public Delegate Function CompareCallBack(x As Integer, y As Integer) As Boolean
' Example: 02
Public Delegate Function AddCallBack(x As Integer, y As Integer) As Integer
' Example: 03
Public Delegate Function ValidationCallBack(c As Control) As Boolean
' Example: 04
Public Delegate Function ImageCallBack(bmp As Bitmap) As Bitmap
' Example: 05
Public Delegate Sub AdditionCallBack(x As Integer, y As Integer, ByRef z As Integer)
' Example: 06
Public Delegate Sub AddionalCallBack(x As Integer, y As Integer, ByRef z As Integer)
' Example: 07
Public Delegate Function ArrayCallBack(values As String) As String()
لأي استفسارات تتعلق بالموضوع يمكنكم كتابة اي سؤال ترغبون به