السلام عليكم
هذه المقالة كانت مشروع ورقة علمية لكن هناك من أحبطني بقوله تحتاج للقراءة أكثر لذا هاهي بين أيديكم كتدوينة علها تفتح طريقاً ما لأحد ما 🙂
في البداية أحب أن أتكلم عن بعض المفردات قبل أن أدخل في الموضوع الرئيسي
البرمجة الكائنية object oriented programing
هي محاكاة للحياة الطبيعية
مستمدة بالأصل من علم الوراثة وعلم تصنيف الكائنات
فئة class
الفئة في علم التصنيف تحتوي على مجموعة من الكائنات التي تندرج تحتها
في البرمجة الكائنية تحتوي على الصفات والسلوكيات العامة لمجموعة من الأشياء أو الكائنات
الكائن object
الكائن في الطبيعة يندرج تحت فصيلة معينة وله صفات ناتجة عن جينات ورثها من أحد أبائه
الكائن في البرمجة الكائنية هو عبارة عن تخصيص للصفات العامة للفئة التي ينتمي لها هذا الكائن
الوراثة inhertance
الوراثة في الطبيعة تعني انتقال العوامل الوراثية من أحد الأباء إلى الابن
(لم أقل الأبوين لأنه يحتمل أن يكون هناك كائنات جماعية التكاثر)
الوراثة في البرمحة الكائنية هي عبارة عن انتقال الصفات والسلوكيات من أحد الأباء إلى الابن
تغيير السلوكيات overriding
السلوكيات في الطبيعة تتغير في الأبناء بسبب البيئة التي يعيش فيها الكائن
السلوكيات في البرمجة الكائنية تتغير في الأبناء على حسب الحاجة
وهي محاكاة لعملية التطور أو التحور التي تصيب فصيلة ما
بعد أن تكلمت عن مفردات الموضوع أدخل في الموضوع مباشرة
لو تطلعنا للنموذج الذي تقوم على أساسه البرمجة الكائنية
نجد أنه محاولة لتقليد الطبيعة بشكل واضح
لا أعرف إن كان النموذج الأصلي للبرمجة الكائنية يتكلم عن ذلك
(النموذج الموجود في small talk)
لكني أحس هذا في كل تفصيلة من النموذج الحديث
(النموذج الموجود في جافا و C# واللغات الحديثة)
ومن هنا وجدت في نفسي القوة للحديث عن مفهومي الجديد
(طبعاً على فرض أنه لم يوجد قبل ذلك من تكلم عنه)
اختفاء الصفات في الوراثة
أبدأ بالكلام عن الموضوع من الناحية الطبيعية
نجد أن الكثير من الكائنات كان لها سلوكيات واختلفت
مثلاً الفيل على أغلب الظن هو الماموث
بعد اختفاء بعض الصفات
وتغير صفات أخرى
الإنسان نفسه يعتقد علماء الانثرابولوجي
(الانثرابولوجي هو علم دراسة الأجناس ويهتم بدراسة القبائل البدائية مثل بوشمن وتوركانا)
بأنه كان يستطيع القيام بأشياء كثيرة اختفت مع الحضارة
بالطبع لا أتكلم عن الأخ داروين ونظريته حول التطور
على كل حال لا أريد الخوض في هذا الموضوع الشائك
لو أخذنا هذا الموضوع من ناحية الجينات ربما كان الكلام أفضل
نجد أن الكائن يحتوي على الكثير من الجينات
ونجد أن الكثير من الجينات تكون متنحية في الكائن
المهم أني أريد أن أصل إلى النقطة الرئيسية
في الطبيعة تختفي الصفات وتظهر مرة أخرى
أدلل على ذلك بقول الرسول الكريم للصاحبي الذي جاء يسأله عن ابنه ذو اللون الأسود
في النهاية أريد أن أقول
لماذا لا تسمح البرمجة الكائنية بهذه الميزة
من ناحية البرمجة الكائنية
اللغات في النموذج الحديث تسمح فقط بتغيير السلوك
لكنها لا تسمح باختفاء السلوك
ربما يكون هناك نمط pattern لحل هذه المشكلة
لكن في رأيي هذا تعقيد وإضاعة وقت المطور
خصوصاً إذا كنت أريد بناء كائن جديد يتشارك مع كائن في كثير من الصفات ويختلف معه في صفة أو اثنتين
لكن لماذا لا تدعم البرمجة الكائنية هذا؟
فائدة تغيير السلوك في البرمجة الكائنية
1-دعم مفهوم open close
بمعنى أننا لا نعدل على الفئة نفسها
وإنما نرث الفئة ونعدل عليها
وهذا المفهوم مهم جداً عند الكلام عن تطوير الحزم packages
مثال
لدي مكون component يمكن المطور من عرض أي نص
لو فرضنا أني أريد أن أقوم بعمل مكون يعرض الوقت الحالي
نلاحظ أننا لا نريد أن يغير على النص أي مبرمج وإنما سيقوم المكون نفسه بتغيير النص على حسب الوقت
نحن مضطرون إلى إعادة بناء المكون من البداية
ماذا لو أردنا أن نستفيد من المكون القديم
وهذا لن يكون إلا بإخفاء سلوك تغيير النص عن المبرمجين
2-من المثال السابق يتبين لنا أن إخفاء الخصائص تدعم مفهوم الاستخدامية reusability
القاعدة تقول-لا تخترع العجلة- وإنما أضف إليها مميزات جديدة مفيدة
ما الذي يحصل لو قلنا لا تخترع العجلة وإنما أضف إليها مميزات جديدة مفيدة أو أزل منها مميزات قديمة مضرة
الحلول المقترحة لإضافة مفهوم إخفاء السلوكيات
الحل الأول
استخدام مفهوم المرئية visability
وذلك بالسماح بتغيير المرئية overriding visablity
بمعنى تحويل السلوك (الدالة) من عام public إلى خاص private
المشكلة في هذا الحل
أن المرئية بالنسبة للغة تعني الأمان
بمعنى أن هناك البعض المطورين كان يستخدم هذه الخاصية
في حماية حزمه packages من التعديل عليها
لهذا فهذا الحل يعتبر كارثة كبيرة
ملاحظة
أظن أن هذه النقطة هي السبب الرئيسي في عدم إضافة مفهوم تغيير المرئية overriding visablity
لوكان أحدهم فكر في الموضوع
الحل الثاني
إضافة كلمة محجوزة تعني ان الدالة قابلة للإخفاء
لو افترضنا الكلمة override
مثال
public class Humanv1{ public override void someMethod{ //something }
لاحظوا أنا أضفنا الكلمة override وهذا يعني أنا نستطيع تغيير المرئية
public class Humanv2 extends Humanv1{ private override void someMethod{ //something }
بما أنا أبقينا الكلمة override وهذا يعني أنا نستطيع إظهارها مرة أخرى
public class Humanv3 extends Humanv2{ private void someMethod{ //something }
لاحظ هنا أنا نريد إبقاءها مخفية دائماً
بمعنى لو قمنا بالتالي
public class Humanv4 extends Humanv3{ private void someMethod{ //something }
هنا يجب على المترجم أن يتدخل لإيقاف العملية
الحل الثالث
استخدام annotation
يعتبر نفس الحل السابق تماماً وإن كنت أفضله لكونه لا يحتاج إلى تعديل على اللغة
البعض قد يعتقد أن الحل الأخير فعلاً موجود في جافا
في جافا يوجد annotation اسمه deprecated
وهو يرمز إلى كون الدالة منتهية الصلاحية
وكل ما يبقيها هو ضمان عمل برنامج الجافا المصمم على إصدارة قديمة على الإصدارات الجديدة
مع التنبيه للمستخدمين الجدد بأن هذه الدالة لها بديل أو تسبب مشاكل معينة
لكن هذ ا حل لمشكلة أخرى غير المشكلة التي أتحدث عنها
أنا أتحدث عن الاستفادة من القديم مع حذف بعض المزايا ليس بالشرط أن تكون عيوب
بينما deprecated تنبه المطور إلى أن هذه الدالة فيها مشكلة معينة لذا ألغيت
فنجد أن حل صن للمشكلة مقنع لو كنا نتحدث عن دالة موجودة في نفس الفئة بدون أي عملية وراثة
بينما هي غير مجدية عندما نتحدث عن عملية وراثة للفئة ككل
أقصد أني أريد أن أستفيد من الفئة لكن مع تعديل خواص الفئة
خاتمة
بصراحة أعتقد أن هناك من سبقني إلى هذا المفهوم
وإن كان لم يسبقني إليه أحد
فأعتقد أنه لسبب ما مقنع
ولهذا اكتفيت بطرح المفهوم كمفهوم
ولم أحاول مناقشة تفصيلاته
تحياتي