• 0
رغيد الطيب

كثُر الحديث عن التي أسموها Oop


سؤال

بسم الله السميع العليم

كثُر الحديث عن التي اسموها OOP

يرحم الله أحمد شوقي حين قال : خدوعها بقولهم حسناءُ ---- و الغواني يغرهُن الثناءُ ! ...... هل يتُرى هي بذلك البريق و الحسن أم أن الناس (الكُتاب و المبرمجون) بالغوا في وصفها ومدحها حداً ضاق به الضائقون ذراعاً من المبتدؤن و الهواه في عالم البرمجة.

فإذا كنت مبرمجا إنترنتياً (كلمة دخيلة على العريبة تعني محب للإنترنت ومعتمد عليها بشكل كبير في حياته اليومية) .. فإنك لابد وأن تكون قد وجدت الكثير من المقالات و الكتب و المتشدقون هنا و هناك (يجب ان تبرمج بإستخدام الـ OOP) .... خطوة بخطوة نحو تعلم الـ OOP .... الـ OOP هي الطريقة البرمجية المثلى .... من لا OOP له فلا إحتراف له .... و برنامج بدون OOP ليس ببرنامج.

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

هل يمكن لهم ان يقولوا لنا الآن عشر فوائد لها ... ام انه مجرد كلام في الهواء ؟

هل يستحق الأمر بدل عناء القراءة و البحث وتعلمها ؟

هل نجحوا او سينجحون في نقلها لنا ببساطة .. للعمل بها و إستخدامها ...لا للتباهي بمعرفتها ؟

ببساطة : هل هي مفيدة وضرورية كما يحاولون إقناعنا بها ليلاً نهاراً ؟

هل انت مجرد ساذج (اعتذر عن قسوة التعبير على ضرورته) تصدق كل ما تسمع وتنفق وقتك في تعلم ما يمليه عليك الآخرون ؟

.........

كأنني ارى عيونا تلمع غاضباً و إستعداداً لكتابة ردود شديدة اللهجة على أسئلتي بل ربما ان هناك سيوفاً (اقلامنا سيفونا بتعبير آخر لوحات مفاتيحناOur Keyboards ) تشحذ الآن لتنغرس في صدري مسفههً لتساؤلاتي .... ناقمة على تجرأي على المصونة بنت الحسب و النسب سليلة الأشراف عالية المقام العفيفة OOP بنت لغات البرمجة المتحرمة وكيف سولت لي نفسي المس بها او مجرد التشكيك في كونها ذات نفع للناس !

الا مهلا معشر المبرمجون فإني خائض فيها لا يمنعني منها مانع و لا يردعني عنها رادع .... فتصّبروا ما استطعتم لأنكم ... ستجدون في كلامي مايغضبكم ... و إن لم ينفعكم فلن يضركم .... و خلوا بيني و بين الأبرياء من المتخبطون الذين تتخابط بهم المقالات و الكتب وهم في البرمجة هواة يبحثون على الطريق الى الأحتراف فيصدقون هذا و ذاك و يتبعون نصيحة ترمي بهم هنا و أخرى تقذف بهم هناك ... حتى و إن كانت نوايا الناصحون صالحة غير ان طريق متبعوا النصائح شائك ... في وقت كثُرت فيه التقنيات حتى التخمة و اصبح من المهم (بل من الضروري) أن تكون لديك عدسه كبيرة تحقق بها و تدقق قبل ان تقرر ان تتعلم تقنية ما ... فهل هي ما تبحث عنه وهل ستفي بغرضك المنشود وماهي التقنيات المشابهه فلعل فيها ما هو افضل لما تنوي القيام به ... فكم من المرات راح فلان من الناس (معشر المتخبطون من المبرمجين) يقرأ كتاب تلو آخر و يدرس كودا بعد كود عن موضوع معين ليكتشف بعد ان اضاع الكثير من الوقت و الجهد ان هذه التقنية ليست التي يبحث عنها !!! ... لا اقول انه خسر فما تعلمت من شيء إلا نفعك بشكل أو بآخر ... غير أن الوقت قتَّال و إنفاقه في اوقات كثيرة من مراحل تطوير نظام معين مهم جداً ولايستهان به ...و انت إن كنت لم تجرب البرامج ذات الوقت الزمي المحدد الذي يجب ان تنجز فيه ( Targeted Date او Deadline Time ) ! ....فا أسئلني عنها لاحقا فقد اخبرك عن عيونك التي ستميل لتبدو كعيون دب الباندا من الدوائر السوداء التي ستظهر حولهما من قلة النوم و الأرق.

انا لا أخاطبكم معشر الخبراء ..... فهلا اُخلي السبيل بيني و بين التائهون نثرثر كما يحلوا لنا ... نذم و نمدح من نشاء ونهتك الأسوار العالية التي فُرضت امام اسماء التقنيات اللامعة في عالم البرمجة بغير إستثناء ... كالأخت OOP التي انوي ان اخوض فيها خوضاً قد يبدو مختلفاً عما انتشر عنها هنا و هناك ... فإن كنت مبرمج (لا اقول مبتدء) فالمبتدء له (بل عليه) ان يخوض في البرمجة و يكتب العديد من البرامج قبل ان يكون معي هنا ... ولكن إن كنت مبرمجا هاوي كلما اردت او طُلب منك برنامج قمت مهرولاً نحو الفيجوال إستوديو و فتحت مشروعا جديدا و بدأت بكتابة الأكواد !!! ... فأنت الشخص المطلوب (المقصود بالمقال) و الذي اريد الخلوه به هنا فما قمت به للتو مجرد هرولة و تخبط و تيه ( أكرر اعتذراي عن اختيارتي للكلمات ) .... ان تبدأ بالكتابة فورا شيء خاطئ و أن تضيع الوقت في التفكير العقيم شيء خاطئ ايضاً .... لذا سنتحدث هنا و نفنذ و نتعدى على أسوار الـ OOP و نغلي حرمتها التي فرضت علينا ...خِلسةً عن أعيُن الخبراء ..

و لندع الخبراء بعيدا عنا ..... فاؤلئاك قومٌ لا خوف عليهم و لا هم يعجزون عن إنجاز اهدافهم بالطرق السليمة دائما.

لنا لقاء قريب بإذن الله تعالى.

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

27 إجابة على هذا السؤال .

  • 0

من خلال خبرتي الطويلة في البرمجة عموما مع خبرة قليلة في OOP ، إتضح لي أنني لو اعتمدت على استخدام OOP ما راح أخلص نص برنامج ، ، ،

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

على كل حال فإن مبرمج VB.NET يستطيع البرمجة كما يحلو له بدون استخدام منطق OOP المعقد ، ولقد عملت برامج معقدة جدا لا يمكن تخيلها بدون أختنا OOP

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لاحياة بلا OOP

و لا تستطيع ان ان تقول اني محترف ان لم تعتمد على OPP على الاقل بنسة 70% من برنامجك .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله السميع العليم

يبدو انني قد فُهمت بشكل خاطئ !!! :) ... انا لم ابدأ المقال بعد ياشباب واتمنى ان لايستبق اي شخص الأمور لأنني انوي الإطالة بإسلوب آخر بعيدا عن شرح مبادىء الـ OOP فكثيرا غيري قد شرحوا .. وما سأقوم به هنا جعل الشخص نفسه بإذن الله تعالى يقرر عن طريق تطوير برنامج واحد خطوة بخطوة بالطريقتين (الطريقة التقليدية و طريقة الـ OOP) و على نار هادية بحيث تتجلى الفروقات و الصعوبات والفوائد.

ولهذا فأتمنى ان لا تكون مقدمة موضوعي قد خدعت احدا واستخلص منها انني من المعادين للـ OOP ... ولا اريد ان اكون احد المعجبين المصفقين لها امامك (بغض النظر عما اكنه لها) فلا تغرنك بي كلماتي ... فلا ابغض لقلبي من ان يتحول موضوعي هذا مرتعاً للمؤيدين و المعارضين يختلفون ويتناقشون فيه عن الموضوع ... ما اخطط القيام به هنا هو ان نطور امام عينيك برنامج واحد بالطريقتين المختلفتين كي انتهي في الاخير وقد تكونت في رأسك عن طريق متابعة السلسلة بهدوء تام فكرة جلية الموضوع فتختار بينك وبين نفسك طريقك لتسير عليه محفوفا برعاية الله وحفظه.

فياحبذا لو تمهل خبرائونا قليلا ليتحيوا لنا معشر الصغننين مجالا نقنع بعضا بعضا عن طريق الكود خطوة بخطوة و نحاول معا تغيير اسلوب النصيحة المباشرة فقلما (بل ربما لايوجد) من يستمع لك عندما تقول له مباشرة ( اسمع اترك لغة برمجتك هذه العقيمة و اسمع نصيحتي فا انا اخوك وتعلم لغة كذا من الصفر )

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

ومسئلة تغيير أسلوب البرمجة هي بالضبط كتغيير لغة البرمجة فسوف تتفاجئ بأنك تفتح الفيجوال استوديو ولا تعرف من أين تبدأ لأنك جديد على المفهوم OOP فبما ستبدأ بهذا ام بهذا وعلى الرغم من انك تستخدم لغة برمجتك التي تحبها و على الرغم من ان البرنامج بسيط ولو ابعدوا عنك قيود تطبيقه بالـ OOP فسوف تنطلق مثل الصاروخ فيه لانها ببساطة ماتعودت عليه .... فلا يظن ظآن ان تغيير اسلوب البرمجة هين ابداً.

........... ولكن !!! ....... نعم ولكن ..... إن كان هناك من يريني كيف يكون الفرق بعمل البرنامج نفسه امام عيني احدهما بالفيجوال بيسك والآخر بلغة (الواق واق !!) خطوة بخطوة ورأيت بأم عيني سحر لغة الواق واق وقوتها !! .... فمن يدري لربما وجدتني الآن مبرمج (واق واق) محترم في اوساط الواق واقيين .... نعم من يدري !!! .

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

تحياتي

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

رأيت الموضوع منذ فتره و بعد ان قرأت بتأنى قمت بالتصويت على "أستخدمها أحيانا بحسب الظروف و المتطلبات." و لكن ما ادهشنى فعلا انى وجدت 6 اشخاص قد اعطوا اصواتهم لـ "أستخدمها في جميع برامجي !"، ايضا تعاطفت مع الأخوه الذين صوتوا لـ "ألجأ إلى إستخدامها عندما لايكون هناك خيار آخر.". لن اقوم بالتعليق الان سأترك الاخ رغيد يكمل كما يريد و عند فتح باب النقاش سأشترك بإذن الله

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

1 - ما هى مزايا الـ OOP و ما هى عيوبها؟

2 - ما مزايا البرمجه بإستخدام الدوال و ما هو عيوبها؟

3 - هل اتقنت كلا الإسلوبين لتحكم عليهم؟ (اجب بصراحه لنفسك و ليس لى)

4 - هل تستخدم الـ OOP بكل امكانياتها ام بعض من امكانياتها ؟

5 - هل اتقنت استخدام الدوال بمعنى هل تعرف عنها كل شئ ؟

6 - هل يقتصر استخدامك للـ OOP على صنع فئات جديده ؟

7 - هل قمت بإستخدام مفهوم الـ Polymorphism من قبل فى احد برامجك ام انك درسته نظريا فقط و تعتقد كما البعض انه توجد بعض المفاهيم للتعلم النظرى فقط ؟

8 - هل جربت ان تبرمج انواع مختلفه من البرامج (قواعد بيانات - انظمة ملفات - برامج رسم - العاب - مترجمات - برامج تحميل الملفات - Virtual Machine .....) ؟

9 - هل تعلم ماهى الـ plug-ins و هل جربت تصنع واحده لأى من برامجك بإستخدام الـ OOP او الدوال ؟

و الله ولى التوفيق

تم تعديل بواسطه Muhammad alaa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أعتقد أن هناك لبس حول مفهوم ماهية الـOOP. عندما تبرمج تحت مظلة OOP لا يعني بتاتاً أنك لا تستخدم الدوال أو البروسيدجرس. لا يعني بتاتاً أنه يجب أن تستخدم الـpolymorphism و الـinheritance و جميع مفاهيم الـOOP في كل شئ.

الـOOP في معناه النهائي هو اعتبار كل شئ على أنه كائن object. عندما تستخدم الـADO.NET مثلاً للإتصال بقاعدة بيانات فأنت تستخدم الـOOP لأنك تستخدم كائن SqlConnection (مثلاً) الذي هو بالتالي يرث من DbConnection. و كذلك عندما تستخدم DataSet او TextBox.

عندما تعمل صفحة ASP.NET أنت ترث من System.Web.Page و عندما تصنع فورم فأنت ترث من System.Windows.Forms.Form و هلمجرا.

لـOOP سمعة بأنها معقدة، و هي بالفعل يمكن أن تصبح معقدة، و لكن ليس بالضرورة.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اتمنى ان يعي الجميع ذلك اخي الكريم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

:resentful: :resentful: :resentful: :resentful: :resentful:

منتظرك أخي رغيد بفارغ الصبر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

أنا اللذى تقصده يا أخ رعيد

الذى تريد أن يخلوا بينك وبينى

أنا سأستمع فقط وأرى مناقاشاتكم لكى أتعلم وأدرى وتنير رأسى بما هو فى صالحى لأنى فعلا كالتائه أتمنى ان أكون مثلكم ولكن لا أعرف الطريق أذهب هنا وهناك وأقرأ هنا وهناك

لا أدرى متى سأصل وكيف ألم بكل شيئ عن الفيجوال دوت نت

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله السميع العليم

والآن لنبدأ سوياً بعون الله تعالى ... و من الأجمل او اوضح انني لن اقوم هنا بشرح مبادئ الـ OOP و اقسامها لأن الشبكة تكاد تكون متخمة بالكتب و المواقع العربية و الأجنبية التي تشرح وتفند هذه التقنية تفنيدا (يمكنك الإعتماد على كتاب الأخ تركي كمرجع باللغة العربية) و لا اخفيك انني لا اريد ان اضيف الى هذه التخمة ... و من وجهة نظري ما نحن بحاجة إلية هو لماذا وكيف وامثلة على استخدامها وليس مزيدا من الشروحات عن اقسامها وما هو Overloading, Encapsulation, Polymorphism .... و .... و .... و .... إلخ.

