الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

البحث داخل مصفوفة

مغلق
بدأه Ayoub JAMAL EL IDRISSI في 15 أبريل 2005 · 15 رد · 6,132 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

كلنا يعرف ان هناك طريقتين أساسيتين للبحث عن رقم في مصفوفة معينة :

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

الطريقة الثانية و هي البحث الثنائي و الذي يجب على المصفوفة ان تحتوي على أرقام متتابعة مثلا

1_14420051626440.2735254.JPG

كما تلاحظون المصفوفة تحتوي على أرقام في ترتيب تصاعدي ذلك أن هذا البحث يقوم على قسمة عدد الخانات الموجودة في المصفوفة على 2 و يقوم بمقارنة الرقم الذي نبحث عنه بالرقم الذي تحتويه الخانة رقم 4 (الجدول المبين أعلاه كمثال) اذا كان يساويه يرجع لنا رقم الخانة أما اذا كان أصغر منه يقوم تجاهل النصف الأعلى (من 4 الى 8) و العكس صحيح ... و هكذا الى ان يصل الى الرقم الذي نبحث عنه و هذه تعبر أسرع طريقة

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

المهم الفكرة تتلخص فيما يلي :

مثلا لدينا المصفوفة ( لنسمها مثلا S()) التي سنجري فيها البحث على الشكل التالي

1_14420051626440.2735254.JPG

و طبعا يجب على الأرقام الموجودة في المصفوفة أن يكونوا بترتيب تصاعدي (كما في البحث الثنائي)

الفكرة بكل بساطة تقوم على انشاء مصفوفة جديدة(لنسمها مثلا T()) تحتوي على معلومات المصفوفة الأصلية لكن بطريقة معكوسة هكذا :

2_14420051627140.4388697.JPG

يعني الخانة 2=1 و الخانة 5=2 و هكذا ...

و عند البحث سوف نقوم بالذهاب مباشرة الى الخانة استنادا على الرقم الذي نبحث عنه ... مثال :

اذا أراد الشخص معرفة موضع الرقم 7 في المصفوفة فسيكون الناتج هكذا :

X= T(7) = 3

اذا يتم البحث بطريقة أبسط و أسرع

لغاية الآن الأمور لازالت نظرية اذا فلننتقل للتطبيق

أنشئ فورم جديدة و ضع عليها Button & TextBox

في كود البوتن لا تكتب الآن أي شئ بل سوف نقوم أولا بأنشاء مصفوفة و هي التي سنبحث فيها و كودها تتم كتابته في منطقة الإعلانات العامة "General" و الكود كالتالي :

Dim T As Integer() = New Integer() {1, 3, 4, 5, 9, 10, 12, 13, 14, 16, 18, 19, 22, 26, 28, 29, 30, 36, 39, 41, 45, 48, 50, 54, 59, 65, 69, 74, 88}

طبعا كما تلاحظ أخي العزيز اسمينا المصفوفة T() و أعطيناها عناصر جديدة و طبعا في تريتيب تصاعدي

بعد ذلك أنشئ Function جديدة و كودها كالتالي :

  Private Function Search(ByVal Table As Integer(), ByVal Key As Integer) As Integer
1:      Dim NewT As Integer() = New Integer(Table(Table.GetUpperBound(0))) {}
2:      Dim I As Integer
3:      Dim Buffer As String
4:      For I = 0 To NewT.GetUpperBound(0) - 1
5:          If I > Table.GetUpperBound(0) Then
6:              Buffer = -1
7:          Else
8:              Buffer = Table(I)
9:
10:             NewT(Buffer) = I
11:         End If
12:     Next
13:     Return NewT(Key)
    End Function

الآن في كود البوتن أكتب مثلا الكود التالي

MsgBox(Search(T, TextBox1.Text))

الآن الى شرح الكود

******* المصفوفة : *****

أظن أن الأمر واضح جدا بالنسبة للمصفوفة فنحن قمنا بانشاء مصفوفة جديدة و أضفنا لها عناصر جديدة

****** الفنكشن *********

السطر 1 : أنشاء المصفوفة الجديدة و تحديد بعدها الجديد و هو يساوي الرقم الأخير في المصفوفة الأصلية و في مثالنا هذا "88" و طبعا هذا واضح لأننا أخذنا بالأعتبار أن عناصر المصفوفة الأصلية ذات ترتيب تصاعدي اذا نقوم بتحديد البعد موافقا للرقم الأخير

السطر 2 و 3 : أعلان متغيرات سنحتاجها

السطر 4 : جملة تكرارية تبدأ من 0 و تنتهي عند الخانة الأخيرة في المصفوفة الجديدة NewT و ذلك من أجل المصفوفة الجديدة

السطر 5 و 6 و 7 : هنا نقوم بعمل جملة شرطية مفادها أنه اذا أصبح العداد I أكبر من عدد خانات المصفوفة الأصلية يقوم البرنامج بملأ الخانة المقابلة في المصفوفة الجديدة بالرقم -1 و هو الذي لا يوجد لدينا في المصفوفة (او يمكنك ملأها بأي شئ مثلا بحرف - لكن اذا أردت ذلك فيجب أن تغير نوع المصفوفة ال String)

السطر 8 : و ضع محتوى الخانة Table(I) في المتغير Buffer

(مثلا اذا كان العداد I يساوي 3 فالمتغير Buffer سيأخذ القيمة 5) و في السطر التالي سنعرف لماذا ;)

السطر 10 : كما قلنا . المتغير Buffer = 5 اذا ف NewT(Buffer) يساوي الخانة الخامسة و سيأخذ قيمة العداد و هي كما سبق الذكر 3 و هكذا تمت عملية عكس المصفوفة B)

السطر 13 : يقوم بارجاع محتوى الخانة رقم Key و هو الرقم الذي نبحث عنه :)

****** كود البوتن ******

أوضح منو مفيييييييييييييش

**************************

أتمنى أن تجربوا الطريقة

و أنا في أنتظار تعليقاتكم التي تهمني جدا

و السلام عليكم و رحمة الله و بركاته

تم تعديل هذه المشاركة بواسطة crazy-man في 15 أبريل 2005 في 02:55

#2

السلام عليكم ورحمة الله وبركاته،

أهنئك على محاولتك المبتكرة، فكونك تخزن موقع العنصر في مصفوفة أخرى فعلا يسرع من عملية البحث جدا، إن لم تكن أسرع طريقة!

أرجو أن تأخذ هذه التعليقات من أخوك:

1- طريقتك في البحث تكاد تكون أبطأ من البحث الثنائي وأبطأ من البحث العادي أيضا اللتين ذكرتهما في مقالتك. (كما أقترح أن تقيس الوقت وتخبرنا بالنتائج) وهذا البطء ناتج من:

أنك تنشئ مصفوفة جديدة وتملؤها بالعناصر كلما أردنا أن نبحث عن عنصر معين، وهذا يؤدي إلى بطء شديد في البحث ولا سيما أن هذا السبب وحده يجعل من الطريقة أبطأ من البحث بالطريقة العادية! (تستطيع التخلص من هذا السبب لو خزنت المصفوفة الجديدة NewT من أول طريقة بحث عليها بدلا من تكوينها من جديد كلما أردنا أن نبدأ بحثا جديدا) أعتقد أنه يمكنك وضع NetT في general مع مصفوفتك الأولى بدلا من وضعها وتعبئتها في الطريقة search.

2-طريقتك تستهلك ذاكرة أكبر وذلك لأنك تنشئ مصفوفة أخرى (إن لم تكن بنفس الحجم) فستكون أكبر من المصفوفة الجديدة! وهذا بدوره يجعل طريقتك تستهلك أكثر من الضعف! (ولا أدري إن كان يوجد حل لهذه المشكلة)

لاحظ أنك إن تخلصت من المشكلة الأولى (وهي باستطاعتك) فستكون عملية بحثك الأسرع في العالم تقريبا لكن عملية بحثك تستخدم ذاكرة كبيرة لعمل ذلك!

حررت لتصحيح بعض الأخطاء الإملائية

تم تعديل هذه المشاركة بواسطة أبومازن في 18 أبريل 2005 في 11:25

#3

مرحبا،،،

هل نتحدث عن VB أم Basic القديم جداً أم VB.NET مع وضع سطرين تحت NET

عندما نتخيل كلمة .NET في البرمجة الحديثة يجب أن نتخيل شيئاً أساسياً ألا وهو OOPS أو البرمجة بالكائنات

هذه مقدمة سريعة...

ونصيحتي لكل من يبرمج بلغات DOT NET عليه البدء فوراً وسريعاً في فهم كل أسس OOPS وستقوم هذه الأسس بجعل البرمجة أوضح وأسهل وأسرع، وقوة لغات البرمجة الحديثة المبنية على NET تتبنى كافة مفاهيم وأسس OOPS ومن أهمها الوراثة Inheritance وأهم ما أريد قوله هو أن الوراثة جعلت Arrays أو المصفوفات ومشاكلها جزءاً من الماضي!!

