عندما تم إنشاء نمط OOP كان قد بني على أساس محاكاة الأشياء في الواقع للاستفادة من عملية التنظيم التي تجري في الواقع الذي نعيشه من حيث خصوصية الأشياء و العلاقات التي تنشأ بينهم و فرز الاختصاصات
في ما سبق كانت البرمجة تقوم على خوازن القيم و الدوال التي تقوم بالعمليات على تلك القيم
وكانت الأمور تحتاج إلى تدخل كثير من طرف المبرمج لحفظ سلامة سير العمل من الناحية المنطقية وعدم تداخل المهام و المصيبة الأكبر أنه بعد مدة قد يتطلب الأمر صيانة أو تطوير أو تعديل وكان أي تعديل سيتم ربما سيؤثر على منطق العمل من حيث لا تدري وربما لن يكتشف إلا من خلال التنفيذ
من هنا جاءت فكرة الأصناف لتكون كنوع معطيات جديد يجمع بين المعطيات والدوال في كتلة واحدة تدعى الصنف لتكون بمثابة اسم الأب الذي سينسب له أولاده
إذا الكلاس هو بمثابة حاوية تضم مكونات منها المعطيات والتي تمثل الخصائص و منها الدوال التي تمثل الأفعال ومنها الأحداث التي تمثل ردود الأفعال
وكما قلت هي محاكاة وتمثيل للأشياء في الواقع ولهذا سميت البرمجة الشيئية
الآن من خلال هذا التمثيل أصبح لدينا قالب نستطيع أن ننشيء به كائنات في الذاكرة متشابه من حيث الهيكل ولكن لكل واحد محتوياته الخاصة من حيث القيم
وبهذا لم تعد بحاجة لاهتمام بالتسميات في حال التكرار
سأضرب مثال
لو احتجت إلى متغير يعبر عن احداثيات نقطة ستصرح X Y و تعين لهما قيم
ماذا لو احتجت نقطتان حينها ستتضر مثلا للتصريح X1 Y1 و X2 Y2
ولكن لو جمعناهما في قالب واحد وأسميناه P فأصبح بإمكانك استخدام P1 P2 والاحداثيات داخل كلاهما هي X Y هنا لن يحدث تضارب لإن X Y الأولى تابعة ل P1 و X Y الثانية تابعة ل P2 و الوصول لها يكون من خلال التابعية أي تذكر الأب ثم الولد
فيكون
P1.X P1.Y
P2.X P2.Y
يعني تماما مثلما يكون أولاد بأسماء محددة ولا يمنع تكرار نفس الأسماء طالما أنها لعائلة ثانية
إذا ماذا لو كان لدينا حاجة لتعريف مستقيم حينها سنحتاج للنقطتان السابقتان
طيب ولو أردنا مستقيمان أو أكثر حينها سندخل في نفس المشكلة وهي تكرار النقاط بأرقام كثيرة
هنا نقوم مرة أخرى بتعريف صنف نسميه مستقيم أو خط Line ويكون مكوناته P1 P2
أي أصبح أعضاؤه هي أصناف أخرى فأصبح لدينا جد و أب و أبناء
وهنا تستطيع الوصول لإحداثيات X لنقطة البداية من الخط الأول L1.P1.X
وكأنك تطلب المتغير باسمه الثلاثي
وتخيل الأمر لو أننا نريد تعريف مضلع مكون من عدد ما من القطع المستقيمة
وماذا لو أردنا تمثيل مجسم متعدد الأوجه
أظن أنك بدأت تدرك أهمية التصنيف و النسب
الآن تحدثنا عن التصنيفات السابقة بمكونات المتغيرات فقط
ماذا لو أردنا حساب طول المستقيم
حينها سنحتاج إلى دالة حساب
ستقول لي أبرمج دالة حساب وأضعها في المكان العام
وبعد قليل سنحتاج إلى دوال أخرى منها مساحة مضلع
وماذا لو كان لدينا عدة أصناف هندسية
فقمنا ببرمجة صنف دائرة و مربع ومستطيل و مثلث و مسدس و و .. الخ
وعلى فرض أردنا برمجة دالة تحسب مساحة كل منهما
فإن كانت في مكان عام سنضطر لتمييز الأسماء كأن نسمي AreaCircle و AreaSquare و AreaRectangle و .. الخ
عدنا لمشكلة التسمية
ولكن في نمط OOP حلت لنا هذه المشكلة
فسمحت لنا بالتصريح عن دالة داخل الصنف وتكون تابعة له ومنسوبة له
فمثلا نستطيع برمجة دالة باسم واحد وهو Area ويكون موجود في كل صنف داخل الدائرة و المربع و المستطيل و المثلث
ولكن الكود الداخلي لكل دالة يختلف بحسب الوظيفة المطلوبة منه
فالذي داخل الدائرة يستخدم قانون حساب مساحة الدائرة و الذي داخل المستطيل يستخدم قانون مختلف
لاحظ أننا وفرنا مشكلة تضارب التسميات ومن جهة أخرى أصبحت التسمية تعبر عن الوظيفة بالضبط و يتحدد المطلوب من خلال التابعية
فيكون
Circle1.Area()
Square1.Area()
Rectangle1.Area()
إذا الصنف هو نوع معطيات يضم خصائص و مناهج وأحداث في كتلة واحدة
والكائن هو النسخة التي سننشئها لنستخدمها أثناء سير العمل
يعني الكائن هو قيمة للصنف
فكما أن Integer هو نوع معطيات رقمي و الأعداد 1 3 55 6764 هي قيم لمتغير من هذا النوع
كذلك أي صنف تبرمجه هو نوع و الكائنات هي قيم لذاك النوع تستطيع استخدامه للوصول إلى مكوناته المختلفة سواء للحصول على قيم الخصائص أو لطلب تنفيذ دواله الخاصة
فالصنف مجرد توصيف و الكائن هو نسخة واقعية من ذاك الصنف
كمن يضع مخطط لمواصفات مبنى فهي مجرد مواصفات وعند بناء مبنى حقيقي طبقا لتلك المواصفات فذاك هو الكائن
فالمواصفات لا تستطيع أن تعاين غرف أو جدران وإنما معلومات مجردة
ولكن أي نسخة منه كأن قمت ببناء مجموعة مباني كلها مطابقة للمواصفات فأي واحد منها هو كائن تستطيع الدخول للمبنى لتعاين الغرف والجدران و المصعد وتطلب الصعود للأعلى و ترن الجرس لأنه أصبح واقعا