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

البرمجة بمنهجية الأصناف والأشياء OOP

بدأه عبد الرحمن أحمد في 6 فبراير 2013 · 24 رد · 6,463 مشاهدة · في المقالات العلمية و التقنية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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


البرمجة بمنهجية الأصناف والأشياء OOP
Object-Oriented Programming

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

 

كلمة Object يقابلها بالعربي كائن أو شيء والشيء هو كل ما يمكن إدراكه أو تصوره سواء من خلال الحواس الخمس أو تخيله في الذهن

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

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

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

دعنا نضرب مثال آخر للتوضيح
قررت البلدية وضع شروط معينة لأي بناء سيتم بناؤه في المنطقة المسؤولة عنها
فوضعت المواصفات التالي :
1 - عدد الطوابق الأعظمي 5
2 - المساحة الأعظمية 500 متر مربع
3 - وجود مساحة لا تقل عن 10 بالمئة مخصصة لصف السيارات
4 - وجود مصعد واحد على الأقل

نلاحظ أن هذه المواصفات ليس لها وجود وإنما هي مجرد وصف وهذا مانطلق عليه الصنف Class

وعلى فرض أن أحدهم أراد بناء مبنى موافق لهذه المواصفات
فيقوم بشراء مساحة أرض ولتكن 400 متر مربع
وقام ببناء 4 طوابق فقط
وجعل فيها مصعدان
وخصص 12% مساحة لمواقف السيارات

ثم أتم البناء
الآن يمكن القول أن هذا المبنى هو كائن تم إنشاؤه وفق صنف المبنى المعتمد من قبل البلدية

فالصنف وصف لمواصفات الكائنات التي يمكن إنشاؤها منه
أما الكائنات فهي أشياء حقيقية تم إنشاؤها وفق بنية الصنف وأخذت كل خاصية قيمة محددة

لهذا الصنف واحد والكائنات تتعدد وتختلف باختلاف القيم التي تحويها

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

فالإنسان كما ذكرنا صنف له خصائص مثل الطول والاسم ولون العينان

ففلان من الناس اسمه سعيد وطوله 180 سم و لون عينdه بنية

كل هذه المقدمة حتى نستوعب الفرق بين الصنف والشيء أو الكائن أي بين Class  و Object

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

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

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

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

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

يتبع ...
إن شاء الله

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 7 فبراير 2013 في 01:48

5

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#2

2

 

 

بعد أن استعرضنا مبدأ البرمجة بمنطق الكائنات

دعونا نوضح أكثر

نحن نعلم أن المتحول أو المتغير المستخدم أثناء البرمجة يمتلك نوع معطيات منها ما هو قياسي ومعرف من قبل اللغة كالنوع النصي string  أو الرقمي بأنواع الصحيح integer أو الكسري float  أو البولياني (المنطقي) boolean وسواء المشتقة منها كالنوع عشري decimal

أو العملة currency

في الحقيقة الأنواع السابقة تأخذ قيم محددة أي النوع الرمزي يحوي المتغير قيمة سلسلة رمزية معينة والنوع الرقمي الصحيح يأخذ رقم صحيح والكسري يأخذ رقم بفاصلة عائمة

والبولياني يأخذ إحدى قيمتين إما true  أو false

 

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

بحيث تكون قيمة المتغير في لحظة ما أثناء زمن التنفيذ تحوي قيمة محددة وهي عبارة عن كائن أو شيء تم إنشاؤه من ذاك الصنف

وبوجود الكائن فعلا أصبح بالإمكان الوصول إلى كل ما يحوي بما يسمحه لنا من رؤيته

 

لتوضيح هذه الفلسفة لنضرب مثالا من واقع حياتنا

 

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

فكل الساعات تحمل نفس الخصائص ولكن كل ساعة تكون بخصائص مختلفة عن الأخرى

فمثلا الساعة التي اشتريتها أنت من النوع العادي وليس الرقمي ولونها أبيض ووزنها 300 جرام

و لها جرسان وهكذا

نلاحظ أن هذه الساعة بعينها هي كائن من الصنف ساعات ولكن تحوي أشياء منها ما هو متاح الوصول إليه ومنها ما هو مخفي

فمثلا بإمكانك مشاهدة عقارب الساعة وبإمكانك تدوير العقارب لضبط الوقت

وبإمكانك تشغيل أو إيقاف المنبه

ولكن لا تستطيع رؤية المسننات الداخلية وهي تدور ولا تستطيع معرفة عدد تلك المسننات

فهذه خصائص ووظائف تم إخفاؤها عنك لأنها لا تعنيك أنت وإنما هي ضرورية لضمان نجاح الهدف من ذاك الشيء

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

 

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

 

من هنا يمكن توضيح أن الأصناف جاءت لتحوي وتغلف كل من :

- الخصائص Properties والتي هي المتغيرات التي ستحوي القيم أي المعطيات

- المناهج Methods وهي التي تعبر عن الإجراءات أو الوظائف Functions  سابقا

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

 

إذا لكل صنف خصائصه و مناهجه و أحداثه سواء الظاهر للخارج أو الداخلي المخفي عن الخارج

 

في الحقيقة إن هذا بحد ذاته أمر هام جدا

ففرق أن تذهب إلى مطعم ويقال لك المطبخ والأدوات والمواد أمامك اطبخ ما شئت

وبين أن تذهب إلى مطعم فقط تختار طلبك من القائمة لتأتيك جاهزة وتوضع أمامك لتأكل فقط

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

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

 

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

 

يتبع ...

إن شاء الله

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 7 فبراير 2013 في 02:25

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#3

3

 

مرة أخرى حتى نرسخ مفهوم التغليف Encapsulation

لعل الكثير تعامل مع نوع المعطيات الخاص بالوقت والتاريخ DateTime النوع المستخدم في الدوت نت وما يقابله في اللغات الأخرى

المبرمج لا يعلم من هذا النوع عندما ينشيء متحول منه إلا أن يستخدم خصائصه ومناهجه

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

إن كل هذا يجري داخل الصنف دون أن تدري ولا ترى إلا مايهمك وهو النتائج

ألق نظرة على داخل هذا الصنف

 

DateTime.rar

 

إن مجرد النظر إلا هذا الكود سيصيبك بالدوار فهل اقتنعت أن التغليف جاء لصالحك

أنت تذهب لمحل غسيل وكي الملابس تعطيه ملابسك فقط

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

 

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

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

 

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

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

فمؤسسة الكهرباء معطياتها كابلات كهربائية ومفاتيح ومحولات والوحدات التي تتعامل معها فولط وأمبير وواط

أما وظائفها فهي تركيب محولات وتمديد كابلات جوية أو أرضية و تشييد محطات توليد

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

 

و أما مؤسسة المياه

فمعطياتها أنابيب ماء وصمامات و مضخات و الوحدات التي تستخدمها لتر وغالون وإنش

وأما وظائفها فهي تمديد الأنابيب وشبكات المياه وتشييد خزانات الماء وحفر الأبار

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

 

 

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

لم نسمع عن عائلة لها ولدان بنفس الاسم تماما

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

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

فمثلا ريفيرس داخل سلسلة نصية تعكس النص أما داخل لائحة أسماء تعكس ترتيب الأسماء وليس عكس كل اسم على حدا

 

وهذا ما يدعى تعدد الأشكال Polymorphism

وهنا المقصود تعدد شكل العمل الداخلي للمناهج مع تشابه تسمياتها

والذي يحدد طبيعة هذا الشكل هو مهمة هذا المنهج بما يناسب طبيعة الصنف أو الفئة التي تتبع له

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

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

 

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

 

يتبع ...

إن شاء الله

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 7 فبراير 2013 في 13:46

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#4

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

هل البرمجة OOP هي برمجة لابد منها , يعني هل هناك أمور لا تصلح إلا بهذا النوع من البرمجة , واذا كان بالامكان ,

هل يوجد مثال لبرمجة غير OOP ونفس المثال مشغول بطريقة OOP , وشكرا

I Have A Dream ...

#5
Fuad Ahmad كتب:

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

هل البرمجة OOP هي برمجة لابد منها , يعني هل هناك أمور لا تصلح إلا بهذا النوع من البرمجة , واذا كان بالامكان ,

هل يوجد مثال لبرمجة غير OOP ونفس المثال مشغول بطريقة OOP , وشكرا

 

حياك الله أخي

 

البرمجة OOP  تسخدم من باب أنها أثبتت جدارتها وأنها الأصلح ولهذا بنيت عليها معظم لغات البرمجة

لأنه كما قلت هي طريقة تنظيمية دعت إليها الحاجة وليس بطرا

برامج مثل برامج التصميم التابعة لأدوبي أو لأتو ديسك لو أنها ستبنى بالبرمجة الإجرائية فأكاد أجزم أنه إلى الأن حتى يصلوا الاصدار الأول أو الثاني بينما بمنهج البرمجة الكائنية وصلنا إلى اصدارات 14 و 15

 

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

 

لاحظ أن لغة الـ VB6  هي لغة إجرائية مع أنها مبنية وفق الـ OOP

ثم تم دعم الـ OOP  في الاصدار التالي وهو VB.Net

 

الذي يطلب عمل برنامج بمنهج غير الـ OOP  كمن يطلب بجهل كل مؤسسات الدولة في مؤسسة واحدة ومكان واحد والغرف مفتوحة على بعضها البعض

 

لقد ظهرت طريقة جديدة وهي AOP

Aspect-Oriented Programming

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

وهي لازالت جديدة ولم تأخذ شعبية بعد

ولن أتحدث عنها لأني لم أتعمق بها بعد وحتى لا أخلط الأمور

 

وأظن أنها ليست منطق بديل للـ OOP  وإنما هي نمط مختلف له استخداماته وقد لاحظت أن بعض مجال استخدامه يتعلق بالسكيوريتي والسماحيات وتخويل الدخول وغيره

لمن أراد الاطلاع عليها يوج الرابط التالي :

http://en.wikipedia.org/wiki/Aspect-oriented_programming

 

http://www.codeproject.com/Articles/140042/Aspect-Examples-INotifyPropertyChanged-via-Aspects

 

بالنسبة للمثال فقد قدم الأخ Mr.B جزاه الله خيرا مثالا في رده على السؤال التالي :

/index.php/topic/275215-%D9%85%D8%A7-%D9%87%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87%D8%9F/

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 7 فبراير 2013 في 15:18

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#6

إن شاء الله ويسر

سأقوم بعد الانتهاء من تغطية جوانب هذه التقنية OOP من الناحية النظرية

بتطبيق عملي لها

ولا أقصد عملي أن نقوم بكتابة برنامج متكامل

وإنما كيف نستقبل مسألة ما نريد تحويلها إلى برنامج

وكيف نحللها لنقوم بتنفيذها وفق منطق البرمجة الغرضية

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

وأنا على ثقة أن من يكتشف سحر هذه المنهجية ممن يعمل على لغات قديمة وخصوصا VB6 سيفكر جديا بالانتقال إلى لغات متقدمة ومنها VB.Net  أو C#.Net

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 7 فبراير 2013 في 15:11

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#7

السلام عليكم، 

 

جزاك الله خيرا شرح جميل :)

 

لي بعض التعليقات

1- نوع ال class based  (المستخدم في لغات مثل ال C# و Java) ليس هو النوع الوحيد ولكن هناك كذلك ال Prototype based (مثل في Javascript و Io)

 

اقتباس

 


 

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

لم نسمع عن عائلة لها ولدان بنفس الاسم تماما

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

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

فمثلا ريفيرس داخل سلسلة نصية تعكس النص أما داخل لائحة أسماء تعكس ترتيب الأسماء وليس عكس كل اسم على حدا

 

 

يبدو أنك تتحدث عن التجريد لا التغليف.

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

 

اقتباس

 


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

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

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

هذا غير دقيق، يوجد طرق أخرى والأفضلية لأي منها هي مجرد مسألة ذوق خاص بالمبرمج.. فنقطة تنسيق أسماء المتغيرات والإجراءات هذه تابعة لل coding style لا لل OOP وكثير من اللغات تقدم Modules او Units فتصبح قادرا على إستدعاء كل جزء بالإسم حسب ال Module (وهذا يقضي على فكرة running out of names)

 

كذلك البعض يرى أن ال OOP ليست إلا دراما زائدة

 

*مع بعض التقدم والدراسة سيجد القارئ أن ال class هو object بالنهاية  :d

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#8

بارك الله بك أخي أحمد على المداخلة وأشكر لك بعض التصويبات وكما يقال لولا الاختلاف لما عرف الصواب

 

فيما يخص القول بأنها دراما زائدة لما إذا أصبحت تشكل صلب بناء اللغات المتقدمة

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

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

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

 

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

 

مرة أخرى أشكر لك مداخلتك وأنا تشجعت للخوض فيه لأني تفاجأت من خلال تعرفي على بعض المبرمجين المحترفين الذين التقيت بهم أنهم لم يسمعوا بها :mellow:

 

كما قلت الأمر يعود للمبرمج فمن شاء استخدم OOP و من شاء استخدم أسمبلي :)

 

ودمت بخير

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#9
اقتباس

 


فيما يخص القول بأنها دراما زائدة لما إذا أصبحت تشكل صلب بناء اللغات المتقدمة

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

أنا لاأحب أن أكون في موضع إتجاه في مقابل إتجاه.. لكن ماهو معنى كلمة "لغة متقدمة" ؟ فمثلا أنا أرى أن لغة F# في ال .net هي من يستحق الإهتمام :)

 

هنا موضع الإلتباس:  اللغة المتقدمة لاتعني انها يجب أن تدعم ال OOP بحال (فقط لأن الأمر شائع جدا :) )

 

 

 

اقتباس

 


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

 
ال class هو (دائما) object  -بينهم علاقة دائرية- :)
 
تحياتي
2
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#10

أكرمك الله أخي أحمد

لدي اقتراح

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

ويتم فتح موضوع آخر يكون للنقاش حول الطرق والمفاهيم المختلفة للبرمجة

ليتم إبداء الأراء فيه لما كل واحد يفضل اتجاه معين

كمثال أنت ذكرته أن لغة F#  تستحق الاهتمام لمناقشة الأسباب التي لم تجعل لها شعبية مثلا

 

وجزاك الله كل خير

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#11

4

لا يكاد أحد يقرأ عن البرمجة غرضية التوجه إلا ويسمع عن صفة الوراثة Inheritance

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

فالصنف الذي يرث من صنف آخر هو يعيد استخدامه بشكل أو بآخر

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

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

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

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

ليس من الخطأ أن نقوم شركات برمجية ضخمة مثل مايكروسوفت أو أبل أو صن من تضمين برامجها وأنظمتها برامج من شركات أصغر منها

ولا شك أنها ليست بعاجزة عن إنتاج شبيه بتلك البرامج وربما أكفأ

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

أقول لك نعم وهذا مكمن الشاهد

هو الاستفادة مما هو موجود وموثوق بدل من البدء من الصفر

 

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

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

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

وهنا تأتي فائدة الوراثة أو إعادة الاستخدام كما قدمت

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

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

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

ويعتمد صيغة ذلك على لغة البرمجة

وننوه هنا أن اللغة تؤمن حل الاعتراضات التي قد تواجهك كأن تريد تضمين منهج موجود في الصنف الأساس وهذا ما يسمى بالتخطي أو التجاوز Method Overriding

أي إعادة صياغة منهج موجود بنفس الاسم ضمن الصنف الأساس

 

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

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

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

فلما نكررها في كل أصناف العناصر طالما نستطيع جعلها في صنف أساس ونجعل الجميع يرث أو يعيد استخدام هذا العنصر

لعل من الأمثلة الشائعة التي تضرب لتوضيح خاصية الوراثة

هي أنه بالإمكان بناء صنف يعبر عن شخص ما بحيث يكون له اسم أول واسم آخر (أي اسم العائلة) و النوع والعمر ورقم تعريفي

ثم هذا الصنف الذي نطلق عليه اسم Person  نجعله أساس لإعادة استخدامه في أصناف أخرى أكثر تخصصا

مثل طالب و موظف و مسؤول

فالكل أشخاص لأن كل واحد من هؤولاء هو شخص له اسم واسم عائلة ونوع وعمر ورقم تعريفي

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

بينما الموظف لا يملك مثل هذه الخصائص وإنما له خصائص أخرى مثل الوظيفة والموقع الوظيفي والقسم الذي يتبع له أو المؤسسة التي يعمل بها .

 

يتبع ...

إن شاء الله

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 8 فبراير 2013 في 03:37

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#12

5

اسمحوا لي فأنا مضطر للعودة لمفهوم  التغليف لأن هناك مسألة كنت مؤخرها لحين الانتهاء من المفاهيم الأساسية لأننا سنتعمق داخل الصنف

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

فقط الكائن Object   المُنشأ منه هو الذي سيحوي قيم في لحظة ما وهنا لم يعد مجردا وإنما محددا بدقة

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

بمعنى لو قام الفنان بعمل بعض "الشخابيط" التي توحي في ظاهرها أنها تشبه الطائر فهو يريد أن يصل إلى ذهن المشاهد أن هذا يعبر عن طائر ما بدون تعيين

ولا حتى نوع ذاك الطائر إنما طائر فحسب.

فمثلا عندما قلنا أننا سنعرف صنف Class  يعبر عن شخص تم ذكر أن من مكونات هذا الصنف خاصية تعبر عن الاسم الأول واسم الشهرة والنوع والعمر

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

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

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

 

عودة إلى التغليف

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

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

قد يقع بالخطأ قطعة معدنية داخل أجزاء الطابعة مما تؤدي إلى عطبها في حال كانت تعمل

قد يقوم أحد الأطفال بتقطيع الأسلاك الداخلية

من هنا نرى أهمية التغليف وهي تغليف كل ما داخل الصنف وإبراز ما يهم المستخدم

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

إن البرمجة كائنية المنحى جاءت لجعل المعطيات والوظائف في قالب واحد

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

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

والوظائف كما ذكرناها قبل قليل

لكن طبيعة البرمجة الكائنية أدت إلى إيجاد شكل خاص من المعطيات و هي الخصائص

والخاصية هي متغير ولكن بسلوك معين

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

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

بدلا من وضعه في غرفة محكمة الإغلاق لا يفتحها إلا من هو مخول

 

لهذا وحتى نتخلص من هذه السلبية تم إنشاء متغيرات أطلق عليها اسم الخصائص Properties

 وهي تعمل نغس عمل المتغيرات Variables ولكن بمنطق مختلف  

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

فقد تم تضمين الخاصية وظيفتين ضمنيتين يعبر عنهما من خلال كلمات محجوزة مثل get  و set

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

وهو يتم استدعاؤه تلقائيا عند إسناد أي قيمة للخاصية ويتم تمريرها من خلال الكلمة المحجوزة value  (وهنا أستخدم مصطلطلحات لغة C#   والتي تكون متشابهة أو قريبة من اللغات الأخرى )

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

فمثلا في خاصية العمر لصنف الشخص

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

من هنا ومن خلال بواب الخاصية يقوم بعملية فحص لصلاحية المعطى قبل قبوله وتخزينه في المتغير الداخلي الخاص المسؤول عن تخزين قيمة خاصية العمر

فإن وجده موجبا و ضمن حدود مقبول قبله ووضع قيمة value  في المتغير الخلفي

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

تخيل أنه أدخل قيمة 500 فهل يعقل أن يكون إنسان في عصرنا له عمر 500 إلا إذا كان يستخدم الصنف للحديث عن أنبياء مثل سيدنا نوح عليه السلام فهذا أمر آخر

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

ومن ثم لا يغير شيء في القيمة الحالية للمتغير الخلفي

من هنا نرى أننا حمينا المتغيرات الداخلية من القيم الخاطئة

من الممكن أن تبرمج القسم set  ليقوم بتصحيح تلقائي بدلا من اصدار خطأ

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

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

 

أما الوظيفة get  فهي المسؤولة عن إخراج قيم المعطيات من داخل الصنف إلى خارجة

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

فهي يتم استدعاؤها عندما يتم القراءة من الخاصية أي عندما تكون الخاصية في الطرف الأيمن من المساواة كأن تريد قراءة عمر شخص لوضعه في خانة أو إظهاره في نافذة

 

إن عملية الإخراج بهذه الطريقة تعطي فوائد جمة

افرض أن لصنف الشخص خاصية تعبر عن تاريخ الميلاد

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

نحن قلنا أنك عندما تقرأ الخاصية سيتم استدعاء المنهج الخاص get  التابع لتلك الخاصية

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

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

قس عليه الكثير مثل خاصية الطول للمستقيم وخاصية المساحة للمستطيل والدائرة

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

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

فمثلا إن تم جعل private set فحينها سيمنع المستخدم من إدخال قيم وإنما فقط القراءة

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

 

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

قد يقول قائل وهل أنا مضطر لأن أجعل كل متغير بكل هذا التعقيد إذا كان استخدامي له بسيطا

أقول لك لقد أوجدت اللغة حلا وسيطا

بأن جعلت هناك نوعا خاصا من الخصائص هو ذاته الذي تحدثنا عنه ولكنه مختزل

وصيغته مثلا

 

 public int Age { get; set; }

 

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

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

كمثال

public int Age { get; private set; }

 

يتبع ...

إن شاء الله

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 10 فبراير 2013 في 14:54

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#13

الله يعطيك العافيه

 

استفدت كثيراً بارك الله فيك

 

استمر فـ انا متشوق لمزيد من الامثله

#14

وإياكم أخي الكريم

 

سرني أنك من المستفيدين

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#15

6

تحدثنا عن أولى مكونات الأصناف وهي الخصائص

وأما المكون الثاني فهو المناهج وهي الوظائف Functions  الاعتيادية التي نعرفها

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

وما كان عام منها فيمكن استدعاؤه من خارج الصنف وما كان خاص فيستدعى داخليا فقط

 

أما المكون الثالث فهو الأحداث Events

إن الأحداث وجدت لمهمات إشعارية وإخطارية وتنبيهية

كيف ذالك ؟ لنضرب المثال التالي حتى يكون الأمر أقرب للفهم

لنتخيل وجود شركة لها مجلس إدارة و مدراء ورؤساء أقسام وغيرهم

ولنفترض أن هناك طرد هام متوقع وصوله إلى الشركة

وبعد وصول الطرد يتوجب إقامة اجتماع عاجل يضم بعض من أعضاء المجلس ومدير الإنتاج و رئيس قسم الجودة

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

تخيلوا كم سيكون الأمر متعبا

ولنتخيل سيناريو آخر أفضل من هذا

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

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

 

إن هذا السيناريو تماما هو عمل الأحداث في الأصناف

إن الحدث هو وظيفة خاصة يكون تصريحها ضمن الصنف و أما جسمها فيكون في كل حاضن لكائنات من نوع هذا الصنف

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

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

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

ولكنه وضع ليتم تنفيذه بناء على حدوث أمر ما معين

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

تخيلوا معي أن لدينا صنف يعبر عن مادة ضمن المخزون في برنامج إدارة المخازن StoreItem

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

رقم تصنيف المادة ID

واسم المادة Name

و الكمية الحالية Quantity

ووصف لهذه المادة Description

 

ولنفرض أن لديه عدة مناهج

زيادة كمية المخزون Add(int Qty)

إنقاص كمية من المخزون Remove(int Qty)

 

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

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

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

مثلا عند محاولة كتابة فاتورة جديدة

أو عند فتح البرنامج

أو عند عمليات الجرد

أو عند طلب ذلك في أي وقت

 

ولنرى لو أردنا تحقيق هذا الأمر بمفهوم الأحداث

 

بالإمكان تعريف خاصية لدى الصنف تدعى الحد الأدنى للكمية MinQuantity

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

 

نقوم بتعرف حدث داخل صنف المادة نطلق عليه مثلا انخفاض المخزون عن الحد الأدنى

OnQuantityLessLimit مثلا

 

الأن داخل الصنف عندنا وفي قسم set  التابع لخاصية الكمية والتي ستنفذ عند كل تغير لكمية المادة نقوم بعملية فحص القيمة الجديدة مع خاصية الحد الأدنى فإن كانت أكبر لا نفعل شيء

وإن كانت أقل نطلق الحدث

 

الآن ماذا يجري عندما يتم إطلاق الحدث

 

في كل مكان يتم التعامل مع متغير من نوع صنف المادة وتم إدراج الحدث داخله سيتم تنفيذ هذا الإجراء

 

على فرض أن لدينا نافذة ضمن برنامج المحاسبة خاصة بمتابعة المخزون

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

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

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

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

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

 

إن الأحداث نتعامل معها حتى ولو لم نعلم عن البرمجة الكائنية شيئا

فمن منا لم يستخدم حدث النقر على الماوس أو حدث تغير النص أو حدث ضغط مفتاح لوحة مفاتيح أو حدث تغير البند المختار في اللوائح

كل هذه أحداث

وستلاحظون أن لكل حدث خصائص مختلفة ضمن البارمتر e

 فتحرك الماوس قد يعيد الإحداثيات X Y  و تغير النص يعيد النص الجديد قبل أن يظهره على التكست بوكس لترك المجال لإلغاء العملية أو فلترة المدخلات

وكذلك حدث تغير بند اللائحة حيث يعيد البند المختار

 

ولاحظوا أيضا كيف نستيطع أن نربط الحدث بأكثر من كائن لتلافي مسألة التكرار

فمثلا لو لديك مجموعة عناصر من النوع صندوق تحديد CheckBox  أو اختيار Option   أو مجموعة أزرار

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

 

إن للأحداث ضمن الصنف فائدة كبيرة قل من يستثمرها

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

 

يتبع ...

إن شاء الله

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#16
ahmed_youssef كتب:

*مع بعض التقدم والدراسة سيجد القارئ أن ال class هو object بالنهاية   :D

 

هل لك أن تشرح هذه النقطة نفعك الله ونفع بك :)، مع ذكر المصادر بوركت.

1

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#17

كلام الأخ أحمد صحيح في حالة خاصة

عندما يكون الصنف ستاتيكي هو وكل عناصره

فهو يعتبر أوجكت لأنه يكون قد حجز مساحة مع بداية التنفيذ

وللعلم الصنف الستاتكي يكون وحيدا ولا يُسمح بإنشاء كائنات منه

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#18
A.S Hack كتب:

هل لك أن تشرح هذه النقطة نفعك الله ونفع بك :)، مع ذكر المصادر بوركت.

 

اتحدث عن أن كلمة class المستخدمة لإنشاء أصناف 

class Human 

لاتقوم إلا بإنشاء objects من Class (او على حسب تسمية اللغة) -ففي الحقيقة ستجد نفسك تنشئ objects لا classes 

 

 

أنظر هنا 

http://www.ruby-doc.org/core-1.9.3/Class.html

 

وحياك الله

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#19
ahmed_youssef كتب:

اتحدث عن أن كلمة class المستخدمة لإنشاء أصناف 

class Human 

لاتقوم إلا بإنشاء objects من Class (او على حسب تسمية اللغة) -ففي الحقيقة ستجد نفسك تنشئ objects لا classes 

 

 

أنظر هنا 

http://www.ruby-doc.org/core-1.9.3/Class.html

 

وحياك الله

 

شكر الله لك حسن ردك، فهمت ما ترمي إليه، لكن لا أعتقد أن الموضوع منضبط تماما - ودائمًا - كما وصفت، أعني أن جملتك:

 

اقتباس

مع بعض التقدم والدراسة سيجد القارئ أن ال class هو object بالنهاية

 

حالة خاصة وليست في كل اللغات الـOOP، ويمكن أن تكون صحيحة "تقريبا" في اللغات True OOP التي بها every thing is an object .

مثلا لا نستطيع أن نقول أن مع بعض التقدم والدراسة سيجد القاريء أن ال class هو object بالنهاية في لغة ++C مثلًا.

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#20

حياك الله

 

اللغات الكائنية منها ماهو Class based ومنها ماهو Prototype based فليس لكون اللغة تدعم مبادئ البرمجة الكائنية "يجعلها لغة كائنية حقيقية" مالم يكن كل شئ فيها عبارة عن object وبهذا تخرج لغات مثل C++ و Java من القياس الموضوعي ... فالأصل في القياس هو لغة كائنية بالكامل لا لغة توفر مبادئ البرمجة الكائنية :) 

 

*على سبيل المثال بعض الأنواع من اللغات الكائنية ال prototype based لايوجد بها Classes :) 

1
(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#21

لا إختلاف في أن Class -بإختلاف اسم الكلمة حسب اللغة- في لغة True OOP هو عبارة عن object مثل أي شيء آخر في اللغة :) . الآن صار الموضوع أدق.

 

أخذني وصفك "بعض التقدم والدراسة" مذهبًا بعيدًا.

تم تعديل هذه المشاركة بواسطة A.S Hack في 17 فبراير 2013 في 09:10

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#22

ملاحظة:

اقتباس

لاحظ أن لغة الـ VB6  هي لغة إجرائية مع أنها مبنية وفق الـ OOP

ثم تم دعم الـ OOP  في الاصدار التالي وهو VB.Net

لغة VB6 ليست لغة اجرائية و انما يتم تصنيفها OBP أى Object-Based Programming و هذا النوع يسمح لك بإستخدام classes و لا يسمح لك بإنشائه و الـ Classes الموجوده بهذه اللغه ليست claases كما فى الـ OOP و انما هي تتبع مفهوم COM.

 

 

اقتباس

من هنا يمكن توضيح أن الأصناف جاءت لتحوي وتغلف كل من :

- الخصائص Properties والتي هي المتغيرات التي ستحوي القيم أي المعطيات
- المناهج Methods وهي التي تعبر عن الإجراءات أو الوظائف Functions  سابقا
- الأحداث Events و هي إجراءات تحدث عند تحقق شرط معين متعلق بقيم معينة لخصائص ما أثناء سير استدعاءات المناهج

هذا من وجهة نظر تتبع لغة برمجة معينه اما نظريا فـ:

المتغيرات و الخصائص - مهما كان الـ scope h - تسمي بـ attributes

الدوال كلها - مهما كان نوعها - تسمي بـ behaviors.

 

هذا مفهوم محتويات الـ class داخل الـ OOP.

 

اقتباس

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

 

اقتباس

مع بعض التقدم والدراسة سيجد القارئ أن ال class هو object بالنهاية

 

اقتباس

فهو يعتبر أوجكت لأنه يكون قد حجز مساحة مع بداية التنفيذ

 

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

 

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

 

اقتباس

وللعلم الصنف الستاتكي يكون وحيدا ولا يُسمح بإنشاء كائنات منه

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

 

 

اقتباس

لا إختلاف في أن keyword مثل class في لغة True OOP هي عبارة عن object مثل أي شيء آخر في اللغة :) . الآن صار الموضوع أدق.

هل لك ان توضح ماذا تقصد بـ "لا إختلاف في أن keyword مثل class في لغة True OOP هي عبارة عن object مثل أي شيء آخر في اللغة" !!

 

 

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

تم تعديل هذه المشاركة بواسطة C++er في 17 فبراير 2013 في 01:14

مدونتي: C++ Tips and Tricks

#23
اقتباس

مع بعض التقدم والدراسة سيجد القارئ أن ال class هو object بالنهاية

 

ماهو الغير صحيح ؟

 

تحدثت عن لغات كائنية (كل شئ فيها هو كائن) وليست لغات تدعم أسلوب البرمجة الكائنية مثل C++ او Java

والواقع: أن كل ماينشئ فيها عبر ال class construct هو (object)  وليس class

 

 

اقتباس

 ان توضح ماذا تقصد بـ "لا إختلاف في أن keyword مثل class في لغة True OOP هي عبارة عن object مثل أي شيء آخر في اللغة" !!

 

ال keyword! ؟ هي تستخدم فقط لتحديد ال AST وإنشاء الكائنات يتم بصورة داخلية 

إلا إذا تقصد شئ آخر

تم تعديل هذه المشاركة بواسطة ahmed_youssef في 17 فبراير 2013 في 01:52

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#24
اقتباس

تحدثت عن لغات كائنية (كل شئ فيها هو كائن) وليست لغات تدعم أسلوب البرمجة الكائنية مثل C++ او Java

والواقع: أن كل ماينشئ فيها عبر ال class construct هو (object)  وليس class

إفترضت انك تتحدث عن Class-Based و اتضح لي انك تقصد Prototype-Based.

 

 

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

مدونتي: C++ Tips and Tricks

#25
اقتباس

هل لك ان توضح ماذا تقصد بـ "لا إختلاف في أن keyword مثل class في لغة True OOP هي عبارة عن object مثل أي شيء آخر في اللغة" !!

 

اقتباس

ال keyword! ؟ هي تستخدم فقط لتحديد ال AST وإنشاء الكائنات يتم بصورة داخلية 

إلا إذا تقصد شئ آخر

 

حررت الرد عله أوضح الآن، لا أقصد الـ keyword لذاتها! أي لا أعني الـ Token المجرد، ما قصدته هو ما قصدته أنت هنا - ربما لم أوفق في الوصف -:

اقتباس

اتحدث عن أن
كلمة class
المستخدمة لإنشاء أصناف 

class Human

تم تعديل هذه المشاركة بواسطة A.S Hack في 17 فبراير 2013 في 02:35

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

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