أعود إلىالأخ Crazy-Man وفكرته في البحث داخل مصفوفة وطلبه التعليق على محاولته الرائعة (قبل NET وال OOPS) وأقول له أن ما طرحة الأخ أبو مازن صحيح 100% وأضيف على ما قاله الأخ أبو مازن...

أولاً: هذه طريقة رائعة لكنها تأخرت حوالي.... تقريباً.... 23 سنة حيث أن هذه النوعية من الحلول كانت مطروحة لحل مشاكل المصفوفات في لغات مثل FORTRAN و BASIC و COBOL و PASCAL

ثانياً: مشكلتي مع المنتديات ومن ضمنها هذا المنتدى الرائع (بل الرائع جداً) هي في المفاهيم الأساسية، لا يهمني أن يحل أحداً مشكلة ما أو يبرمج تطبيقاً ما بقدر ما يهمني أن يعمق المفاهيم الصحيحة للبرمجة الحديثة وبالتالي لا أتدخل ولا أعلق ولا أرد إلا في حالة واحدة أن هناك فكرة أو تطبيق أو حل يبتعد عن المفاهيم الأساسية الصحيحة

ثالثاُ: ال DOT NET قام بحل شامل لكافة مشاكل المصفوفات أي أننا لسنا بحاجة لحل أي مشكلة لأنه لا يوجد مشكلة من أصله، لماذا؟ لأن المصفوفات في DOT NET تتعامل مع OOPS وهي بدورها تتعامل مع الوراثة وبالتالي لدينا عشرات الأنواع من المصفوفات التي ورثت خصائص المصفوفات القديمة بمصفوفات حديثة ومرنة وتفاعلية Interactive

رابعاً: من لم يتعلم OOPS لن يتعلم DOT NET وبالتالي ستبقى نفس المشاكل التي واجهته في PASCAL أو VB 6 مثلاً قائمة في ال DOT NET

خامساً وسادساً وسابعاً حتى المائة: حلك صحيح مع أخذ تعليق الأخ أبو مازن في الإعتبار ولكن هذا الحل خطير ويهد كافة مفاهيم OOPS من جذورها

أخبراً لماذا كل هذا الصداع... إفتح نموذج وضع به Button وفي حدث Click للزر إكتب هذا الكود

Dim data() as Integer = {2,9,300,8,400,5,18,3,19,900,300}
dim a as new ArrayList
a.AddRange(data)
msgbox(a.IndexOf(19))

لن أشرح الكود فأعتقد أنه واضح، وأعيد أن ليس هدفي هو طرح حلول بقدر ما هو طرح مفاهيم أساسية، الكود أعلاه يحل مشكلة البحث عن أي عنصر من عناصر أي مصفوفة مهما ترتيب العناصر فيها وبطريقة سريعة جداً وسهلة جداً (ويوجد حل أيضاً في حالة تكررت عناصر المصفوفة)

ملاحظات أخيرة:

OOPS إختصار لجملة Object Oriented Programming System

ليت هناك من يتبرع ويشرح أسس ومقاهيم OOPS لزوار الموقع

تحياتي وتقديري لكم،،،

#4

دروس في البرمجة الكائنية OOP لجميع اللغات الكائنية

الدرس الأول: ماهو الObject ؟

وغيرها.. في منتدى الجافا.

المشكلة أن كثير من المبرمجين انتقلوا إلى .Net لأن مايكروسوفت أجبرتهم على ذلك بطريقة أو بأخرى. ولم ينتقلوا إلى .Net ليبرمجوا بـمبادئ البرمجة الشيئية!

#5

مشكروين على نصائحك و بارك الله فيكم

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

بالنسبة لكود الأخ "انترنت ماستر" فلم يحصل لي الشرف و تعاملت معه "الكود يعني" و حتى لو كنت قد تعاملت معه لكنت عملت الطريقة لأنني دائما أبحت ما وراء الفنكشن بحد ذاتها و لا أقتصر على استعمالها كما هي بل أسعى لمعرفة كيفية عملها و عمل محاكاة لها - قد يبدو ذلك لكم تافها لكني أجد متعتي فيه - و في الأخير أشكركم و لو كانت لديكم أية ملاحظات او توجيهات فلا تبخلو بها علي

و شكرا :)

▲ 1
#6

مرحبا،،

الأخ/ أبو مازن

شكراً على الرابطين الذين أشرت مشكوراً إليهما.

والشكر قطعاً موصول للأخ المجتهد مجدي محمود (جزاه الله خيراً) على هذا الجهد...

