2013/08/14

مفهوم وفلسفة البرمجة هدفية الغرض ( ( الكائنية ) Object Oriented OOP ) :

مفهوم وفلسفة البرمجة هدفية الغرض ( ( الكائنية ) Object Oriented  OOP ) :

-  لا بد من وجود معيار ومقياس لبرمجة وكتابة الكود من طرف المبرمجين ولنخرج جيل ذو خبرة عالية ومرونه وسهولة . وبسبب هذه الفلسفة ظهر ما يعرف ببرمجة الكائنات الموجهه Object Oriented ( OOP ) والتي تستند إلى إستخدام المكتبات Library وإستخدام الدوال Function والتي عرفناها قبل ذلك بالبرمجة التركيبية Structured Programming والتي ظهر مفهوم البرمجة بواسطة الكائنات الموجهه على إثرها .

لكي نتكلم عن لغة أنها Full OOP يجب أن تتوافر فيها الشروط الأربعة التالية :


1 – Encapsulation

2 – Abstraction

3 – Inheritance

4 – Polymorphizen

ولنأتي الى الشروط الأربعة بالتفصيل الممل :

الشرط الأول : Encapsulation

ومعناه هو تجميع أشياء ووضعها كاملة بمكان ما . ومن إسمها تستطيع تمييز ذلك فمعناها الكبسولة

ولتعريفها جزئين :

الجزء الأول : هي تعريف مكان (( Class )) ونضع فيه كل المتغيرات والدوال التي لها علاقة ببعضها ومن ثم نسند إليه إسماً

الجزء الثاني : هذا المكان لا يستطيع أحد الدخول إليه إلا بصلاحيات تحدد من قِبل المبرمج فيوجد قسمان رئيسيان لها وهما الـ Public وهو القسم العام والـ Private وهو القسم الخاص .

الشرط الثاني : Abstraction

وهي إضافة دالة عامة Function داخل الـ ( Class ) لا أقوم بتحديد التفصيلات لها إلا في قسم البرنامج الرئيسي .

فمثلاً :

نريد صنع عدة كائنات (( Class )) أو Modules في جامعة معينة فينتج من ذلك كائن للدكتور وكائن للطالب وكائن للمدير وكائن للعامل و ... إلخ وأردنا أن نجري بحث في من خلال البرنامج الرئيسي

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

وكمثال ثانٍ :

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

ولنتوقف عند هنا المثال قليلاً ونسأل أنفسنا : ماذا لو قمنا بالأصل بتصميم العلب للشركة أ وقامت الشركة ب بالطلب ؟؟

ستحدث خسارة في الوقت والجهد فهنا يكون معنى الـ Abstraction قد توضح لنا ورسم في مخيلتنا .

الشرط الثالث : Inheritance

لو سألنا أنفسنا ما معنى هذه الكلمة لأجبنا أنفسنا بالسرعة معناها التوارث (( طيب )) وماذا يعني ذلك ؟؟!!

العديد من المبرمجين يفهموا هذا المفهوم فهماً خاطئاً كالتالي :

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

لنفترض أننا نمتلك الكائنات التالية : الطالب و الدكتور والعامل والسكرتير و ... إلخ

كل الكائنات السابقة لها خاصيتان متشابهتان وهما الإسم والرقم .

فلو قمنا بفصل هذين الخاصيتين وجعلناها في كائن واحد ثم قمنا بإعطاءه دور الأب وإعطاء الكائنات التالية دور الإبن فهنا يمكننا القول بأن الكائنات الأخرى هي Inheritance أي متوارثة من الكائن الأصلي (( الجديد )) وهذا كما قلت منطقياً مقبول . ولكن !!!

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



سؤال يجب طرحه هنا : ما الفرق بين ال(( Class)) الكائن وبين ال (( Object )) ؟؟!!

سؤال محير أليس كذلك !! إليك الفرق :

الـ Class هو شيء نظري غير موجود على الواقع فهو عبارة عن تعريفات لشيء معين نظرياً .

الـ Object وهو الكائن النظري عند تطبيقه على أرض الواقع ليصبح عنصراً وكائناً عملياً .

الشرط الرابع : Polymorphizen

يمكن تقسيمه إلى نوعين وهما الـ Overload والـ Override . وإليك تبييناً لكلاهما :


Overload : وهي عبارة عن دوال لهم نفس الإسم ولكن تختلف في عدد الباراميتر (( الوسائط التي تأخذها )) أو نوعها

Operator Overload : فمثلاً نريد إشارة الزائد + في المعادلة التالية 1+1=2 أن نحوله الى حرف وصل (( & )) فبإمكاننا تعريف نفس الإسم ولكن أغير في النوع والكود لتصبح المعادلة التالية 1 & 1 = 11 .

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

نعرف الجملة التالية X = 3 ثم نقوم بعدها بتعريف الجملة التالية X = 7 فيقوم الحاسوب بحذف الأولى وتطبيق الثانية . هذا بالنسبة للمتغيرات

أما بالنسبة للدوال فإذا عرفنا دالة في كائن معين ثم قمنا بإعادة كتابة الدالة ولكن غيرنا في الكود فيقوم الحاسوب بحذف الأولى وإعتماد الثانية .

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

إذن :

Overload : تغيير النوع أو عدد الباراميتر لدالة معينة

Override : تغيير الكود فقط ولا تغيير على النوع أو الباراميتر


1 تعليقات :