التنبيهات التالية ظهرت :
Warning [2] count(): Parameter must be an array or an object that implements Countable - Line: 864 - File: showthread.php PHP 7.4.33 (Linux)
File Line Function
/showthread.php 864 errorHandler->error



تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Hard Coding: AutoResetEvent & ManualResetEvent
#1
مقدمة:

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

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


لكن إعتقادي الشخصي قد يختلف قليلا عن هذا التفكير و السبب في ذلك أنني دوما ما أسأل نفسي سؤال واحد
إن كانت أي كلاسات غير مهمة .... إذن ماذا يجعل شركة مثل مايكروسوفت تستثمر الوقت و المال في كتابة هذه الكلاسات؟ أكيد مايكروسوفت لها أسبابها !!!!؟؟؟؟

مثالا علي هذه النوعية من الكلاسات
الكلاسان التاليان و هما سيكونا محورا أساسيا للمقال هذا
الكلاسان كان أول ظهور لهم مع نسخة الدوت نت 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 ObjectAs EventArgsHandles 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 ObjectAs EventArgsHandles MyBase.Load
        Dim source 
As Byte CByte(150)
 
       Dim callback As AlloCatorCallBack Sub(ByRef x As IntegerAs Byte)
 
                                               x CInt(y) + CInt(y)
 
                                           End Sub
        Dim allocator 
As Allocator = New Allocator(callbacksource)
 
       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 AlloCatorCallBacksource 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 Integersource As Byte

من الأمثلة أعلاه سنكتشف ان الهدف من الكود واحد
لكن كيفية كتابة الكود مختلفة

كتابة الكود بشكل صعب تعتبر واحدة من أهم أهداف البرمجة
والهدف بسيط جدا
الإلهاء

وأعتقد و الله أعلم أن نصف كلاسات الدوت او أكثر هدفها  الإساسي هو الإلهاء

تقبلوا تحياتي
Retired
الرد }}}
تم الشكر بواسطة: ابو ليلى , tryold


الردود في هذا الموضوع
Hard Coding: AutoResetEvent & ManualResetEvent - بواسطة silverlight - 27-07-17, 08:00 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم