هذه المقالة واحدة من مقالات السلسلة “كيف شرحت التصميم غرضي التوجه لزوجتي“.
عمر: إنّ المصطلح “مبدأ (ليسكوف) في الاستبدال” يبدو جزلاً و صعباً, و لكنّ حقيقة هذا المبدأ بسيطة جداً؛ دعينا ننظر إلى هذه الصورة المعبّرة:
رغم أنها تشبه البطة, لعبة البطة ليست كذلك فهي بحاجة للبطاريات, هل قمت بعملية تجريد خاطئة؟
ينصّ هذا المبدأ على:
“يجب على الأنواع المشتقّة[2] أن تكون قابل للاستبدال بالأنواع الأصلية[3] التي اشتقت منها.”
و يمكننا أن نصوغه أيضاً بالشّكل:
“إنّ التوابع[4] التي تَستخدم مراجِعَ إلى الأصناف الأصليّة, ينبغي لها أن تتمكن من استخدام أغراضٍ من الأصناف المشتقة[5] دون أن تحسّ هذه التوابع بذلك.”
ريم: آسفة, و لكن يبدو لي هذا المبدأ مُشوِّشاً بعض الشيء, فقد ظننته قانوناً أساسياً من قوانين البرمجة غرضية التوجّه. هذا هو تعدّد الأشكال أليس كذلك؟ لماذا إذاً أنشأنا مبدأ من مبادئ التصميم غرضي يخصّ نفس هذا القانون؟
عمر: هذا سؤال جيد, و ها هو الجواب:
في سياق القوانين الأساسية للبرمجة غرضية التوجّه إن “الوراثة” توصف غالباً على أنها علاقة “هو”[6]؛ مثلاً إذا كان “المطور[7]” هو “محترف في عالم البرمجيات” إذن فإنّ الصّنف الذي يعبر عن “المطوّر” يجب أن يرث صنف “المحترف في عالم البرمجيات”. إن علاقة “هو” مثل هذه التي ذكرتها الآن مهمة جداً في عملية تصميم الأصناف, و لكن من السهل جداً الانجراف في هذا السياق زيادة عن اللزوم و الوصول إلى تصاميم غير صحيحة تعبر عن علاقة وراثة سيئة إن جاز القول.
ريم: كلامك مثير للاهتمام.
عمر: بالفعل يا عزيزتي, دعينا ننظر إلى المثال التالي:
بنية هرمية للأصناف تعبر عن مبدأ ليسكوف في الاستبدال
هنا نجد أنّ الصنف المسمى KingFisher يَرث (يوسّع[8]) الصنف Bird, لذا فهو يرث منه الطريقة المسماة Fly(), و هذا الأمر منطقي تماماً.
دعينا الآن ننظر إلى المثال التالي:
بنية هرمية للأصناف غير صحيحة وفق مبدأ ليسكوف
إنّ النعامة هي طائر (كما هو معروف), و بناء على ذلك فهي ترث الصنف Bird, و لكن هل تستطيع النعامة الطيران؟ كلّا! بناءً على ذلك فإنّ هذه البنية الهرمية للأصناف تخرق مبدأ ليسكوف في الاستبدال.
نستنتج أنّه حتّى لو وجدنا علاقة الوراثة منطقيّة و طبيعية في الحياة الواقعيّة, فإنّها ليست بالضرورة كذلك عند تصميم الأصناف فصنف Ostrich لا ينبغي له أن يرث صنف Bird, بل يجب أن يوجد صنف خاصّ بالطيور التي لا تستطيع الطيران و ينبغي لصنف Ostrich أن يرثه.
ريم: حسناً, لقد فهمت قصدك, إذاً أستنتج أهمية مبدأ ليسكوف في الاستبدال:
- إذا لم نحترم هذا المبدأ, فإن البنى الهرمية للأصناف ستتحول إلى فوضى, و إذا مرّرنا كائناً من صنف مشتق[9] كوسيط[10] إلى طريقة ما, فإننا قد نحصل على نتائج غير متوقعة (كأن نطلب من النعامة أن تنفذ عملية الطيران).
- إذا لم نحترم هذا المبدأ, فإن تطبيق اختبارات الوحدات البرمجية[11] المصممة لأجل الأصناف الأصليّة على الأصناف المشتقة لن ينجح أبداً.
هل أنا محقّة؟
عمر: نعم, أنتِ محقّة تماماً. يمكنك أن تستخدمي مبدأ ليسكوف في الاستبدال كأداة لمعرفة هل البنية الهرمية للأصناف التي صممتها صحيحة أم لا.
صفحات السلسلة
المؤلف: Al-Farooque Shubho
المصدر: http://www.codeproject.com/Articles/93369/How-I-explained-OOD-to-my-wife
المترجم: غريب بهجت فلازي
[1] Liskov’s Substitution Principle
[2] Subtypes
[3] Base Types
[4] Functions
[5] Derived Classes
[6] is-a relationship
[7] Developer
[8] Extends
[9] Subclass
[10] Parameter
[11] Unit Tests
نقاش
Powered by Facebook Comments
Pingback: كيف شرحت التصميم الغرضيّ التوجّه لزوجتي – مبدأ انعكاس الاعتماديّة | مترجم - Moutarjam