والآن ان اكثر المشاكل التي واجهتني هي اختيار البرنامج المناسب التي ستظهر فيه الفروقات بين الاسلوبين البرمجيين, كما ان حساسيتي المفرطة وحبي الغير المحدود ( العكس تماماً ) للبرامج المحاسبية وقواعد البيانات يجعلني ابعد هذه الفئة معتذرا من محبيها ومن محبي العمل مع متطلبات السوق من المحترفين فلست مجدر هاوي لا ابرمج للسوق وانما لهواي (اعاذني الله واياكم من متتبعي الهواء).

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

البرنامج بسيط واريد مثال بسيط بإستخدام الاسلوب العادي دون OOP ونسيت ان اخبرك ان الاسلوب العادي يطلق عليه البرمجة البنيوية او الـ Structured Programming .

هل من مشاركات سريعة وبسيطة قدر المستطاع !!

تحياتي

تم تعديل بواسطه رغيد الطيب
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحبا وشكرا كتير لصاحب الموضوع للافادة اكتر عن موضوع الـ OOP يلي الكثير منا ما بيعرف كتير عنه ومنهم أنا :wink:

انا قبل ما انتقل من نسخة VB6 الى بيئة الدوت نت ما كنت استخدم الOOP بشكل كبير جدا لانه VB6 ما كان يدعم تماما الـOOP مثل الدوت نت اللي اصبحنا نستفيد فيها بكل مزايا الـOOP متل مبرمجي الـC++ والجافا

ما بدي احكي عن الـOOP واعرفها بطريقة مملة وممكن ما اقدر اوصلها للمستفيد ولانه اكترنا بيعرف عنها ما بقدر اعرفها بطريقة احسن من الموجودة بالكتب

لكن انا بقدر اقول انه الـOOP ريحتنا بشغلات كتير واهمها الوراثة

وطبعا المبرمج حر لو ما استخدم الـOOP في برنامجه ومو شرط يستخدمها لانه في كتير مبرمجين اللي عملو برامج رائعة وقوية دون استخدام الـOOP بس هذا ما بيمنع انه نحكي انه لو استخدم OOP كان سهل عليه كتير بالبرمجة

0

شارك هذا الرد


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

البرنامج بسيط واريد مثال بسيط بإستخدام الاسلوب العادي دون OOP ونسيت ان اخبرك ان الاسلوب العادي يطلق عليه البرمجة البنيوية او الـ Structured Programming .

هذا اسلوب تفكيرى

لإتمام هذا المثال احتاج إلى فئة تمثل الدائرة التى سيتم رسمها و فئه تمثل متجه وهو الاتجاه الذى تتحرك فيه الدائره و فئه تمثل الكره التى تتحرك و تحتوى على نسخه من المتجه و نسخه من الدائره و الـ Bound Rect (المثل فى حالتنا هذه بالفورم) و متغير خاص بسرعة تحرك الكره (و الذى فى حالتنا هذه ايضا سيكون بقيمه ثابته بمعنى يمكن جعله ثابت).

السؤال الأن كيف يمكن صنع هذا المثال بدون استخدام هذه الفئات هل سنستخدم structures (مع العلم انه عندئذ سنكون استخدمنا الفئات و لكن بشكل اخر).

البرنامج بسيط واريد مثال بسيط بإستخدام الاسلوب العادي

ما المقصود بالإسلوب العادى ؟

و الله ولى التوفيق

تم تعديل بواسطه Muhammad alaa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله السميع العليم

إستغلال للوقت و توحيدا للإسلوب وحتى لا تبدوا الامثلة المتتابعة غير متناسقة للدارس نتيجة لتطويرها من قبل اكثر من مبرمج اسمحوا لي ان اقوم بوضع الامثلة وتطويرها رويدا رويدا.

والان البرنامج الاول :

ومتطلباته كرة تنطلق في ارجاء الفورم وتغير اتجاهها عند اصدامها بحدود الفورم وذلك بإسلوب عادي خالي من مفهاهيم الـ OOP !

لتصميم البرنامج .... سنحتاج لتعريف بعض المتغيرات في البداية مثل :

	Private CircleBounds As Rectangle ' لتخزين احداثيات الكرة
Private rand As New Random ' لتوليد ارقام عشوائية لاحقا
Private dX, dY As Integer ' لتخزين اتجاهات الحركة الحالية
Private Speed As Integer ' متغير لخون سرعة الحركة

وعند تحميل الفورم سنكتب كود لتهيئة البرنامج للعمل بالشكل التالي :

   Private Sub Form1_Load(…) Handles Form1.Load

CircleBounds = New Rectangle(0, 0, 30, 30) ' حجم الكرة سيكون في حدود هذا المربع

CircleBounds.X = rand.Next(0, Me.ClientSize.Width) ' توليد قيمة عشوائية في حدود عرض الفورم
CircleBounds.Y = rand.Next(0, Me.ClientSize.Height) ' توليد قيمة عشوائية في حدود ارتفاع الفورم

Speed = 3 ' اختيار السرعة ثلاثة ويمكن تغييريها بما يناسبك

dX = (1 - 2 * rand.Next(0, 2)) * Speed ' توليد رقم اما سالب او موجب ثلاثة
dY = (1 - 2 * rand.Next(0, 2)) * Speed ' توليد رقم اما سالب او موجب ثلاثة

tmr.Start() ' تشغيل التايمر المسئول عن الحركة
End Sub

و اخيراً ننتقل الى التايمر الذي يحتوي على كود التحريك بحسب المتغيرين dX و dY ثم التأكد من كوننا لم نتجاوز حدود الفورم تبعنا ... فنقوم اخيرا بالرسم كما في الشكل التالي :

	Private Sub tmr_Tick(…) Handles tmr.Tick

CircleBounds.X += dX ' تحريك الدائرة على المحور س
CircleBounds.Y += dY ' تحريكها على المحور ص

' التأكد من كونها لم تتجاوز حدود الفورم وإلا نقوم بعكس الاتجاهات
If CircleBounds.X > Me.ClientSize.Width - CircleBounds.Width OrElse CircleBounds.X < 0 Then dX = -dX
If CircleBounds.Y > Me.ClientSize.Height - CircleBounds.Height OrElse CircleBounds.Y < 0 Then dY = -dY

' واخيراً رسم الدائرة على الفورم
Using g As Graphics = Me.CreateGraphics
g.Clear(Me.BackColor)
g.FillEllipse(Brushes.Blue, CircleBounds)
g.DrawEllipse(Pens.Black, CircleBounds)
End Using

End Sub

بهذا نكون قد انتهينا من تطوير اول برنامج بسيط بالاسلوب العادي ( بدون إستخدام مفاهيم الـ OOP ) اي بإستخدام البرمجة البنوية التي اعتدنا عليها (مجموعة من السطور البرمجية التي نوزعها في دوال هنا و هناك لتبسيط الكود وتقسيم البرنامج الطويل) .... ويمكن دراسة المثال المرفق والاستفسار عن اي جزء غير مفهوم.

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

rtaWithoutOOP.zip

تم تعديل بواسطه رغيد الطيب
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

و لكنك بالفعل استخدمت عدة مفاهيم في الـOOP

عند إنشاء الفورم فقط قمت بالوراثة من الكلاس Form ثم استخدمت الـevents التي ورثتها منها مثل Load و استخدمت أحد الدوال التي ورثتها Me.CreateGraphics

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي الكريم لا اظنني واياك نريد الخوض بمثل هذا الحديث صحيح في مقام كهذا ؟!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

إذا كنت حقاً تريد أن تنهج الـstructured programming في البرنامج السابق فأول ما تفعله هو أن يكون البرنامج مشروع كونسول. و تنشئ الفورم من هناك. في الـstructured programming يجب أن تبدأ من main subroutine و تبدأ الإنشاء من هناك، بينما في الـOOP تبدأ بإنشاء كلاس يقوم بهذه العملية أو يرث من كلاس يقوم بذلك.

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

ولكنني اردت فقط ان لايتوه المبتدؤن والهواة في حديث بيننا ربما لن يفهمه إلا الخبراء امثالك ولأنني لا اريد تكرار مخاوفي التي ادليت بها بداية الحديث اجبت عليك مختصراً ظناً مني بانك ستفهمني

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

اذا كان كذلك فأننا وبحمد الله جميعا في هذا القسم من المنتدى مبرمجين OOP مخضرمين ولايوجد داعي لطرح مواضيع مثل هذه.

ولكني وجب علي اهمال هذا الجزء لأن الجميع منذ ايام الفيجوال بيسك 6.0 قد اعتاد فتح برنامج جديد وفيه فورم ويستخدم الاحداث و الخصائص التابعة لها ويبدأ بكتابة برنامج عادي خالي من مفهوم الـ OOP وان اردنا وصفه فهو على وجه التحديد عبارة عن Event Driven و Structured .... وهما ما ارمز لهما بالاسلوب العادي الخالي من تصميم فئاتك الخاصة والربط بينهم والورائة و و و .... من مفاهيم الـ OOP

وهذا بالضبط ما سيحصل عندما يفتح نفس الشخص برنامج بالفيجوال بيسك دوت نت فانه سيفتح فورم جديد وسيستخدم الاحداث و الخصائص التابعة لها بنفس اسلوبه في الفيجوال بيسك 6.0 بغض النظر عن كون الامران يختلفان (ضمنيا) ... لكن الامر بالنسبة للمبرج العادي سيان ويمكن لاحقا بعد ان يتعرف كيف يبدأ مع الـ OOP .... ان اخبره انا او انت ان اطار عمل الدوت نت يستخدم الـ OOP دون حتى تدخل المبرمج.... فعندما تعرف متغير من النوع String بإستخدام نفس السطر :

Dim S As String

سيظن المبرمج العادي ان الامر سيان في الفيجوال بيسك 6 او الدوت نت .... غير ان الامر فيه اختلاف كبير بالنسبة للخبراء وذلك كونه في الفيجوال بسيك ليس مجرد نوع بيانات DataType عادي وانما عبارة عن كائن من الفئة String التي تحتوي على خصائص وطرق بداخلها ولهذا يمكن ان نعرف طول النص في الفيجوال بسيك دوت نت بكود مثل :

MsgBox ( S.Length.ToString )

ولكن وهمسا في اذنيك عزيزي اهو الوقت المناسب لمناقشة الموضوع امام هاوي ... نعم ربما سيحقق الفائدة وسيضيف الى معلوماته ولكن سنتشتت كثيرا وعندما ابدأ في طرح البرنامج نفسه بطريقة الـ OOP سيجد نفسه قد نسي اجزاء من هذا البرنامج لمقارنته وبينما يقوم بتذكر هذا الجزء يدرس الكود الجديد سيجد خبيرا آخر غير موافق على البرنامج الجديد لانه يمكن تطويره با اسلوب مختلف (وهذا صحيح يمكن تطويره بعشرات الاساليب المختلفة الصحيحة) ولكن ان يتوه الدارس بين افكاري وافكارك وما اريد ايصاله من هذف بعيد جدا عما نتحدث عنه الان ...... واكاد اتخيل ماذا يمكن ان تقول انت او الاخ محمد او ايا من الخبراء الآخرون عندما يرون البرنامج الاول المحاكي لهذا البرنامج وانما بإستخدام اول مفاهيم الـ OOP ... ستجده بسيط مجرد ومبسط الى ابعد الحدود لايحتوي إلا على فئة واحدة فقط !!! لاترث من مخلوق آخر في الوجود وبينما تتجلى اعين الاحتقار للبرنامج في عيون الخبراء .. ستجد الكثير من الهواه والمبتدئين (قد يكونوا خبراء ولكن بعيدا عن ال OOP ) يتسائلون في رؤوسهم لماذا وضع اربعة خصائص بالتحديد لهذه الفئة ؟..و هاتين الدالتين لماذا؟؟ ... وهل يمكنني التغيير ؟... و ما كنت انا سافكر هكذا !! ... وستتخبط الكثير من الادمغة وهي ترى مدى تعقيد هذه الفئة البسيطة!!!

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

بينما اذا اخذت نظرة سريعة على رد الأخ Muhammad alaa ستجد هناك فرق كبير بين مبرمج ومبرمج ... فهو لم يفتح الفيجوال بيسك وبدأ يكتب سطر هنا وهناك ولكنه بدأ يحلل ماهي الاجزاء التي سيحتاجها وصنف الفئات التي سيقوم بتصميمها وهكذا اريد لقراء المقال ممن يريدون معرفة الجزء اليسير من OOP معي.

و اريد لفت الانتباه للعبارة الرائعة التي بدأ حديثته (الاخ محمد علاء) فيها .... فقد بدأ حديثه بقوله (هذا اسلوب تفكيري) وهي عبارة رائعة

و تتجلى في هذه العبارة جميع مخاوفي

تخيل معي اخي الحبيب هذا البرنامج بمفهوم الـ OOP بروؤس ثلالثة او اربعة خبراء ستجد كلاً في راسه الموضوع بشكل .... والكل له اسلوب احدهم معقد والآخر مبسط (ولايعني التبسيط افضل او التعقيد بل التحليل السليم يؤدي الى التطبيق السليم) ... على العموم لو قرر الاربعة الادلاء بدلوهم هنا لفسد الامر اربعة برامج مختلفة لنفس البرنامج العادي وسيصبح الامر مقارنات بين البرامج وسنعقد على الممبتدئ اكثر من ان نفيده ... الست معي في ذلك ؟

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

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

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

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

تم تعديل بواسطه رغيد الطيب
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

الموضوع جميل جدا واثار نقطه حساسه لدى كثير من المبرمجين

واشكرك اخي رغيد لفتح هذا الملف الشائك لاني ايضا من زمان اريد ان اعرف ماهو الفرق ؟

واذا كان هناك فرق يجعلني انظر والهث فسوف ابدأ بالخوض فيها وتعلمها فورا

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

واتمنى فعلا ان يكون فيه تجاوب ومشاركه ممن يستخدمون هذا الفكر لنخرج بفائده لنا جميعا مادام الغرض واحد وهو انتاج وتطوير البرمجيات

وانا ايضا مع كلام الاخ محمد علاء (هذا اسلوب تفكيري)

لانها ليست لغه مستقله بل هي طرق برمجية بإساليب اخرى غير التى اعتدنا عليها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
لانها ليست لغه مستقله بل هي طرق برمجية بإساليب اخرى غير التى اعتدنا عليها

صدقت اخى مصطفى.

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

انما هي امنية تمنيتها منذ زمن طويل من ايامي الاولى ان اجد امامي برامج كثيرة على شكل ازواج نفس البرامج مرة مع OOP ومرة بدون بحيث استطيع المقارنة بينهم وكيف فكر اصحابها

هذا ما اعتقد انه محور هذا الموضوع بأكمله، فليس الهدف مناقشة الـ OOP او اى اسلوب اخر و لكن الهدف هو توضيح كيفية استخدامها بالشكل الصحيح كما استخدمنا الأساليب الأخرى، فأغلبنا يعلم ماهى الـ OOP و لكن استيعابه لها ضعيف لعدم وجود تطبيقات من النوعين النوع المألوف (كما كانت ايام الـ VB6) و النوع الجديد و هو الـ OOP.

و هذا ما يحاول الأخ رغيد عمله، و هو محاولة جعل فاهمى الـ OOP استيعاب فكرتها و محاولة تطبيقها بشكل سليم عن طريق جعلهم يروا الإسلوب الذى تعودوا عليه و بعدها يقوم بنقل مستواهم خطوه خطوه للأمام.

و الله ولى التوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

الاخ العزيز محمد علاء اشعر بحق انك تفهمني جيدا ... اسأل الله تعالى فتح من عنده.

لم تغادر الحقيقة ابدا ايها النبهاني واتمنى ان نصل جميعا لما وصلت إليه فتصبح بأعيننا سهلة سلسة بإذن الله تعالى.

السلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

بعد ان اطلعنا سوياً على كيفية تصميم دائرة بسيطة تقوم بالارتطام بحدود الفورم وترتد عنها لتواصل طريقها في الارتطام داخل حدود الفورم او المساحة التي نريدها.

سنطلع سويا على كيفية تصميم نفس الشيء بإستخدام ابسط مفاهيم الـ OOP ... ومعناها كيف نفكر بأي برنامج بطريقة كائنية ... اي كل شيء او جزء من برنامجنا على انه كائن مستقل له خصائصه (صفاته) .. طرقه بل و يمكن ان يحتوي على احداثه الخاصة.

ضع دائما في حسبانك !!

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

مهما كان البرنامج ومهما كانت المشكلة فيمكن تقسيمها الى كائنات صغيرة كلا منها يؤدي غرض معين ثم نربط بعدها بينها البين.

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

انظر للمشكلة مبدئيا نظرة ( وااااااسعة ) بغض النظر عن التفاصيل حتى تضع الخطوط العريضة اولياً ثم ابدأ بعدها بتصميم فكرتك و الخوض في التفاصيل خطوة بخطوة.

فكم هي البرنامج التي ما ان تتشعب فيها حتى لا تعد تدري اين انت وما الذي تريد ان تقوم به.

تذكر دائما المصطلح المشهور ( نظرة بعرض كيلومترات وعمق متر واحد !)

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

والآن الى برنامجنا .....

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

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

والجميع على صواب ولكن الاختلاف سيكون في نسبة التصميم الجيد فمثلا كود فلانا من الناس ممتاز والآخر رائع ولكنه غفل كذا وكذا و الثالت اجاد كذا و لم يجد كذا

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

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

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

والان برنامجنا فيه كائن واحد (الكرة) ولتصميمه نقوم بعمل فئة جديدة ولنجعلها بإسم Circle بالشكل التالي :

Class Circle

End Class

بهذا يكون لديك فئة جديدة في برنامجك يمكنك استخدامها بالشكل التالي :

	 Private Ball As Circle

Private Sub Form1_Load(...) Handles MyBase.Load
Ball = New Circle()
End Sub

اعلاه لديك متغير بإسم Ball من النوع Circle ولأن الفئة Circle لا تحتوي على شيء .... فإن المتغير Ball لايعني شيئا .... و الان قلنا اي شيء في البرنامج يمكن تصنيفه على انه كائن يحتوي على صفات معينة ولأن برنامجنا سيحتوي مبدئيا على كائن واحد هو الكرة فلنفكر سويا بما يمكن ان تحتويه هذه الفئة Circle.

خذ مثلا يمكن ان تحتوي على صفات مثل اللون Color و سرعة الحركة Speed و موقعها وحجمها (حدودها) Bounds و ... و .... و.... سأكتفي بهذا حاليا

post-40889-1256985007_thumb.png

والان لتضيف صفات (خصائص) الى اي فئة انت يجب ان تتعلم شيئا اسمه الـ Properties و يمكن الاطلاع على الكثير من الكتب والمقالات والامثلة في المنتدى ولن نناقش هذا هنا .... وما سنقوله ان اضافة الخصائص الثلاثة Color و Speed و Bounds الى الفئة Circle سيكون كالتالي :

Class Circle

Private _Bounds As New Rectangle(0, 0, 30, 30)
Public Property Bounds() As Rectangle
Get
Return _Bounds
End Get
Set(ByVal value As Rectangle)
_Bounds = value
End Set
End Property

Private _Speed As Integer
Public Property Speed() As Integer
Get
Return _Speed
End Get
Set(ByVal value As Integer)
_Speed = value
End Set
End Property

Private _Color As Color = Drawing.Color.Red
Public Property Color() As Color
Get
Return _Color
End Get
Set(ByVal value As Color)
_Color = value
End Set
End Property

End Class

الآن يمكنك عمل اشياء مثل :

Dim x As New Circle()

x.Color = Color.Blue
x.Speed = 10
x.Bounds = New Rectangle(10, 10, 50, 50)

وهنا المتغير x لونه ازرق و سرعته 10 وموقعه بحسب ابعاد المستطيل Rectangle اعلاه

وبإنهاء الخصائص سننتقل الى التفكير بالدوال (الطرق او الوظائف كما يسمونها) التي يمكن ان نضيفها الى الفئة Circle ... مبدئيا :

post-40889-1256985019_thumb.png

والآن صحيح انه لدينا كائن من النوع Circle ولديه بعض الخصائص المفيدة غير اننا نريد ان نراه على الفورم وبالتالي سنحتاج الى اضافه دالة رسم مثلا بحيث نستدعيها عندما نريد عرض الدائرة على اي سطح او في اي مكان ..... ولنقل اننا سنسمي الدالة او الطريقة بإسم Draw بحيث تمرر لها الكائن Graphics الذي تريد الرسم عليه وهي ستقوم بالرشم بحسب صفات الكرة التي تريدها.

Class Circle

Sub Draw(ByVal g As Graphics)
g.FillEllipse(New SolidBrush(_Color), _Bounds)
g.DrawEllipse(Pens.Black, _Bounds)
End Sub

End Class

لاحظ ان الدالة تقوم بإستخدام الخاصيتان Bounds و Color لمعرفة موضع و لون الكرة المراد رسمها

وبالتالي لرسم كرة خضراء على الفورم في الموضع 100,50 بطول وعرض 30 فإننا سنستخدم كود مثل :

Dim ball As New Circle()

ball.Color = Color.Green
ball.Bound = New Rectangle(100,50,30,30)

Dim g As Graphics = Me.CreateGraphics()

ball.Draw(g)

في المثال السابق انشئنا كائن بإسم ball من النوع Circle وعدلنا لونه وموقعه ثم استخرجنا الكائن Graphics التابع للفورم ومررناه للدالة Draw التابعة للمتغير ball بحيث ترسم الدائة عليه.

والان لاحظ باننا لم نضيف مايمكن الاعتماد عليه لتحريك الكرة حتى الان .... ولكي نحرك الكرة سنحتاج لبعض المعلومات الاساسية التي يجب تخزينها مثل

عرض الفروم (او السطح) الذي ينبغي ان تتحرك عليه الكرة Width وكذلك ارتفاعه Height

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

dX وكذلك المحور ص او dY.

بالاضافة الى بعض المتغيرات الداخلية مثل Random و التي سنستخدمها لتوليد ارقام عشوائية كموقع الكرة بحيث يتغير عند كل تشغيل للبرنامج

ولأن هذه ستكون صفات داخلية خاصة بالكائن تبعنا ولاحاجة للوصول اليها من خارج الكائن فسوف نعرفها على شكل Private وليس Properties بالشكل التالي :

Public Class Circle

Private Width, Height As Integer
Private rand As New Random
Private dX, dY As Integer

End Class

لو عدنا بذاكرتنا الى الوراء و الى البرنامج الاول بدون OOP سنجد ان كل شيء يتم تعريفه مبدئيا في الحدث Load التابع للفورم بالشكل التالي :

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

CircleBounds = New Rectangle(0, 0, 30, 30) ' حجم الكرة سيكون في حدود هذا المربع

CircleBounds.X = rand.Next(0, Me.ClientSize.Width) ' توليد قيمة عشوائية في حدود عرض الفورم
CircleBounds.Y = rand.Next(0, Me.ClientSize.Height) ' توليد قيمة عشوائية في حدود ارتفاع الفورم

Speed = 3 ' اختيار السرعة ثلاثة ويمكن تغييريها بما يناسبك

dX = (1 - 2 * rand.Next(0, 2)) * Speed ' توليد رقم اما سالب او موجب ثلاثة
dY = (1 - 2 * rand.Next(0, 2)) * Speed ' توليد رقم اما سالب او موجب ثلاثة

tmr.Start() ' تشغيل التايمر المسئول عن الحركة
End Sub

وسنحتاج ايضا الى عمل المثل مع الفئة Circle في برنامجنا الحالي وبدلا من استخدام الفورم سنضيف الكود الى الدالة New التابعة للفئة Circle بحيث يتم تهيئتها مباشرة :

	Sub New(ByVal FormWidth As Integer, ByVal FormHeight As Integer)
Width = FormWidth
Height = FormHeight

_Bounds.X = rand.Next(0, Width)
_Bounds.Y = rand.Next(0, Height)

Me.Speed = 3

dX = (1 - 2 * rand.Next(0, 2)) * Me.Speed
dY = (1 - 2 * rand.Next(0, 2)) * Me.Speed
End Sub

وبالتالي و حتى الان كود فئتنا العزيزة Circle سيكون كالتالي :

Class Circle
Public Class Circle

Private Width, Height As Integer
Private rand As New Random
Private dX, dY As Integer

Sub New(ByVal FormWidth As Integer, ByVal FormHeight As Integer)
Width = FormWidth
Height = FormHeight

_Bounds.X = rand.Next(0, Width)
_Bounds.Y = rand.Next(0, Height)

Me.Speed = 3

dX = (1 - 2 * rand.Next(0, 2)) * Me.Speed
dY = (1 - 2 * rand.Next(0, 2)) * Me.Speed
End Sub

Private _Bounds As New Rectangle(0, 0, 30, 30)
Public Property Bounds() As Rectangle
Get
Return _Bounds
End Get
Set(ByVal value As Rectangle)
_Bounds = value
End Set
End Property

Private _Speed As Integer
Public Property Speed() As Integer
Get
Return _Speed
End Get
Set(ByVal value As Integer)
_Speed = value
End Set
End Property

Private _Color As Color = Drawing.Color.Red
Public Property Color() As Color
Get
Return _Color
End Get
Set(ByVal value As Color)
_Color = value
End Set
End Property

Sub Draw(ByVal g As Graphics)
g.FillEllipse(New SolidBrush(Me.Color), _Bounds)
g.DrawEllipse(Pens.Black, _Bounds)
End Sub

End Class

واخيرا وليس آخرا .... يمكننا الان بالتفكير بإضافة الطريقة Move الى الفئة بحيث يمكن ان نستدعيها عندما نريد تحريك الرسمة خطوة واحدة بحسب السرعة و بحسب الاتجهات dX و dY

	Sub Move()
_Bounds.X += dX
_Bounds.Y += dY

If _Bounds.X > Width - _Bounds.Width OrElse _Bounds.X < 0 Then dX = -dX
If _Bounds.Y > Height - _Bounds.Height OrElse _Bounds.Y < 0 Then dY = -dY
End Sub

اذا يمكن الان استدعاء هذه الدالة في التايمر التابع للفورم لتحريك الكرة كيفما نشاء.

الكود النهائي للفئة سيكون كالتالي :

Public Class Circle

Private Width, Height As Integer
Private rand As New Random
Private dX, dY As Integer

Sub New(ByVal FormWidth As Integer, ByVal FormHeight As Integer)
Width = FormWidth
Height = FormHeight

_Bounds.X = rand.Next(0, Width)
_Bounds.Y = rand.Next(0, Height)

Me.Speed = 3

dX = (1 - 2 * rand.Next(0, 2)) * Me.Speed
dY = (1 - 2 * rand.Next(0, 2)) * Me.Speed
End Sub

Private _Bounds As New Rectangle(0, 0, 30, 30)
Public Property Bounds() As Rectangle
Get
Return _Bounds
End Get
Set(ByVal value As Rectangle)
_Bounds = value
End Set
End Property

Private _Speed As Integer
Public Property Speed() As Integer
Get
Return _Speed
End Get
Set(ByVal value As Integer)
_Speed = value
End Set
End Property

Private _Color As Color = Drawing.Color.Red
Public Property Color() As Color
Get
Return _Color
End Get
Set(ByVal value As Color)
_Color = value
End Set
End Property

Sub Move()
_Bounds.X += dX
_Bounds.Y += dY

If _Bounds.X > Width - _Bounds.Width OrElse _Bounds.X < 0 Then dX = -dX
If _Bounds.Y > Height - _Bounds.Height OrElse _Bounds.Y < 0 Then dY = -dY
End Sub

Sub Draw(ByVal g As Graphics)
g.FillEllipse(New SolidBrush(Me.Color), _Bounds)
g.DrawEllipse(Pens.Black, _Bounds)
End Sub

End Class

واما في الفورم فسيكون الكود مشابه للتالي :

	Private Ball As Circle

Private Sub Form1_Load(...) Handles MyBase.Load

Ball = New Circle(Me.ClientSize.Width, Me.ClientSize.Height)

tmr.Start()
End Sub

Private Sub tmr_Tick(...) Handles tmr.Tick

Ball.Move()

Using g As Graphics = Me.CreateGraphics
g.Clear(Me.BackColor)
Ball.Draw(g)
End Using

End Sub

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

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

تحياتي

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

rtaWithOOP.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أشكرك أستاذى العزيز رغيد على هذا الموضوع القيم وأسأل الله أن يزيدك علما وأن ينفعنا بعلمك

رأيى الشخصى

لا أعتقد أن هناك مبرمج لم يستخدمها أو على الأقل لم يستخدم أحد مبادئها

بالمناسبة صوت بـ "أستخدمها فى جميع برامجى"

ياترى هل سأغير رأيى بعد أن تكمل الموضوع؟ :blush:

تم تثبيت الموضوع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

المثال السابق رائع جدا وممتع لتوصيل مفهوم oop ولكن إلى الآن غير مقتنع باستخدامه ، ليس هذا يعني أني لا أستخدم oop نهائيا كما فهم البعض، فأنا أستخدمه رغم أنفي في البيئة ( الحللللللللوة ) VB.NET ، كإستدعاء الفآت الجاهزة ، وأنا أعتبر هذه نقلة جبارة من VB6 ، فبيئة الدوت نت سهلة جدا فعلى سبيل المثال الـ ADO.NET جعلت التعامل مع البيانات مرن جدا بمخاطر أقل ، أنا دائما أحب الجاهز ولا أحب أن أفصل بنفسي، وجزاك الله خيرا.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

اما مبرمجنا المبدع ... من يدري ياعزيزي قد تخابطنا الأقدار فتحتاج للتفصيل يوما ما !! ..... ربما من يدري !!!

السلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

بالنظر في البرنامجيين الاوليين rtaWithoutOOP1 و rtaWithOOP1 .... لاحظ من التسمية بأن البرنامج بدون Without استخدام مفاهيم الـ OOP والآخر ... بإستخدام With مفاهيم الـ OOP.

ستجد اول الملاحظات السريعة هي طول وتعقيد الكود في مثال الـ OOP ... فمثلا في البرنامج بدون OOP فأن الكود في الفورم الرئيسية لايعدو الأربعون سطر برمجي تقريباً ... فهو بالكامل كالتالي :

Public Class Form1

Private CircleBounds As Rectangle 'لتخزين احداثيات الكرة
Private rand As New Random ' لتوليد ارقام عشوائية لاحقا
Private dX, dY As Integer ' لتخزين اتجاهات الحركة الحالية
Private Speed As Integer ' متغير لخزن سرعة الحركة

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

CircleBounds = New Rectangle(0, 0, 30, 30) ' حجم الكرة سيكون في حدود هذا المربع

CircleBounds.X = rand.Next(0, Me.ClientSize.Width) ' توليد قيمة عشوائية في حدود عرض الفورم
CircleBounds.Y = rand.Next(0, Me.ClientSize.Height) ' توليد قيمة عشوائية في حدود ارتفاع الفورم

Speed = 3 ' اختيار السرعة ثلاثة ويمكن تغييريها بما يناسبك

dX = (1 - 2 * rand.Next(0, 2)) * Speed ' توليد رقم اما سالب او موجب ثلاثة
dY = (1 - 2 * rand.Next(0, 2)) * Speed ' توليد رقم اما سالب او موجب ثلاثة

tmr.Start() ' تشغيل التايمر المسئول عن الحركة
End Sub

Private Sub tmr_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr.Tick

CircleBounds.X += dX ' تحريك الدائرة على المحور س
CircleBounds.Y += dY ' تحريكها على المحور ص

' التأكد من كونها لم تتجاوز حدود الفورم وإلا نقوم بعكس الاتجاهات
If CircleBounds.X > Me.ClientSize.Width - CircleBounds.Width OrElse CircleBounds.X < 0 Then dX = -dX
If CircleBounds.Y > Me.ClientSize.Height - CircleBounds.Height OrElse CircleBounds.Y < 0 Then dY = -dY

' واخيراً رسم الدائرة على الفورم
Using g As Graphics = Me.CreateGraphics
g.Clear(Me.BackColor)
g.FillEllipse(Brushes.Blue, CircleBounds)
g.DrawEllipse(Pens.Black, CircleBounds)
End Using

End Sub

End Class

بينما نجد في مثال الـ OOP انه انقسم الى قسمين قسم معرف في كود الفورم الرئيسية ( في حدود الـعشرون سطر برمجي) .... كالتالي :

Public Class Form1

Private Ball As Circle

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

Ball = New Circle(Me.ClientSize.Width, Me.ClientSize.Height)

tmr.Start()
End Sub

Private Sub tmr_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr.Tick

Ball.Move()

Using g As Graphics = Me.CreateGraphics
g.Clear(Me.BackColor)
Ball.Draw(g)
End Using

End Sub

End Class

والقسم الآخر يكمن في كود الفئة Circle التي اضفناها في برنامج الـ OOP الأول :

Public Class Circle

Private Width, Height As Integer
Private rand As New Random
Private dX, dY As Integer

Sub New(ByVal FormWidth As Integer, ByVal FormHeight As Integer)
Width = FormWidth
Height = FormHeight

_Bounds.X = rand.Next(0, Width)
_Bounds.Y = rand.Next(0, Height)

Me.Speed = 3

dX = (1 - 2 * rand.Next(0, 2)) * Me.Speed
dY = (1 - 2 * rand.Next(0, 2)) * Me.Speed
End Sub

Private _Bounds As New Rectangle(0, 0, 30, 30)
Public Property Bounds() As Rectangle
Get
Return _Bounds
End Get
Set(ByVal value As Rectangle)
_Bounds = value
End Set
End Property

Private _Speed As Integer
Public Property Speed() As Integer
Get
Return _Speed
End Get
Set(ByVal value As Integer)
_Speed = value
End Set
End Property

Private _Color As Color = Drawing.Color.Red
Public Property Color() As Color
Get
Return _Color
End Get
Set(ByVal value As Color)
_Color = value
End Set
End Property

Sub Move()

_Bounds.X += dX
_Bounds.Y += dY

If _Bounds.X > Width - _Bounds.Width OrElse _Bounds.X < 0 Then dX = -dX
If _Bounds.Y > Height - _Bounds.Height OrElse _Bounds.Y < 0 Then dY = -dY

