تقييم الموضوع :
  • 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
#2
جزاك الله خيراً يا اخ عمر
كان لي مرور عليها اثناء دراسة مكاتب CefSharp و لاحظت استخدامها بكثرة داخل كلاسات المكتبة
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة:
#3
مرحبا بمرورك أخي الفاضل أبو ليلي

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


ها حاول اشوف المكتبة التي تحدثت عنها إن سمح الوقت
وان كان لديك أفكارا أخري مشابهة للموضوع أرجو أن تكتبها
حتي نستقيد أكثر
Retired
الرد
تم الشكر بواسطة: ابو ليلى , ابو ليلى , Sajad , Sajad
#4
الأخ أبوليلي

في الكلاس أدناه ستجد نفس الفكرة بتطبيق مختلف
وهنا تم الاستغناء عن كلاسات مايكروسوفت


PHP كود :
Public Class Provider

    Private lock 
As Object
    Private source 
As Byte
    Private destination 
As Byte
    Private callback 
As ProviderCallBack
    Private IsProvided 
As Integer

    Public Sub 
New(callback As ProviderCallBacksource As Byte)
 
       Me.callback callback
        Me
.source source
        Me
.IsProvided 0
        Me
.lock = New Object
        Me
.destination Nothing
    End Sub

    Public Sub Provide
()
 
       SyncLock Me.lock
            Me
.callback(Me.destinationMe.source)
 
           Me.IsProvided Me.IsProvided 1
        End SyncLock
    End Sub

    Public Sub OnProvided
(ByRef result As Byte)
 
       SyncLock Me.lock
            If Me
.IsProvided 0 Then
                result 
Me.destination
            End 
If
 
           Me.IsProvided 0
        End SyncLock
    End Sub

End 
Class

Public 
Delegate Sub ProviderCallBack(ByRef destination As Bytesource As Byte

الإستخدام

الطريقة الأولي:


PHP كود :
Public Class Form1
Private Sub Form1_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        Dim callBack 
As ProviderCallBack AddressOf DoProvide
        Dim provider 
As Provider = New Provider(callBack100)
 
       provider.Provide()
 
       Dim result As Integer Nothing
        provider
.OnProvided(result)
 
       Me.Text result
    End Sub

    Private Sub DoProvide
(ByRef x As ByteAs Byte)
 
       x y
    End Sub

End 
Class 

الطريقة الثانية:

PHP كود :
Public Class Form1

    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load

        Dim callBack 
As ProviderCallBack Sub(ByRef x As ByteAs Byte)
 
                                              x y
                                           End Sub


        Dim provider 
As Provider = New Provider(callBack100)
 
       provider.Provide()
 
       Dim result As Integer Nothing
        provider
.OnProvided(result)
 
       Me.Text result
    End Sub

 End 
Class 

يجب ملاحظة إن الكلاس ممكن تحويله الي
Provider(OF T
Retired
الرد
تم الشكر بواسطة: ابو ليلى , Sajad , Sajad
#5
جزاك الله خيراً على جهودك المميزة
ما يعيقني هو توفر الوقت للدراسة و التطبيق , اذ ان الافكار كثيرة و تحتاج لاعادة ترتيب لطرحها .
بالنسبة للمكتبة (CefSharp) هي اطار عمل كامل للتعامل مع متصفح Chrome و الاستفادة من خدماته
توفر الكثير من الخدمات و مفتوحة المصدر و قابلة للتطوير .
المكتية متوفرة بلغة #C تحديداً و تحتاج لاعادة دراسة و لكن مروري عليها كان مرور الكرام .
ما عجبني فيها استخدتم متصفح قوقل و امكانية التحكم بكل شيئ تقريباً داخل المتصفح , حتى وصل الحد الى امكانية حقن اكواد الجافا سكربت و الجي كويري داخل الصفحة مع امكانية جلب كل شيئ يختص بها حتى ملفات Css يمكنك التعامل معها
مكتبة جبارة و تحتاج للدراسة .
و الشيئ المميز ان فريق التطوير الخاص بها نشيط و التطوير فيها مستمر .
ان شاء الله اذا توفر الوقت نحاول طرح المكتية للتطوير هنا , حتى يستفيد المهتمين بهذا النوع

تحياتي لك.
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد
تم الشكر بواسطة: Sajad , silverlight


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


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