في مقالٍ سابق على منصة "أكوا ويب"، استعرضنا أنواعًا مختلفة من البرمجة، بما في ذلك برمجة كائنية التوجه. وأشرنا إلى أنه يُعدُّ تطبيق هذه التقنية واحدًا من الأساليب البرمجية الأكثر أهمية التي تسمح للفرد بإنشاء المشاريع باحترافية كاملة و خلاقية جادَّة. حتى قُدِّمَت سلسلة مقالات لطيفة حول هذا الموضوع. تتضمن تقنيات البرمجة الكائنية التوجه تقنيات مثل Classes، Objects، Encapsulation، Constructorsو Access Modifiers وغيرها. سنشرح في هذا المقال أربعة مبادئ بشكل مبسط وسريع وبأسلوب يتماشى مع ستايل أكوا ويب. يأتي هذا المقال ضمن سلسلة موضوعات ذات صلة بالبرمجة الكائنية التوجه.
أسلوب البرمجة كائنية التوجه OOP يحتوي على عدة مفاهيم وأساسيات، إلا أن العمود الفقري لهذا الأسلوب يتكون من 4 مفاهيم أساسية في OOP والتي يجب على جميع المبرمجين تعلُّمَها وإتقانَها. فالأربعة هذه هي: Inheritance، Abstraction، Encapsulation، Polymorphism. سبق أن قُدِّمَ مقالٌ حول Encapsulation، إلا أنَّ... سنقوم بإعادة ذكر هذه المفاهيم وشرحها بالتفصيل، لذلك دعونا نبدأ الآن.
الموروثات: مفاهيم أساسية لبرمجة الـ OOP.
يعتبر مبدأ الوراثة في البرمجة الكائنية من المفاهيم الأساسية التي تؤثر عليها بشكل كبير، إذ يساعدنا هذا المبدأ في حل مشكلة تكرار الشفرات البرمجية من خلال استخدام كثير من الصفوف، ويوفر أيضًا تنظيمًا أفضل للشفرات بطريقة عملية وتطبيقية.
لفهم الميراث بشكل أفضل، يجب أن تكون لديك معرفة قبلية بكل من الكلاس والـ Object . عبر عن الرابطين المخصصين لهما واقرأ عنهما بعض الشيء، ثم اعد الى الوراء مسافة لإتمام الميراث.
فلنفترض أن كل الكائنات الحية تمتلك أطرافًا وقلبًا وأذرعًا، على سبيل المثال (علمًا بأن بعض الكائنات قد لا تحوي على جميع هذه المكونات). ثم يتم تصنيف هذه الكائنات إلى أصناف مختلفة مثل الإِنْسان والحيوان، حيث يظهر لدي الإِنْسان خصائص جديدة، مثلا العقل، بجانب خصائص كافة الكائنات الحية. من ناحية أُخْرى، يظهر لديَّ المخلوقات سمات جديدة كذلك؛ فالحيوانات تأتي بسمة جديدة، رُبَّما مثلا. لسوء الحظ، لا يمكن إعادة صياغة الفقرة المعينة لأنها تتكون فقط من كلمة واحدة، وهي "الذيل". يرجى تقديم الفقرة كاملة حتى أتمكن من مساعدتك.
نقطة الاتصال. وهو كلاس يحوي تلك القواسم المشتركة بين الحيوان والإنسان ويستخدم كنقطة اتصال مشتركة بين كلاس الحيوانات وكلاس الإنسان لتجنب تكرارها في كلا منهما. سوف نعمل على تحويل الجميع من كائنات حية، ثم سنقوم بوراثة جميع صفاتها في كلاسين جديدين: الكلاس البشري والكلاس الحيوانات. وسنقوم فقط بإضافة ذيل في الكلاس الحيوانات وعقل في الإنسان. وبعد ذلك، يُمْكِنُ صُنْعُ كائِنٍ مِنَ المَادّةِ التَّرْكِيبِية لِيَحْتَوِي على جَمِيعُ مَزاياه المتصلة بالصفات التابعة للكلاس الأب أو ابْن'.
تتمثل أساسيات الـ OOP في الـ Encapsulation.
عند التعامل مع مشروع ضخم، يجب تهيئة Attributes و Actions داخل الكلاس لإستخدامها في العمل. ولكن عند التحول من هذا الكلاس إلى آخر على سبيل المثال بالوراثة، يمكن أن لا تراد بعض الAttributes و Actions الموجودة في الكلاس الأولى. في الصف الثاني، تستخدم عملية التغليف (Encapsulation) لتحديد بشكل دقيق ما إذا كنت ترغب في عرض قيم معينة خارج الصف أو فقط في صفوف محددة. يتم استخدام هذه العملية لأنه في بعض الأحيان، قد لا يكون من الضروري استخدام هذه المعلومات، أو قد يؤدي إلى فشل كود بأكمله إذا تم تغير أحدها.
لنشرح لك الوضع عن قرب، لنتخيل أنه في الصف الخاص بـ "Human" يتم استقبال تاريخ ميلاد المستخدم كسمة من نوع "تاريخ"، ولكن أريد عودة "العمر" للجزء الخارجي بدلاً من التاريخ. سأضطر إلى إجراء بعض العمليات الحسابية داخل نفس الصف، ولكن خارج الصف لا أريد عرض أية شيء. تم التركيز في عمليات الحساب التي قمت بها على إظهار عمر المستخدم فقط، ولتحقيق ذلك، يجب استخدام المغلفة (Encapsulation).
تتبع الأبجديات أو التوزيعات. يتم تحديد المبدأ الثاني بـ Private ومن خلالها لا يسمح بالوصول للـ Attribute في الكلاس من أي كلاس آخر حتى و إن كان من نفس الصنف. أما المبدأ الثالث فهو Protected، حيث تسمح بالوصول إلى Function و Attribute داخل نفس الكلاس أو المورِّث له. فإذا قُدِّر على مستوى صحيح، سيؤدي Encapsulation إلى جعل التطبيقات أقلَّ ارتباطًا بكودها. يجب تجنب استخدامها إلا إذا كنت ترغب في الوصول إلى دالة أو خاصية بشكل عادي.
الخاصية المحمية تسمح فقط بتداول السمات والوظائف داخل الصنف الأب والصناف التي ترث منه، مما يعني أن أي صنف غير مرتبط بالصنف الأب لا يمكنه الوصول إلى هذه الوظائف.
تتمثل الخاصية الأخيرة، وهي Private، في إمكانية تداول الوظائف والسمات فقط في سياق الفئة وعدم ظهوره بشكل مطلق لدى فئات التابعة أو نسخ المثيلات. يتم استخدام هذه الخاصية كثيرًا في تجهيز السمات داخل الفئة تحت خاصية Private، وإتاحة الوصول إلى هذه المتغيرات فقط عبر حافظات الوصول.
لمزيد من التوضيح والأمثلة على Encapsulation، يرجى الاطلاع على مقالنا التالي.
أساسيات البرمجة الموجهة أوبجيكت باللغة الإنجليزية هي Abstraction التي تعنى بتقديم الخصائص والسلوك فقط دون تفاصيل التنفيذ للأشخاص الآخرين.
إن المفهوم المجرد يبدو سهلاً بشكل أولي عندما يتم تعلُّمه مع أمثلة بسيطة، ولكن يصبح أكثر صعوبة مع تقدُّم المستوى في مفهوم الاستخلاص، وخاصة انتقالَ التعامل مع مستوى الـ Interface في هذا الأمر. ومن هنا، نحتاج إلى شرح أدق وأبسط لتسهيل الفهم.
إذا ركزنا على الكلاس الخاص بالكائنات (Creatures) الذي يعتبر أساس كل من Animal وHuman، نجد أن بإمكاننا إنشاء كائنات من هذا الكلاس رغم وجود الكلاسين الإبن، مما يتسبب في الخلط والارتباك. لهذا، يجب عليَّ أن أمنع صُنْع كائِناتٍ من هذا الكلاس والامتثال لقواعد صُنْع كائِناتٍ فقط من خلال Animal وHuman لأََهِلية أيَّة كائِن حي. في هذه الحالة، لا يوجد فرق بين حيوان أو إنسان، ولا يمكننا تصنيف المخلوقات أو الكائنات الحية خارج هذين الصنفين.
لمنع إنشاء كائن من فئة Object، سوف نستخدم عبارة "Abstract" لتجريد هذه الفئة وجعلها تصبح الفئة المجردة creatures. سيتم استخدام هذه الفئة فقط لوصف خصائص جميع الكائنات، وستستخدم فقط للوراثة دون غيرها.
لكن مفهوم الـ Abstraction يتجاوز ذلك إذا تعاملنا به في مشاريع كبيرة. فعلى سبيل المثال، بإمكاننا خلق دالة مجردة (Function/Method)، ولكن في حالة القيام بذلك، يجب أن يكون الفئة نفسها أيضًا مجردة، و يجب ان تكون جميع الدوال المختلفة ضمن هذه الفئة Abstract, أما المتغيرات داخل هذه الفئة فيجب أن تكون static. أيضاً، عندما نطبق هذه القواعد في صف واحد، فإن الصف لم يعد صفًّا بل أصبح واجهة Interface. وهذه هي الفروقات الرئيسية بين الصف والواجهة Interface، بالإضافة إلى أن الصف لا يمكن أن يرث إلا من صف واحد فقط، في حين يُمكن أن يرث من أكثر من واجهة Interface عبر كتابة Implement ليصبح: class human. لا يوجد محتوى أصلي لتخمين المعنى الذي تريده. يرجى إعادة كتابة المقطع المراد تبسيطه باللغة الإنجليزية وسأكون سعيدًا بترجمته لك إلى العربية.
أساسيات برمجة الكائنات: تقنية الـ Polymorphisme.
قد يكون من الصعب تفسير الـ Polymorphisme بطريقة بسيطة أو مفهومة بدون تحديد دوره الدقيق داخل المشروع البرمجي. ولكن، هناك طرق جيدة لشرحه بسهولة. تُعَدُّ تعداد الأشكال أحد هذه الطرق.
كانت أول مرجع شخصي لي في Polymorphism مثالاً بسيطاً وجميلاً لأحد الأساتذة الكرام الذين علموني البرمجة سابقاً، وكان الشكل التالي هو المثال.
لم تقم بوظيفتها الإعتيادية ولم تقم بجمع عددين، لأن المتغيرات تحتوي على أسماء وليس أرقام. بالتالي، فإن في هذا السياق يستخدم كعامل ربط لدمج الكلمات. لم تؤدي الجمع وظيفتها كرمز للجمع بل قامت بدمج الكلمتين معًا.
يمكننا القول بأن علامة الجمع تؤدي دورين في هذا السياق دون تغييرهما، فإذا كان الرقم على يمينها وعلى يسارها أرقام متبادلة، فإنها تجمعها، أمَّا إذا لم يكن كذلك، فإنها تُستخدَم للربط بين الأرقام.
يتمثل المبدأ نفسه في Polymorphisme ولكن بمستوى أعمق، حيث يتم إنشاء طريقة في الصنف الأساسي، ولكن طريقة استخدامها تتغير وفقًا للسياق.
الوظيفة، فلدى استخدام التقنية الـ Polymorphisme يمكن لهذا المثال أن يحل المشكلة بسهولة. حيث يمكن لأي Object ناتج من هذا الكلاس أن يستخدم الـ Method Walk() أو Method Swim() باعتبار كلاهما يقومان بأداء نفس الغرض. لا حاجة لي في هذه المهمة أن أقوم بتصميم مزيد من الأساليب التي تؤدي نفس المهمة، بإمكاني صنع طريقة واحدة فقط مثل "التحرك" واستخدامها على حسب الحاجة لكل حيوان. دعنا نوضح ذلك بشكل أفضل من خلال هذا المثال.