End Sub

Sub Draw(ByVal g As Graphics)
g.FillEllipse(New SolidBrush(Me.Color), _Bounds)
g.DrawEllipse(Pens.Black, _Bounds)
End Sub

End Class

وهو كود بطول الستين سطر برمجي تقريباً اي بإجمالي تقريبي مقداره ثمانون سطر برمجي في برنامج الـ OOP و اربعون بدونه ... إضافة الى تقسيم الكود في مكانان منفصلان (الفورم و الفئة Circle) بينما في مثال البرمجة العادية (كود قصير واضح في مكان واحد!).

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

وجب التنويه الى هذه الملاحظة مبدئياً قبل الانتقال الى الخطوة التالية ... وهي فرض كوننا نريد تعديل البرنامجين لكي يحتويا على عشر كرات تسير في نفس الوقت .

-------------------------------------------------------- برنامج العشر كرات بدون OOP ---------------------------------------------------------------

في الحالة السابقة (حالة الكرة الواحدة) احتجنا الى تعريف بعض المتغيرات في الفورم لحفظ احداثيات و معلومات حركة كرتنا الوحيدة ... متغيرات مثل : CircleBounds , dx , dy و Speed ... لجعل الأمر نفسه يعمل لأكثر من كرة فسنحتاج الى تغيير هذه المتغيرات الى مصفوفات فمثلا :

Dim Speed As Integer

Speed = 3

يمكن تغييره الى

Dim Speed(9) As Integer

Speed(0) = 3
Speed(1) = 2
Speed(2) = 5
.
.
.

في الكود السابق غيرنا تعريف المتغير Speed من متغير عددي واحد الى مصفوفة بعشرة عناصر(من 0 الى 9) وعليه فيمكن ان نحفظ الان في هذه المصفوفة عشر سرعات مختلفة لعشر كرات مختلفة ... كما في المثال السابق فالكرة الاولى سرعتها 3 و الثانية 2 .... وهكذا ...

وبذا يمكن تعديل البرنامج ليصبح بالكود

Public Class Form1

Private CircleBounds(9) As Rectangle 'لتخزين احداثيات الكرة
Private rand As New Random ' لتوليد ارقام عشوائية لاحقا
Private dX(9) As Integer
Private dY(9) As Integer
Private Speed(9) As Integer

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

For I As Integer = 0 To 9
CircleBounds(I) = New Rectangle(0, 0, 30, 30) ' حجم الكرة سيكون في حدود هذا المربع

CircleBounds(I).X = rand.Next(0, Me.ClientSize.Width) ' توليد قيمة عشوائية في حدود عرض الفورم
CircleBounds(I).Y = rand.Next(0, Me.ClientSize.Height) ' توليد قيمة عشوائية في حدود ارتفاع الفورم

Speed(I) = 3 ' اختيار السرعة ثلاثة ويمكن تغييريها بما يناسبك

dX(I) = (1 - 2 * rand.Next(0, 2)) * Speed(I) ' توليد رقم اما سالب او موجب ثلاثة
dY(I) = (1 - 2 * rand.Next(0, 2)) * Speed(I) ' توليد رقم اما سالب او موجب ثلاثة
Next

tmr.Start() ' تشغيل التايمر المسئول عن الحركة
End Sub

Private Sub tmr_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr.Tick

Using g As Graphics = Me.CreateGraphics

g.Clear(Me.BackColor)

For I As Integer = 0 To 9

CircleBounds(I).X += dX(I) ' تحريك الدائرة على المحور س
CircleBounds(I).Y += dY(I) ' تحريكها على المحور ص

' التأكد من كونها لم تتجاوز حدود الفورم وإلا نقوم بعكس الاتجاهات
If CircleBounds(I).X > Me.ClientSize.Width - CircleBounds(I).Width OrElse CircleBounds(I).X < 0 Then dX(I) = -dX(I)
If CircleBounds(I).Y > Me.ClientSize.Height - CircleBounds(I).Height OrElse CircleBounds(I).Y < 0 Then dY(I) = -dY(I)

g.FillEllipse(Brushes.Blue, CircleBounds(I))
g.DrawEllipse(Pens.Black, CircleBounds(I))

Next

End Using

End Sub
End Class

اذا امعنت النظر في الكود السابق فأن التعديلات الطفيفة في الكود قد اضافت الى البرنامج الاصلي 10 سطور برمجية ليصبح طول البرنامج مايقارب الـ 50 سطر برمجي.

يمكن الاطلاع على الكود المرفق.

-------------------------------------------------------- برنامج العشر كرات مع OOP ---------------------------------------------------------------

لتعديل برنامجنا الأول (برنامج الكرة واحدة بإستخدام الـ OOP) فإننا لن نحتاج الى المساس بالفئة Circle كون الكرات العشر على اختلافها جميعها من نفس الصنف وتحمل نفس الخصائص Properties و الطرق Methods و لكنها تختلف في قيم هذه الخصائص فلكل كرة موقعها ولونها .... وخلافه ....

وما سيلزمنا هو نفس التعديل الذي قمنا فيه في (برنامج العشر كرات بدون OOP) وهو استخدام المصفوفات لخزن عشر كرات بدلا من كرة واحدة ... بكلام آخر :

Dim Balls(9) As Cricle

كما يمكن ان نسخدم List Of للتسهيل وهي ايضا يمكن اعتبارها مصفوفة من عنصر معين (وهو الفئة Circle) في برنامجنا :

Dim Balls As List(Of Circle)

وعليه فيمكن ان يحتوي المتغير Balls على اي عدد من الكرات بإستخدام الامر Add لإضافة كرة جديدة

على العموم سواءً استخدمت المصفوفة العادية او المجموعات List Of فالناتج واحد ... والجزء الذي سيتم تغييره هو الكود الموجود في الفورم الرئيسية ... ليصبح بشكل مشابه للتالي :

Public Class Form1

Private Balls As New List(Of Circle)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Ball As Circle

For I As Integer = 1 To 10
Ball = New Circle(Me.ClientSize.Width, Me.ClientSize.Height)
Balls.Add(Ball)
Next

tmr.Start()
End Sub

Private Sub tmr_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr.Tick

Using g As Graphics = Me.CreateGraphics

g.Clear(Me.BackColor)

For Each Ball As Circle In Balls
Ball.Move()
Ball.Draw(g)
Next

End Using

End Sub
End Class

وعليه فإن تعديل ... البرنامج من كرة واحدة الى متعدد كرات بإستخدام الـ OOP .... ايضا كلفنا اضافة ما يقارب العشرة اسطر برمجية ليصبح البرنامج كاملا بمجموع التسعون سطر برمجي.

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

ارجو الاطلاع على البرامج المرفقة للتحليل rtaWithoutOOP2 و rtaWithOOP2 ... و سوف احاول بسرعة الانتقال الى الجزء التالي في تغييرات كلا البرنامجين ... ربما نناقشه في الغد بإذن الله تعالى.

ملاحظة مهمة آخيرة :

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

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

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

تحياتي

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

rtaWithoutOOP2.zip

rtaWithOOP2.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .