23-07-15, 08:09 PM
(آخر تعديل لهذه المشاركة : 19-11-15, 12:37 AM {2} بواسطة silverlight.)
السلام عليكم و رحمة الله و بركاته
مقدمة:
كمية الأسئلة الخاصة باستخدام الداتا بيز مثل 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
الأن لنأخذ كل كلاس علي حده و نضيف له Method أو Functions أو Property كيفما شئنا و نكتب الكود الخاص به
الكلاس الرئيسي VB4ArabStringCollection
أولا : قبل ان نضيف اي شئ نحتاج الي تعريف متغير عبارة عن Array وهي سوف تعمل هنا بمثابة مخزن داخلي نقوم بتخزين البيانات به. و هنا سوف نستخدم الكلاس ArrayList لأن له بعض المميزات البسيطة يمكن استخامها في عمل BinarSearch أو Sort أو Reverse الي اخره ولمزيد من المعلومات يمكنك عزيزي القارئ ان تقرأ أكثر عن الكلاس ArrayList في اللينك ArrayList
ثانيا: لنكتب Constructor و المقصود هنا Sub New الخاص ب الكلاس الرئيسي و من خلاله نبدأ قيمة Internal List
ثالثا : نضيف للكلاس الرئيسي بعض Property و بعض Method الخاصة بإضافة و حذف البيانات و نستخدم InnerList لحذف و اضافة البيانات
رابعا: لنكتب الكود الخاص ب الدالة Clone
و هنا يمكننا أن نكتب هذه الدالة بأكثر من أسلوب و ستجدون ذلك موضحا داخل الكود الخاص ب الدالة
خامساو أخيرا: لا يتبقي لنا في الكلاس الرئيسي سوي أن نكتب الكود الخاص ب الدالة GetEnumerator
في واقع الأمر هناك أسلوبان لكتابة هذه الدالة
الأسلوب الأول هو أن نستغني تماما عن الكلاس VB4ArabStringCollectionEnumerator و نستخدم GetEnumerator الخاصة ب InnerList و بذلك تكون Collection الخاصة بنا جاهزة للإستخدام
و الكود االتالي يوضح ذلك
الأسلوب الثاني هو أن نكتب الكلاس VB4ArabStringCollectionEnumerator ثم نستخدمه من داخل هذه الدالة و الكود التالي يوضح ذلك
و الكود التالي يوضح شكل الكلاس VB4ArabStringCollectionEnumerator
كيف نستخدم Collection الجديدة
افتح مشروع و أضف له إثنان ComboBox
ثم اكتب الكود بالشكل التالي في الحدث Load الخاص بالفورم
يتبع في المشاركات اللاحقة ......
هناك شئئ اخير وهو عبارة عن سؤال موجه للأخوة المبرمجين العرب الكبار وأتمني أن تتسع صدورهم لسؤالي هذا. هل من المنطق أنه لا يوجد بالموقع برنامج داتا بيز محترم ليكون بمثابة نقطة إنطلاق للمبرمجين الصغار .... هل فكر أحدكم يوما ماذا سوف يجيب الله سبحانه وتعالي حين يسأله ماذا فعلت ب علمك الذي أعطاه الله لك؟
هناك ميزة رائعة و جيدة جدا في مشاركة الأخرين أفكارك ألا و هي أنك حين تكتب شيئا ستجد من يعدل لك علي الكود أو يناقشه معك أو يطوره أو يكتبه بشكل أفضل و هذا مكسب رائع
أيضا هذا سوف يؤدي الي إثراء الموقع و بالتالي تعم الفائدة علي الجميع
طبعا هذا لا يحدث في المواقع العربية إلا نادرا عموماالهدف النهائي هو أن نتعلم من بعضنا البعض
بالنهاية اقول للجميع لا تخافوا علي ما تكتبونه من أن يتم سرقته او يتم إستخدامه تحت إسم شخص اخر أو في برامج أشخاص أخرين لأنه و بالنهاية الكثير من البرمجيات تتجه الي Open Source و ايضا برامج Reflection لم تدع اسرارا في الدوت نت إلا و كشفت عنها. أيضا عدد المبرمجين العرب ليس كثيرا و بالتالي السوق مفتوح للجميع من أجل الكسب المادي الحلال
تقبلوا تحياتي وأعتذر عن الإطالة عليكم وأدعو الله ان يكون هذا الموضوع مفيدا للبعض منكم
اخوكم مهندس عمر
مقدمة:
كمية الأسئلة الخاصة باستخدام الداتا بيز مثل 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 لم تدع اسرارا في الدوت نت إلا و كشفت عنها. أيضا عدد المبرمجين العرب ليس كثيرا و بالتالي السوق مفتوح للجميع من أجل الكسب المادي الحلال
تقبلوا تحياتي وأعتذر عن الإطالة عليكم وأدعو الله ان يكون هذا الموضوع مفيدا للبعض منكم
اخوكم مهندس عمر