ولكن...

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

من وجهة نظري (المتواضعة) أن التدريس موهبة والشرح موهبة والتوضيح موهبة.

OOPS عبارة عن صخرة جلمود ضخمة الحجم تتطلب ممن ينبري لشرحها أن يحطم هذه الصخرة إلى حجارة صغيرة ومن ثم يكسر هذه الحجارة إلى شظايا ثم إلى تراب ثم يعجنها بقليل من الماء.

الأخ/ مجدي مشكوراً أنهى الخطوة الأولى تقريباً في رحلة الألف ميل.

OOPS تتطلب للأسف أكثر من هذا بكثير

ربما يسعفني وقتي ذات يوم لإكمال بعض الدروس التي بدأتها وأرجو من العلي القدير أن تحتوي على شرح تفصيلي أكثر لل OOPS

ما زلت أطالب المحترفين من رواد هذا المنتدي ممن لديهم الوقت ألا يبخلوا على زوار المنتدى في شرح تفصيلي للبرمجة بالكائنات، علماً بأن البرمجة بالكائنات هي الأساس للبرمجة الحديثة المعروفة بإسم COPS أو Component Programming System أو البرمجة بالمكونات إن جازت الترجمة.

عموماً البرمجة بال DOT NET بدون OOPS ستنتج برامج متهالكة مهللهة غير جادة ولا ترقى لمتطلبات السوق وأعطيك مثالاً بسيطاً كلنا نفعله عند برمجة التطبيقات أو المواقع (للهرب من OOPS) وهو إستخدام ADO.NET وكافة وسائل الإتصال بقواعد البيانات من ضمن التطبيق أي نرمي DataSet في نموذج و DataReader في نموذج أخر وهكذا دواليك... نعم... يشتغل التطبيق ويشتغل الموقع، لكن بعد فترة من الزمان تكتشف خطأ ما في البرنامج Bug أو تريد تحديث البرنامج، ماذا يحدث؟ لن تستطيع!! وقطعاً تعلم لماذا؟ تصحيح البرنامج أو تطويره (في معظم الحالات) سيكلف وقتاً ومالاً وجهداً أكثر وأكبر من إعادة البرمجة. بإستخدام OOPS من البداية وفصل الإتصال بقواعد البيانات (مثلاً) في Class منفصل سيجعلك تحل المشاكل وتطور في وقت أقل وتكلفة أقل...

الحوار حول OOPS طويل جداً ولكن ممتع.

إن كان هناك روابط إخرى في هذا المنتدى أو غيره تشرح OOPS بشكل أعمق وأشمل أكون لك شاكراً لتوجيهي إليها

الأخ/ crazy-Man

لا يوجد مصفوفة ثابتة (لم أواجهها على مدي أكثر من 25 عاماً من البرمجة إلا فيما ندر) لأن شخصية المصفوفة هي أن تكون Dynamic في معظم الأحوال أي أن (تصفر) بعض الخلايا أو تغير قيمها أو تلغي عناصر منها أو تضيف أخرى، تقول أنه في الجولة الأولى يتم إنشاء المصفوفة ثم يتم إستخدامها بعد ذلك ولأنها ديناميكية ستتغير المصفوفة الأساسية وسيتم إعادة تشكيل المصفوفة الثانية !! نفس المشكلة التي طرحها الأخ/ أبو مازن مسبقاً.

أتواصل معك لطلبك الملاحظات والتوجيه...

وتوجيهي لك هو أن تلقي بال VB 6 في أقرب سلة مهملات !!

والتوجيه الآخر (إذا لم يكن لديك مشكلة مع اللغة الإنجليزية) هو أن تنتقي الكتاب التالي وتغرق فيه لمدة 10 أيام فقط وهو:

OOP With Microsoft VB.Net and C#.Net

Robin A. Reynolds-Heartle

وهو من إصدارات شركة مايكروسوف ومتوفر في الأسواق ومن الأمازون أيضاً.

الكتاب أكثر من راااااااااااائع وبعد العشرة أيام صدقني ستتلذذ ببرمجة DOT NET

تحياتي وتقديري لكم،،،

#7

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

الأخ الأستاذ InternetMaster أشكرك على توضيحك الناتج عن خبرة كبيرة

اقتباس
المشكلة أن كثير من المبرمجين انتقلوا إلى .Net لأن مايكروسوفت أجبرتهم على ذلك بطريقة أو بأخرى. ولم ينتقلوا إلى .Net ليبرمجوا بـمبادئ البرمجة الشيئية!

أه أه أه أه أه أه

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

فلسطين الزاهية بألوان الحب والسلام

ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها

تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين

#8

شكرا لك أخي انترنت ماستر و ان شاء الله اقتني الكتاب و"أتلذذ ببرمجة الدوت نت" على حسب قولك

و كما اشار اخي seahmad كم نتمنى ان يجود علينا اهل الكرم بدروس في ال OOPS

و السلام عليكم و رحمة الله و بركاته

#9

السلام عليكم ورحمة الله وبركاته

جزاكم الله خيراً أخواني الكرام وأخص بالشكر الأخ الفاضل "InternetMaster"

وأشكر لك حرصك على تصحيح مسار المفاهيم الخاطئة فبارك الله فيك

أخي الكريم ..

لدي تعليق ربما لأنه انغلق عليّ فهم بعض ما ذكرتموه فأرجو التوضيح

ذكرت وقلت :

اقتباس
وأعطيك مثالاً بسيطاً كلنا نفعله عند برمجة التطبيقات أو المواقع (للهرب من OOPS) وهو إستخدام ADO.NET وكافة وسائل الإتصال بقواعد البيانات من ضمن التطبيق أي نرمي DataSet في نموذج و DataReader في نموذج أخر وهكذا دواليك... نعم... يشتغل التطبيق ويشتغل الموقع، لكن بعد فترة من الزمان تكتشف خطأ ما في البرنامج Bug أو تريد تحديث البرنامج، ماذا يحدث؟ لن تستطيع!! وقطعاً تعلم لماذا؟

أنا لا أعرف لماذا :rolleyes:

فالذي أعرفه بالفعل أن عملية التصميم من خلال الواجهة الرسومية مباشرة مثل إسقاط DataSet على النموذج مباشرة أقول أن عملية التصميم اختلفت فعلاً عن بيئة VB6 فالأمر الآن مع الدوت نيت أصبح أن ما تضعه على النموذج تجده داخل الكود وما تكتبه في الكود يظهر لك أثره على واجهة النموذج الرسومية مباشرة ، هذا طبعاً مختلف عما كان عليه ال vb6 والذي كان يخزن هذه البيانات داخل ملفات منفصلة ويكون بالفعل عملية التصحيح صعبة للغاية ، أما الآن فهذا المفهوم اختفى مع العهد البائد ..

ثم أليست DataSet كائن يندرج تحت ال OOP ؟ فلماذا لا يمكن التعامل معه وتصحيحه تحت هذا المفهوم ؟ وكيف تكون البرمجة باستخدام ADO.NET ذلك هرباً من ال OOP ؟

وكيف تريد أن تتصل بقواعد البيانات إذاً باستخدام مفاهيم OOP وبدون ADO.NET

بارك الله فيك

#10

السلام عليكم ورحمه الله

احب ان اشكر جميع الاخوة الذين قامو بالرد على الموضوع وجزاكم الله خير .

بالنسبة للاخ crazy-man انا اشكره على مجهوده وعلى تفكيرة بهذه الطريقة وهي الطريقة الصحيحه للابداع وليس لجني الاموال ومشاركته هذه تذكرني بالمنتديات الاجنبية وحبهم للجديد والاحتراف وارجو ان لا تحرمنا من هذه اللفتات الجميله حتى وان كان غير صائبة بعض الشيء .

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

- انا تعملت OOP عن طريق الجافا واعتقد انها هي الطريقة الصحيحه لتعلم البرمجه الموجهه للاشياء وايضاً اعتقد ان طريقة .Net مسروقه من java حيث انها تعمل بنفس اسلوب .Net من عام 1994 على حسب المعلومات التي سمعتها من الدكتور .

- افضل مرجع انا وجدته لل OOP هو كتاب الاستاذ تركي عسيري ، هو الكتاب الوحيد باللغه العربية الذي يحاول توصيل المعلومه بقدر ما يسعى لفهمها وليس طريقة التعامل مع OOP بدون فهم المبادئ .

الاستاذ InternetMaster المشكله ليست في فهمها وانما طريقة استخدامها ومتى نتعامل معها وما هي الطرق الصحيح في التعامل بحيث هناك تشابه كبير بين الخصائص والطرق والمشيدات وغيرها فنحتاج إلى امثله و تطبيق ولكن من ناس مثلكم لها خبره في الموضوع ، وقد سبق وطرحت فكره على الاخ HMS بأن نقوم بتطبيق بعض الافكار بـ OOP في موضوع سؤال الاسبوع ، وقد خطرت لي هذه الفكره بعد ماوجهتي لمشكله وهي كيفيه الوصول إلى جدولين في قاعده بيانات مع العلم انا الاتصال والاستفسارات وكل شيء عبارة عن class ترث من بعضها البعض وإلى الان لم استطع ذلك <_< .

