ما هي البرمجة كائنيّة التوجّه (OOP)؟

ثريدات برمجية 136 ما هي البرمجة كائنيّة التوجّه (OOP)؟

البرمجة كائنية التوجه، وتسمّى أيضًا البرمجة الشيئية، أو البرمجة الغرضيّة الموجّهة (Object Oriented Programming) باختصار، هي نوع متقدم من البرمجة، يعتمد على الكائنات (objects) كعنصر رئيس في بناء الكود البرمجي.. فما هو الكائن (object)؟

لكائن (object) يتشابه تمامًا مع كلّ ما نسمّيه "كائن" أو "شيء" في العالم الواقعي، من حيث كونه:

  • 1- يتمتّع بمواصفات معيّنة.
  • 2- يمتلك أفعالًا/سلوكيّات معيّنة.

فلو أخذنا الإنسان كمثال، فهو يتمتع بمواصفات تتمثل في الاسم والطول والوزن ولون البشرة والعينين والشعر، إلى غير ذلك،وله أيضًا سلوكيات تتمثل في التفكير والأكل والشرب والمشي والنوم والجلوس...إلخ. وكل إنسانٍ منّا يمتلك من المواصفات ما يجعله كائنًا(object) مستقلًّا عن كل "إنسان" آخر.. فلو اكتفينا بالاسم والطول كمثال للتمييز بين إنسان وآخر، فسوف يكون خالد الذي يبلغ طوله 170سم كائنًا(object) مستقلًّا عن أحمد الذي يصل طوله إلى 180سم، وعن طلال البالغ من الطول 165سم. وعلى الرغم من استقلال كلّ إنسان بمواصفاته عن باقي البشر، إلا أن هناك ما يجمعهم،فما هو الجامع؟ الذي يجمعهم هو المواصفات والسلوكيّات نفسها التي تنتمي إلى مفهوم "الإنسان" والمذكورة آنفًا، فخالد وأحمد وطلال يجتمعون في كونهم يملكون أسماءً وأطوالًا وأوزانًا وألوانًا... إلخ، ولهم السلوكيّات نفسها من قدرة على الأكل والشرب والجلوس والتفكير... إلخ. وعليه، فإن خالد وأحمد وطلال كائنات (objects) مستقلّة بذاتها، لكنّها تنتمي إلى فصيل أو فئة أو صنف واحد (class)، ويدعى "الإنسان". والفصيل (class) هو مفهوم آخر من المفاهيم الرئيسة للبرمجة كائنية التوجه، وهو بالنسبة إلى الكائن(object)، كخالد (أو أحمد أو طلال) بالنسبة إلى الإنسان. فالكائنات (object) التي تشترك في المواصفات والسلوكيّات نفسها، تنتمي إلى فصيل (class) واحد، وهذا الفصيل يمكن أن يكون الإنسان أو الحيوان أو السيارة أو الكرسي أو الحقيبة، والأمثلة أكثر من أن تُحصَر (أعتذر عن سرد جميع كائنات الكوكب ضمن هذه السلسلة.. وبالمناسبة،فالكوكب فصيل أيضًا !) حسنًا، قلنا أنّ الكائنات (object) التي تنتمي إلى فصيل (class) واحد، يجب أن تشترك في المواصفات نفسها، فهل هذا يعني أنّ مواصفات خالد وأحمد وطلال يجب أن تتطابق حتى ينتمون إلى الفصيل نفسه؟ بحيث يحملون الصفات نفسها من طول ووزن ولون وغير ذلك؟ والجواب ببساطة هو: لا فالمقصود هو الاشتراك في نوع الصفة (type) وليس في قيمتها (value)، فالطول - مثلًا - هو نوع(type) صفة يشترك فيه خالد وأحمد وطلال، لكنّهم يختلفون في قيمة(value) تلك الصفة، فطول خالد هو 170سم، وطول أحمد 180سم، وطول طلال 165سم ولذلك فمن المميّزات المهمة للبرمجة كائنية التوجّه ما يُعرَف بالتجريد (abstraction)، بمعنى أنّ الفصيل (class) يحمل أنواع (types) الصفات بالمعنى الذي شرحناه، ولا يحتوي على أيّة معلومات تتعلّق بقِيَم (values) تلك المواصفات، ولا توجد تلك القيم إلّا عند الكائنات (objects) فقط.

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

فصيل السيارات:

  • الاسم
  • اللون
  • نوع مبدل السرعات
  • السرعة القصوى

كائن سيارة

  • الاسم: كامري
  • اللون: أبيض
  • نوع مبدل السرعات: أوتوماتيك
  • السرعة القصوى: 220 كلم/س

وفي البرمجة كائنيّة التوجّه (OOP)، نطلق مسمّى "مواصفات" (attributes) على المتغيّرات التي نكتبها داخل الفصيل(class)، ولا تختلف عن طريقة تعريف أي متغيّر آخر له نوع بيانات(data type) واسم متغيّر (variable)، كأن نكتب صفة "السرعة القصوى" لفصيل السيارة على النحو التالي: int max_speed; والسلوكيّات هي ما نسمّيه: methods، في حال كُتِبَت داخل الفصيل، وهي نفسها المعروفة بالدوال (functions) في غير تلك الحال. ومن مميّزات البرمجة كائنيّة التوجّة (بالإضافة إلى التجريد)

  • 1- الكبسلة أو التغليف (encapsulation).
  • 2- الوراثة (inheritance).
  • 3- تعدد الأشكال (polymorphism).

والكبسلة - باختصار - تعني حماية البيانات الموجودة داخل الفصيل (class) من الوصول غير المصرّح به من خارجه. والوراثة تفيد بإمكانيّة التوارث بين الفصائل (classes)، فبإمكاننا أن ننشئ فصيلين تحت مسمّى "سيارات ثقيلة" و "سيارات رياضيّة"، وكلاهما يرث من فصيل "سيارة". والسيارات الثقيلة ليست كالسيارات الرياضيّة بطبيعة الحال، إلّا أنّها تشترك في كونها سيارات في نهاية المطاف، فالمواصفات (اسم ولون ووزن وإطارات ومقود...) والسلوكيات(التحرك للأمام والخلف...) الخاصة بفصيل "سيارة"، موجودة في كلا النوعين.. الوارث يدعى: child، والموروث يدعى:parent. وأخيرًا، تشير ميزة "تعدّد الأشكال" إلى قدرة الدالّة (method) على العمل بصور متعدّدة وفقًا للخصائص المختلفة للكائنات(object) التي تنتمي إلى نفس الفصيل(class). فيمكننا - مثلًا - كتابة الدالة مرة واحدة داخل الفصيل الأب (parent class)، ثم التعديل على تلك الدالة بعد وراثتها من قبل الفصائل الأبناء (child classes) بما يناسب كلًّا منهم.. وأرجو أن لا يكون التبسيط مخلًّا، لكن التفصيل في هذا يطول. أكتفي بهذا القدر، وأعتذر عن الإطالة. انتهى.

كتبه @Waleed_S_7