تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Collection & DataBase Part 1
#1
السلام عليكم و رحمة الله و بركاته

مقدمة
:

كمية الأسئلة الخاصة باستخدام الداتا بيز مثل
MS Access و  SQL من كثرتها أصبحت شئ غير عادي في الموقع  والملحوظة أن معظم الأسئلة تتمركز حول كيفية التعامل مع الداتا بيز و قراءة البيانات بأساليب مختلفة. أنا مفهومي للداتا بيز يتلخص في أنها تستخدم في حفظ البيانات لكن و لكي نتعامل مع البيانات هل نحن في حاجة الي استخدام أساليب الداتا بيز التقليدية

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

عموما أعتقد و الله أعلم انه من الأفضل ان نستخدم ملفات الداتا بيز للتحزين و القراءة فقط ثم و لكي نتعامل مع البيانات من الأفضل ان نفكر في استخدام Collection خاصة ان امكانيات Collection في الدوت نت تتفوق كثيرا علي مثيلاتها من الملفات الموجودة في فضاء الاسماء System.Data

بالنهاية
هذه مجرد وجهة نظر خاصة بي و هي تحتمل الصواب و الخطأ خاصة أنه لا يوجد ثوابت في البرمجة و كما يقول المثل الشعبي المصري .... كل شيخ و له طريقة .... فأنا أقتبس هنا من تلك المقولة و أقول كل مبرمج و له أسلوب.

كيف نبني Collection

هناك أسلوبان لنفعل هذا
:

الأسلوب الأول هو أن نستخدم Collections أوGeneric Collections  الموجودة في الدوت نت و نطور بها أو نستخدمها كما هي.

الأسلوب الثاني هو أن نبني Collection من الصفر

الأمر بالنهاية متروك للمبرمج .... عموما و في كلتا الحالات سنجد أن كل شئ أصله Arrays
لكن علينا أن نتذكر أنناوعندما تبني Collection الخاصة بنا هذا سوف يقلل من احتياج برامجنا الي النسخ المتقدمة FrameWork 

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

هيا نبني Collection

لكن قبل أن نفعل هذا
لنسأل أنفسنا الأسئلة التالية :
لماذا أحتاج الي بناء Collection و ما هو الهدف من هذه Collection 
ماذا سوف نخزن في هذه Collection
هل أحتاج الي أن أقارن المدخلات الموجودة في هذه Collection
هل أحتاجي الي أن أنسخ Collection
هل أحتاج الي أن أقوم بالبحث في هذه Collection
هل أحتاج الي عمل Sort للمدخلات الموجودة في Collection
هل هذه Collection  يجب أن تدعم Enumeration أو بمعني أدق هل سنحتاج أن  Collection تدعم استخدام جملة For Each

وبما أننا نتحدث هنا عن الداتا بيز فهل نحتاج الي أن  نجعل Collection التي سوف نقوم ببنائها تدعم برامج الداتا بيز

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


بناء Collection بسيطة

كبداية لنفترض انن نريد بناء
مصفوفة أو Collection إسمها VB4ArabStringCollection و من إسم الكلاس سنجد أن المدخلات هنا ستكون عبارة عن String و الهدف هنا سيكون إضافة أو حذف المدخلات التي هي عبارة عن هذا String

أيضا و لكي نجعل هذه
Collection تشبه ملفات الدوت نت لذلك سنجعلها تدعم خاصية Enumeration او جملة For Each لذلك سوف نستخدم IEnumerable & IEnumerator Interfaces 
أيضا و لكي نستطيع استرجاع نسخة من Collection او نقوم بعمل Clone لذلك سوف نستخدم ICloneable Interface

الشكل المبدئي للكود سيكون كالتالي حيث سنجد ان الكلاس الرئيسي
VB4ArabStringCollection يقوم بعمل Implementation لكل من ICloneable & IEnumerable Interfaces و هناك كلاس داخلي اخر اسمه  VB4ArabStringCollectionEnumerator و هذا الكلاس سوف يكون بمثابة Enumerator

كود :
Public Class VB4ArabStringCollection
  Implements ICloneable, IEnumerable

  Public Function Clone() As Object Implements ICloneable.Clone

  End Function

  Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator

  End Function


#Region " Enumerator "

  Private Class VB4ArabStringCollectionEnumerator
      Implements IEnumerator

      Public ReadOnly Property Current As Object Implements IEnumerator.Current
          Get

          End Get
      End Property

      Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext

      End Function

      Public Sub Reset() Implements IEnumerator.Reset

      End Sub

  End Class

#End Region

End Class

الأن لنأخذ كل كلاس علي حده و نضيف له Method أو Functions أو Property كيفما شئنا و نكتب الكود الخاص به

الكلاس الرئيسي VB4ArabStringCollection

أولا : قبل ان نضيف اي شئ نحتاج الي تعريف متغير عبارة عن Array وهي سوف تعمل هنا بمثابة مخزن داخلي نقوم بتخزين البيانات به. و هنا سوف نستخدم الكلاس ArrayList لأن له بعض المميزات البسيطة يمكن استخامها في عمل BinarSearch أو Sort أو Reverse الي اخره ولمزيد من المعلومات يمكنك عزيزي القارئ ان تقرأ أكثر عن الكلاس ArrayList في اللينك ArrayList

كود :
Public Class VB4ArabStringCollection
  Implements ICloneable, IEnumerable

#Region " Field "

  ' define internal list which will work as store for the collection Data
  ' benifits to use arraylist because it supports sort , binarysearch, ... and so on
  ' for more information about ArrayList, please visit the below link
  ' https://msdn.microsoft.com/en-us/library/System.Collections.ArrayList_methods%28v=vs.110%29.aspx
  Private list As ArrayList

#End Region

  ' Rest of the code .......

End Class

ثانيا: لنكتب Constructor و المقصود هنا Sub New الخاص ب الكلاس الرئيسي و من خلاله نبدأ قيمة Internal List

كود :
Public Class VB4ArabStringCollection
  Implements ICloneable, IEnumerable

  ' Rest of the code Up .......

#Region " Constructor "

  Public Sub New()
      ' initialize the internal list
      Me.list = New ArrayList()
  End Sub

  Public Sub New(ByVal capacity As Integer)
      ' initialize the internal list with a defined capacity
      Me.list = New ArrayList(capacity)
  End Sub

#End Region

  ' Rest of the code down .......

End Class

ثالثا : نضيف للكلاس الرئيسي بعض Property و بعض Method الخاصة بإضافة و حذف البيانات و نستخدم InnerList لحذف و اضافة البيانات

كود :
  Public ReadOnly Property InnerList As ArrayList
      Get
          If (Me.list Is Nothing) Then
              Me.list = New ArrayList
          End If
          Return Me.list
      End Get
  End Property

  ' used to add items to the collection
  Public Sub Add(item As String)
      Me.InnerList.Add(item)
  End Sub

  ' used to remove items from the collection
  Public Sub Remove(item As String)
      Me.InnerList.Remove(item)
  End Sub

رابعا: لنكتب الكود الخاص ب الدالة  Clone
و هنا يمكننا أن نكتب هذه الدالة بأكثر من أسلوب و ستجدون ذلك موضحا داخل الكود الخاص ب الدالة

كود :
  ' Clone/copy the collection
  Public Function Clone() As Object Implements ICloneable.Clone
      ' define new empty VB4ArabStringCollection
      Dim stringCol As VB4ArabStringCollection = New VB4ArabStringCollection
      ' add all items to the collection
      For Each item As Object In Me
          ' Option 1 add items as object
          stringCol.InnerList.Add(item.Clone())

          '' Option 2 add item as string
          'Dim str As String = CType(item, String)
          'stringCol.InnerList.Add(str)

      Next
      Return stringCol
  End Function

خامساو أخيرا: لا يتبقي لنا في الكلاس الرئيسي سوي أن نكتب الكود الخاص ب الدالة GetEnumerator
 
في واقع الأمر هناك أسلوبان لكتابة هذه الدالة

الأسلوب الأول هو أن نستغني تماما عن الكلاس VB4ArabStringCollectionEnumerator و نستخدم GetEnumerator  الخاصة ب InnerList و بذلك تكون Collection  الخاصة بنا جاهزة للإستخدام
و الكود االتالي يوضح ذلك

كود :
  ' Returns an instance of class VB4ArabStringCollectionEnumerator
  Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
      Return Me.InnerList.GetEnumerator
  End Function

الأسلوب الثاني هو أن نكتب الكلاس VB4ArabStringCollectionEnumerator ثم نستخدمه من داخل هذه الدالة و الكود التالي يوضح ذلك

كود :
  ' Returns an instance of class VB4ArabStringCollectionEnumerator
  Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
      Return New VB4ArabStringCollectionEnumerator(Me)
  End Function

و الكود التالي يوضح شكل الكلاس VB4ArabStringCollectionEnumerator

كود :
#Region " Enumerator "

  Private Class VB4ArabStringCollectionEnumerator
      Implements IEnumerator

      Private location As Integer = -1
      Private vb4ArabCollection As VB4ArabStringCollection

      Public Sub New(stringCol As VB4ArabStringCollection)
          Me.vb4ArabCollection = stringCol
      End Sub

      ' Current retrieves current item from the collection.
      Public ReadOnly Property Current As Object Implements IEnumerator.Current
          Get
              Return Me.vb4ArabCollection.InnerList(location)
          End Get
      End Property

      ' MoveNext tells us what to do when user wants to move forward in the collection.
      Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
          If Me.location < Me.vb4ArabCollection.InnerList.Count - 1 Then
              Me.location += 1
              Return True
          Else
              Return False
          End If
      End Function

      ' Reset sets the initial location/position of the collection
      Public Sub Reset() Implements IEnumerator.Reset
          location = -1
      End Sub

  End Class

#End Region

كيف نستخدم Collection الجديدة

افتح مشروع و أضف له إثنان
ComboBox
ثم اكتب الكود بالشكل التالي في الحدث Load الخاص بالفورم

كود :
Public Class Form1

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

      ' Test the collection
      Dim stringCol As VB4ArabStringCollection = New VB4ArabStringCollection
      ' add  items to the collection

      stringCol.Add("Visual Basic")
      stringCol.Add("Visual C#")
      stringCol.Add("Visual C++")
      stringCol.Add("Visual F ")
      stringCol.Add("Visual Pascal")

      For Each s As String In stringCol
          Me.ComboBox1.Items.Add(s)
      Next

      ' Test clone the collection &   remove from collection
      Dim clonedCollection As VB4ArabStringCollection = stringCol.Clone
      clonedCollection.Remove("Visual F ")
      clonedCollection.Remove("Visual Pascal")
      For Each s As String In clonedCollection
          Me.ComboBox2.Items.Add(s)
      Next

  End Sub

End Class

يتبع في المشاركات اللاحقة ......

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

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

طبعا هذا لا يحدث في المواقع العربية إلا نادرا عموماالهدف النهائي هو أن نتعلم من بعضنا البعض

بالنهاية اقول للجميع لا تخافوا علي ما تكتبونه من أن يتم سرقته او يتم إستخدامه تحت إسم شخص اخر أو في برامج أشخاص أخرين لأنه و بالنهاية الكثير من البرمجيات تتجه الي Open Source و ايضا برامج Reflection لم تدع اسرارا في الدوت نت إلا و كشفت عنها. أيضا عدد المبرمجين العرب ليس كثيرا و بالتالي السوق مفتوح للجميع من أجل الكسب المادي الحلال

تقبلوا تحياتي وأعتذر عن الإطالة عليكم وأدعو الله ان يكون هذا الموضوع مفيدا للبعض منكم
 
اخوكم مهندس عمر
الرد }}}
تم الشكر بواسطة: الطالب , Sajad , محمد كريّم , viv
#2
الكود التالي يوضح شكل الكلاس كاملا و في المشاركات التالية سنوضح كيفية اضافة صفات و طرق اخري للكلاس بل وسنضيف له دوال تجعل من الممكن استخدامه في برامج الداتا بيز التقليدية


كود :
Public Class VB4ArabStringCollection
   Implements ICloneable, IEnumerable

#Region " Field "

   ' define internal list which will work as store for the collection Data
   ' benifits to use arraylist because it supports sort , binarysearch, ... and so on
   ' for more information about ArrayList, please visit the below link
   ' https://msdn.microsoft.com/en-us/library/System.Collections.ArrayList_methods%28v=vs.110%29.aspx
   Private list As ArrayList

#End Region

#Region " Constructor "

   Public Sub New()
       ' initialize the internal list
       Me.list = New ArrayList()
   End Sub

   Public Sub New(ByVal capacity As Integer)
       ' initialize the internal list with a defined capacity
       Me.list = New ArrayList(capacity)
   End Sub

#End Region

#Region " Property "

   Public ReadOnly Property InnerList As ArrayList
       Get
           If (Me.list Is Nothing) Then
               Me.list = New ArrayList
           End If
           Return Me.list
       End Get
   End Property

#End Region

#Region " Methods "

   ' used to add items to the collection
   Public Sub Add(item As String)
       Me.InnerList.Add(item)
   End Sub

   ' used to remove items from the collection
   Public Sub Remove(item As String)
       Me.InnerList.Remove(item)
   End Sub

   ' Clone/copy the collection
   Public Function Clone() As Object Implements ICloneable.Clone
       ' define new empty VB4ArabStringCollection
       Dim stringCol As VB4ArabStringCollection = New VB4ArabStringCollection
       ' add all items to the collection
       For Each item As Object In Me
           ' Option 1 add items as object
           stringCol.InnerList.Add(item.Clone())

           '' Option 2 add item as string
           'Dim str As String = CType(item, String)
           'stringCol.InnerList.Add(str)

       Next
       Return stringCol
   End Function

   ' Returns an instance of class VB4ArabStringCollectionEnumerator
   Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
       Return New VB4ArabStringCollectionEnumerator(Me)
   End Function

#End Region

#Region " Internal Enumerator "

   Private Class VB4ArabStringCollectionEnumerator
       Implements IEnumerator

       Private location As Integer = -1
       Private vb4ArabCollection As VB4ArabStringCollection

       Public Sub New(stringCol As VB4ArabStringCollection)
           Me.vb4ArabCollection = stringCol
       End Sub

       ' Current retrieves current item from the collection.
       Public ReadOnly Property Current As Object Implements IEnumerator.Current
           Get
               Return Me.vb4ArabCollection.InnerList(location)
           End Get
       End Property

       ' MoveNext tells us what to do when user wants to move forward in the collection.
       Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
           If Me.location < Me.vb4ArabCollection.InnerList.Count - 1 Then
               Me.location += 1
               Return True
           Else
               Return False
           End If
       End Function

       ' Reset sets the initial location/position of the collection
       Public Sub Reset() Implements IEnumerator.Reset
           location = -1
       End Sub

   End Class

#End Region

End Class ' VB4ArabStringCollection
الرد }}}
تم الشكر بواسطة: الطالب , Sajad


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Generic Delegates & ًWindows Forms Control - Part 2 silverlight 0 2,526 19-01-16, 02:01 PM
آخر رد: silverlight
  Generic Delegates & ًWindows Forms Control - Part 1 silverlight 1 2,668 16-01-16, 06:35 PM
آخر رد: 10468
  Collection & DataBase Part 2 silverlight 0 2,091 02-12-15, 08:42 PM
آخر رد: silverlight
  [مقال] Notify Collection Changed silverlight 3 2,412 02-11-15, 06:07 PM
آخر رد: الشاكي لله
  save rtf file in database محمد عمر مصطفى 0 2,418 21-12-13, 02:50 AM
آخر رد: محمد عمر مصطفى

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


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