27-07-17, 08:00 PM
(آخر تعديل لهذه المشاركة : 27-07-17, 08:20 PM {2} بواسطة silverlight.)
مقدمة:
الدوت نت به مجموعة من الكلاسات و للوهلة الأولي حين تدرسها قد لا تفهم الهدف منها تماما
وحين تبدأ في دراسة بعضا من هذه الكلاسات بتعمق معقول
ربما قد تكتشف أنه يمكن الإستغناء عن استخدام هذه الكلاسات تماما
و غاليا ولهذا السبب قليلا ما تجد نركيزا كبيرا علي تفسير و شرح مثل هذه النوعية من الكلاسات من أغلب المبرمجين
لذلك الكثير من المبرمجين يمرون علي مثل هذا النوعية من الكلاسات مرور الكرام و يكتفون فقط بقراءة مبسطة عن الكلاسات من تحت ميدأ العلم بالشئ لا غير
لكن إعتقادي الشخصي قد يختلف قليلا عن هذا التفكير و السبب في ذلك أنني دوما ما أسأل نفسي سؤال واحد
إن كانت أي كلاسات غير مهمة .... إذن ماذا يجعل شركة مثل مايكروسوفت تستثمر الوقت و المال في كتابة هذه الكلاسات؟ أكيد مايكروسوفت لها أسبابها !!!!؟؟؟؟
مثالا علي هذه النوعية من الكلاسات
الكلاسان التاليان و هما سيكونا محورا أساسيا للمقال هذا
الكلاسان كان أول ظهور لهم مع نسخة الدوت نت 2 تقريبا
1- AutoResetEvent
2- ManualResetEvent
بعد أن قضيت حوالي ساعتان محاولا فهم هدف مايكروسوفت من كتابة الكلاسان أعلاه إكتشفت الأتي
1- الكلاسان يمكن استخدامهما في بناء Enumerator بسيط
2 - الكلاسان يمكن استخدامهما في تمرير البيانات بين المتغيرات باستخدام فكرة ByRef
3- امكانية تغيير شكل البيانات
مثلا تمرر قيمة علي هيئة Byet و تسترد قيمة أخري مغايرة علي هيئة أخري مثل Integer .... أو علي أقل تقدير تسترد القيمة الأصلية التي تم تمريرها
بتوضيح أكثر سهولة تقرأ قيمة من متغير ....... ثم تقوم بإجراء اي عمليات عليه .... ثم تخرج بمتغير مختلف أو تخرج بنفس المتغير الأصلي
كأنك تقرأ شيئا ..... و تكتب شيئا ..... Read - Wrtie
أو كأنك تكتب شيئا ..... و تقرأ شيئا...... Write - Read
أو التفسير الفعلي ينحصر في كلمة واحدة هي التزامن synchronization
الخلاصة من هذه المقدمة أنه و علي أي مبرمج أن لا يبني إنطباعات خاطئة عني أي كود يراه
لأنه لا يعلم ما هو الهدف الحقيقي الذي يفكر فيه الشخص الذي كتب هذا الكود
و المعني في بطن الشاعر كما يقولون .....
الأمثلة التالية ستوضح كيفية استخدام الكلاسان بشكل جيد و بسيط و أحيانا بشكل معقد من داخل برنامجك
المثال الأول:
يوضح و بشكل مبسط كيفية تخصيص و تمرير البيانات و تغيير نوعها النهائي
وحتي الأن لم أستخدم كلاسات مايكروسوفت
المثال الثاني :
هو نفس فكرة المثال الأول و لكن بشكل أكثر تعقيدا
وحتي الأن لم أستخدم كلاسات مايكروسوفت
فقط قمت بكتابة كلاس بسيط ليقوم بأداء نفس الهدف المطلوب الذي يؤديه الكود في المثال الأول
قد يتساءل البعض لمذا التعقيد هذا ؟
الإجابة تتلخص في أن اي شخص سيقرأ الكود المكتوب في المثال الأول حتي ولو كان مبرمج مبتدأ
سيستطيع فهم الكود بسهولة
أما الكود الموجود في المثال الثاني سيكون أكثر تعقيدا و بهذا أنت كمبرمج تقلل من عدد من يستطيعون قراءة الكود الخاص بك و استخدامه في برامجهم
لتعتبره نوع من الإلهاء لتقليل سرقة الكود الخاص بك
المثال الثالث:
وهو نفس فكرة المثال الأول و الثاني و لكن بشكل أكثر تعقيدا
من الأمثلة أعلاه سنكتشف ان الهدف من الكود واحد
لكن كيفية كتابة الكود مختلفة
كتابة الكود بشكل صعب تعتبر واحدة من أهم أهداف البرمجة
والهدف بسيط جدا
الإلهاء
وأعتقد و الله أعلم أن نصف كلاسات الدوت او أكثر هدفها الإساسي هو الإلهاء
تقبلوا تحياتي
الدوت نت به مجموعة من الكلاسات و للوهلة الأولي حين تدرسها قد لا تفهم الهدف منها تماما
وحين تبدأ في دراسة بعضا من هذه الكلاسات بتعمق معقول
ربما قد تكتشف أنه يمكن الإستغناء عن استخدام هذه الكلاسات تماما
و غاليا ولهذا السبب قليلا ما تجد نركيزا كبيرا علي تفسير و شرح مثل هذه النوعية من الكلاسات من أغلب المبرمجين
لذلك الكثير من المبرمجين يمرون علي مثل هذا النوعية من الكلاسات مرور الكرام و يكتفون فقط بقراءة مبسطة عن الكلاسات من تحت ميدأ العلم بالشئ لا غير
لكن إعتقادي الشخصي قد يختلف قليلا عن هذا التفكير و السبب في ذلك أنني دوما ما أسأل نفسي سؤال واحد
إن كانت أي كلاسات غير مهمة .... إذن ماذا يجعل شركة مثل مايكروسوفت تستثمر الوقت و المال في كتابة هذه الكلاسات؟ أكيد مايكروسوفت لها أسبابها !!!!؟؟؟؟
مثالا علي هذه النوعية من الكلاسات
الكلاسان التاليان و هما سيكونا محورا أساسيا للمقال هذا
الكلاسان كان أول ظهور لهم مع نسخة الدوت نت 2 تقريبا
1- AutoResetEvent
2- ManualResetEvent
بعد أن قضيت حوالي ساعتان محاولا فهم هدف مايكروسوفت من كتابة الكلاسان أعلاه إكتشفت الأتي
1- الكلاسان يمكن استخدامهما في بناء Enumerator بسيط
2 - الكلاسان يمكن استخدامهما في تمرير البيانات بين المتغيرات باستخدام فكرة ByRef
3- امكانية تغيير شكل البيانات
مثلا تمرر قيمة علي هيئة Byet و تسترد قيمة أخري مغايرة علي هيئة أخري مثل Integer .... أو علي أقل تقدير تسترد القيمة الأصلية التي تم تمريرها
بتوضيح أكثر سهولة تقرأ قيمة من متغير ....... ثم تقوم بإجراء اي عمليات عليه .... ثم تخرج بمتغير مختلف أو تخرج بنفس المتغير الأصلي
كأنك تقرأ شيئا ..... و تكتب شيئا ..... Read - Wrtie
أو كأنك تكتب شيئا ..... و تقرأ شيئا...... Write - Read
أو التفسير الفعلي ينحصر في كلمة واحدة هي التزامن synchronization
الخلاصة من هذه المقدمة أنه و علي أي مبرمج أن لا يبني إنطباعات خاطئة عني أي كود يراه
لأنه لا يعلم ما هو الهدف الحقيقي الذي يفكر فيه الشخص الذي كتب هذا الكود
و المعني في بطن الشاعر كما يقولون .....
الأمثلة التالية ستوضح كيفية استخدام الكلاسان بشكل جيد و بسيط و أحيانا بشكل معقد من داخل برنامجك
المثال الأول:
يوضح و بشكل مبسط كيفية تخصيص و تمرير البيانات و تغيير نوعها النهائي
وحتي الأن لم أستخدم كلاسات مايكروسوفت
PHP كود :
Public Class Form1
' تعريف المتغير النهائي
Private destination As Integer = Nothing
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' إعطاء قيمة للمتغير المبدئي
Dim source As Byte = CByte(200)
' تخصيص قيمة المتغير المبدئي الي المتغير النهائي
Me.destination = CInt(source)
' إستخدام المتغير النهائي بأي طريقة تريده
Me.Text = destination.ToString
End Sub
End Class
المثال الثاني :
هو نفس فكرة المثال الأول و لكن بشكل أكثر تعقيدا
وحتي الأن لم أستخدم كلاسات مايكروسوفت
فقط قمت بكتابة كلاس بسيط ليقوم بأداء نفس الهدف المطلوب الذي يؤديه الكود في المثال الأول
PHP كود :
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim source As Byte = CByte(100)
Dim allocator As Allocator = New Allocator(source)
allocator.Allocate()
Dim value As Integer = Nothing
allocator.OnAllocation(value)
Me.Text = value.ToString
End Sub
End Class
Public Class Allocator
Private source As Byte
Private destination As Integer
Public Sub New(source As Byte)
Me.source = source
End Sub
' تخصيص قيمة المتغير المبدئي الي المتغير النهائي
Public Sub Allocate()
If Me.source <> Nothing Then
' لنغير قليلا من قيمة المتغير المبدئي
Me.destination = CInt(Me.source) * 9
End If
End Sub
' قراءة القيمة الخاصة بالمتغير النهائي
Public Sub OnAllocation(ByRef result As Integer)
result = Nothing
If Me.destination <> Nothing Then
result = Me.destination
End If
End Sub
End Class
قد يتساءل البعض لمذا التعقيد هذا ؟
الإجابة تتلخص في أن اي شخص سيقرأ الكود المكتوب في المثال الأول حتي ولو كان مبرمج مبتدأ
سيستطيع فهم الكود بسهولة
أما الكود الموجود في المثال الثاني سيكون أكثر تعقيدا و بهذا أنت كمبرمج تقلل من عدد من يستطيعون قراءة الكود الخاص بك و استخدامه في برامجهم
لتعتبره نوع من الإلهاء لتقليل سرقة الكود الخاص بك
المثال الثالث:
وهو نفس فكرة المثال الأول و الثاني و لكن بشكل أكثر تعقيدا
PHP كود :
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim source As Byte = CByte(150)
Dim callback As AlloCatorCallBack = Sub(ByRef x As Integer, y As Byte)
x = CInt(y) + CInt(y)
End Sub
Dim allocator As Allocator = New Allocator(callback, source)
allocator.Allocate()
Dim value As Integer = Nothing
allocator.OnAllocation(value)
Me.Text = value.ToString
End Sub
End Class
Public Class Allocator
Private source As Byte
Private destination As Integer
Private autoReset As Threading.AutoResetEvent
Private callBack As AlloCatorCallBack
Public Sub New(callback As AlloCatorCallBack, source As Byte)
Me.source = source
Me.callBack = callback
Me.autoReset = New Threading.AutoResetEvent(True)
End Sub
' تخصيص قيمة المتغير المبدئي الي المتغير النهائي
Public Sub Allocate()
Try
Me.callBack(Me.destination, Me.source)
Catch ex As Exception
Finally
Me.autoReset.Set()
End Try
End Sub
' قراءة القيمة الخاصة بالمتغير النهائي
Public Sub OnAllocation(ByRef result As Integer)
Me.autoReset.WaitOne()
Me.autoReset.Close()
If Me.autoReset IsNot Nothing Then
Me.autoReset.Dispose()
Me.autoReset = Nothing
End If
result = Me.destination
End Sub
End Class
Public Delegate Sub AlloCatorCallBack(ByRef destination As Integer, source As Byte)
من الأمثلة أعلاه سنكتشف ان الهدف من الكود واحد
لكن كيفية كتابة الكود مختلفة
كتابة الكود بشكل صعب تعتبر واحدة من أهم أهداف البرمجة
والهدف بسيط جدا
الإلهاء
وأعتقد و الله أعلم أن نصف كلاسات الدوت او أكثر هدفها الإساسي هو الإلهاء
تقبلوا تحياتي
Retired