والسلام عليكم ورحمه الله وبركاته

" اللهم لاسهل إلا ماجعلته سهلاً وأنت تجعل الحزن إذا شئت سهلاً "

003.gif

قواعد طرح الأسئله والمشاركات

-------------------

MSN Messenger : nontop@gmail.com

Happy coding

-------------------

#11

الأخ/ محمد النحراوي

سلام الله عليك ورحمته وبركاته،،،

أولاً الجملة التي ذكرتها وهي (وكيف تكون البرمجة باستخدام ADO.NET ذلك هرباً من ال OOP ؟) غير صحيحة، لم أقل هذا في ردي السابق وما قلته هو أننا عند برمجة التطبيقات والمواقع نهرب من إستخدامات OOPS وهذا صحيح بنسبة 99% وبالذات في المواقع والتطبيقات العربية. وللأسف مازلنا نقوم بهذا (لا أستثني نفسي).

ثانياً لا أبحب القفز للنتائج .... يجب أن نتفق أنا وإياك على مفاهيم موحدة عن OOPS حيث قد يكون فهمي للمتر 90سم وفهمك له 100سم وبالتالي نتحدث عن مترين مختلفنين (بالمناسبة لماذا المتر 100سم؟)

ما أريد قوله أن OOPS ليس مجرد Classes و Objects ووراثة وتغليف وغيرها... ال OOPS مفهوم متكامل والفرق بين OOPS و Class و Object هو مثل الفرق بين سيارة وتويوتا وداتسون ومثل الفرق بين قواعد البيانات وجدول وإستعلام

أي أن ال OOPS نظام وإجراء متكامل A Concept وفهمي له قد يختلف عن فهمك له وقد نختلف أنا وأنت عن فهم الآخرين له وبالتالي القفز للنتائج والتحدث عن عن كيفية إستخدام المتر في القياس قبل أن نتفق على تفسير ما هو المتر يشكل دائرة متداخلة من التساؤلات ولا يقدم جديداً أي أن الخطوة الأولى أن يتبرع من يضع الخطوط الحمراء ويشرح لنا OOPS بالتفصيل الممل ويصبح لدينا نفس المفاهميم ونفس الرؤية.

ولكني سأتجاوز هذه النقطة وأفترض أنني وإياك لدينا نفس المفاهيم والرؤية عن OOPS وإعود معك إلى موضوع ADO.NET ومثال DATASET ولدي شرط أساسي آمل أن تتفق معي عليه وهو أننا عندما نتحدث عن DataSet فنحن نتحدث إما عن تطبيق على بيئة Windows أو نتحدث عن إنترانت وقطعاً لا نتحدث عن موقع إنترنت حيث أن إستخدام DataSet في مواقع الإنترنت مصيبة فادحة إنتشرت مؤخراً وال DataSet لم تنشأ لهذا الغرض إلا في حدود وشروط معينة.

تعال معي إلى تطبيق أو موقع إنترانت (ليس إنترنت) يوجد فيه 125 نموذج من ضمنهم 63 نموذج تحتاج إلى DataSet وكل DataSet يغذي إما DataGrid أو Table (بالمناسبة هذه بيانات حقيقية من موقع إنترانت نقوم بتسليمه للعميل حالياً)

ماذا نفعل؟ هل نرمي DataSet واحدة في كل نموذج من النماذج ال 63 ونقول أن DataSet عبارة عن OOPS وبالتالي العملية سهلة والموضوع بسيط ... خلاص ال DataSet يغذي DataGrid هنا ويغذي Table هناك وتأخذ العملية بضعة دقائق فقط!!

للأسف هذا ما نفعله، لماذا؟ لأنه سهل وسريع ومباشر وفي داخل عقولنا نستطيع أن نتخيل نموذج فيه كافة إحتياجات هذا النموذج (التفكير والتخيل وإدارة النوذج أسهل) لأن كافة معطيات وإحتياجات هذا النموذج متوفرة في النموذج، التخيل أصعب وأعقد إذا كان النموذج يستمد بياناته من مصادر مختلفة.

ماذا حدث الآن؟ يوجد خطأ في قاعدة البيانات ترتب عليه إجراء بعض التعديلات وبالتالي تغييرات في Stored Procedure داخل خادم قواعد البيانات وبالتالي تغيرت طريقة الإتصال إلخ... وإحتجنا إللى إجراء تعديل على DataSet !!!!!!!

63 نموذج بحاجة إلى تعديل !!!! تخيل

ماذا لو إنشأنا Class فيه Method تأخذ Connection وتعيد لنا DataSet!!! مرحباً بك في عالم OOPS

عند تحديث هذا ال Class تتحدث النماذج 63 كلها مباشرة في نفس الوقت !!!

إحفظ معي أهم قاعدة من قواعد OOPS

عندما تقوم بكتابة حل لمشكلة ما مثل كيفية الإتصال بخادم قواعد بيانات Oracle مثلاً فيكفي أن تكتبه مرة واحدة طيلة حياتك العملية، عندما تكتب Program يقوم بترقيص نموذج فيكفي أن تكتبه مرة واحدة طيلة حياتك العمليةّّ!! وهذا ما يسمى Code Reuse إي إعادة إستخدم الكود وهي أهم نقطة في ال OOPS

عندما أضطر إلى إعادة كتابة أي جزء من برنامج فببساطة أنا لا أستخدم OOPS

العملية أشمل وأوسع عندما ندخل XML Web Services في الموضوع يصبح لنا كنز غير طبيعي...

سأقوم أنا وأنت بكتابة XML Web Service عن القرآن العظيم بإستخدام OOPS عن طريق Visual Studio .NET ونضع فيه كل ما يخطر على بالك من Methods مثل إستدعاء سورة ما أو آية ما أو البحث عن آية أو تلاوة أية من قارىء ما و... و.. و... ثم نستضيف هذا XML Web Service في مكان ما ونعلن أن الإشتراك يكلف 5 دولار

وفتح الله على وعليك وجاءنا 1000 مشترك أي اننا نقبض شهريا 5000 دولار

ماذا يعني هذا بلغة OOPS؟

لدينا 1000 موقع مختلف كل منها يستطيع أن يعرض صفحات وآيات وسور القرآن العظيم بإستخدام موقع واحد فقط !!! بدون OOPS وبدون XML Web Services كان هذا حلماً من أحلام اليقظة سابقاً (وبالمناسبة من لديه الإستعداد لعمل تطبيق للقرآن العظيم تجاريا فأنا مستعد)

عودة إلى سؤالك كيف يتم الإتصال بقاعدة البيانات بإستخدام OOPS؟ وصدقني هذا هو أهم سؤال على الإطلاق هذه الأيام وهو ما يعرف ب Data Access Layer أو طبقة الإتصال بقواعد البيانات أو ما يعرف بالطبقة الثانية في 3 tier applications

وهو هدف كل مطور ومبرمج وهو أسهل مما تتخيل وهو عبارة عن Classes منفصلة على شكل DLL تستخدمها متى شئت في أي تطبيق أو موقع إنترنت أو موقع إنترانت. أي أنك بإستخدام OOPS قمت بعزل كافة إحتياجاتك عن كيفية الإتصال بقواعد البيانات في مكان منعزل وموحد. ومن هنا يبدأ COPS أي البرمجة بالموكونات والموكونات عبارة عن Classe وObjects تتحادث مع بعضها البعض بإسلوب معين.

سأعطيك مثالاً آخر عن تطبيق قمنا بإنهائه مؤخراً لأحد العملاء...

العميل عبارة عن شركة برمجة تقوم بتطوير الألعاب ومن ضمنها ألعاب (ورق اللعب) ولديهم الحاجة إلى تطوير أكثر من 100 لعبة وتوزيعها على أقراص ليزر في السوق ... ماذا كان إحتياجهم؟ ما الذي يجمع هذه ال 100 لعبة، الجواب هو الحاجة إلى تطوير ال 52 ورقة + 2 جوكر التي تشكل في مجموعها أوراق اللعب ما هي الحلول المطروحة أمامهم؟

إما أن يصمموا أوراق اللعب لكل لعبة على إنفراد ويستخدموا البرنامج 100 مرة وهذا مصيبة!! لماذا لأن أي تغيير في أوراق اللعب مثل أن تتغير صورة الجوكر مثلاً يتطلب تغيير 100 لعبة!!

بإستخدام OOPS أنشأنا لهم Class واحد يخدم ورقة لعب واحدة فقط !! لاحظ أن OOPS حل لنا مشكلة واحدة فقط وهي أن لدينا الآن ورقة لعب واحدة تستطيع أن تجعلها أي ورقة من الأوراق ال 54 ولكن ورقة لعب واحدة لا تصلح لإنشاء Deck أي مجموعة الأوراق كلها.

صدقني فكر في الموضوع لوهله وإفتح Visual Studio.Net وإختر لغتك المفضلة VB أو C# ثم إختر Windows Class Library صدقني خلال أقل من ساعة سيكون لديك ورقة لعب واحدة. وصدقني أيضاً أنك تجلس أما الحاسب الآلي بضعة أيام ولا تجد حلاً لإنشاء مجموعة الأوراق التي تشكل 54 ورقة في مجملها لماذا؟ لأن OOPS توقف هنا !! ونحتاج إلى أداة مختلفة يكون عملها هو أن تكون محتوى أو صندوقاً ل 54 Class مختلف... مرحباً بك في عالم Components أو COPS وهو الذي سيقوم بمساعدتك

عندما تضعط Button على نموذج ترى الزر أمامك ولكن عندما تضع MainMenu أو DataSet تراها تسقط في أسفل الصفحة لماذ؟

أحاول جاهداً في هذا الرد أن أركز على المفهوم العام وليس على ماهية OOPS و COPS خشية أن أبدأ حديثاً لا يسعفني وقتي في إنهائه.

الحديث عن OOPS ممتع والحوار معك أكثر متعة

تحياتي وتقديري،،،

#12

نحن مقتنعين بما تقول InternetMaster ولا داعي لكل هذا الجدال

ليتك لو وضعت درسا في الوقت الذي استغرقته في ردك السابق (أنا لم أقرأه لطوله)

"أنا زعيم بيت في ربض الجنة لمن ترك المراء وإن كان محقا" أو كما قال عليه الصلاة والسلام

تم تعديل هذه المشاركة بواسطة seahmad في 21 أبريل 2005 في 09:58

فلسطين الزاهية بألوان الحب والسلام

ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها

تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين

#13

مرحبا،،،

لم يكن جدالاً !!

إذا لم تقرأ !!!

قلن تنفعك أية دورس. نقطة.

تحياتي،،،

#14

بارك الله فيك أخي انترنت ماستر و معلومات ما شاء الله قيمة و انا فعلا منذ مدة كنت أشاهد دروس في النت و هي دروس على شكل فيديو حول الأرتباط بقاعدة البيانات و معظم الدروس التي ؤأيتها اذا لم أقل كلها لا تستعمل الطريقة المنتشرة و هي سحب و اسقاط ال DataAdapter و من ثم انشاء ال DataSet و لكن يقومون بما تفضلت و ذكرته اي انهم ينشؤون فنكشن في كلاس مثلا للConnection و يقوم باعادة DataSet و هكذا يتعاملون مع قواعد البيانات و انا في ذلك الوقت كنت أستغرب لما كل هذا التعقيد في عمل الكود في حين يمكننا عمل ذلك في أقل وقت ممكن عن طريق السحب و الأسقاط لكن عندما قرأت بعد ذلك حول ال OOP وجدت أن تلك هي البرمجة الحقيقة و الآن كما تفضلت و ذكرت لنا خصائص هذه الطريقة قررت ان اتعامل منذ اليوم بهذه الطريقة في كل اتصالاتي بقاعدة البيانات

و بارك الله فيك و زادك من علمه

#15

وعليكم السلام ورحمة الله وبركاته

اقتباس
وأعطيك مثالاً بسيطاً كلنا نفعله عند برمجة التطبيقات أو المواقع (للهرب من OOPS) وهو إستخدام ADO.NET

يعني كلامك

وبالنسبة لباقي الكلام باختصار شديد

أحب ان أعلمك أولاً أنني والحمد لله أستغل مفاهيم OOP بشكل جيد في برامجي

ثانياً أنا لم أسألك "وكيف تريد أن تتصل بقواعد البيانات إذاً باستخدام مفاهيم OOP " كما قلت أنت :

اقتباس
عودة إلى سؤالك كيف يتم الإتصال بقاعدة البيانات بإستخدام OOPS؟

ولكنني قلت لك :

اقتباس
وكيف تريد أن تتصل بقواعد البيانات إذاً باستخدام مفاهيم OOP وبدون ADO.NET

لأن هذا المفهوم من كلامك الأول

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

وفقك الله

#16

السلام عليكم ورحمة الله وبركاته

الأستاذ InternetMastr

جزاك الله خير .. وجعل مابذلته من توضيح للـOOPS في ميزان حسناتك.

تم تعديل هذه المشاركة بواسطة seahmad في 21 أبريل 2005 في 18:23

فلسطين الزاهية بألوان الحب والسلام

ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها

تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين

هذا الموضوع مغلق.

مواضيع مشابهة