Table of Contents
تصميم نظم قابلة للتوسع باستخدام مبدأ ليزكوف البديل
ولا يزال بناء النظم القابلة للطرد يشكل تحدياً مستمراً في هندسة البرمجيات، فمع تطور المتطلبات، فإن القدرة على إضافة سلوكيات جديدة دون إعادة كتابة الرموز القائمة تفصل بين البنيانات القابلة للحفظ من تلك التي توفر مبادئ استبدال ليزكوف توفر أساساً صارماً لتحقيق هذا الهدف بتحديد قواعد محددة للسلوك البديل، وعندما تطبق بشكل صحيح، تضمن خطة العمل المحلية إمكانية إدخال عناصر جديدة في نظام الثقة، مع الحفاظ على عمقها الصحيح.
Understanding the Liskov Substitution Principle
وقد استحدث باربرا ليزكوف المبدأ الذي يحمل اسمها في ورقة مؤتمر لعام 1987 بعنوان " رد فعل البيانات والهرم " ، وينص التعريف الرسمي على أنه إذا كان لا يزال هناك أي برنامج من نوع " المادة 1 " ، يكون هناك موضوع من النوع " T " ، أي أنه بالنسبة لجميع البرامج المحددة من حيث " T " ، فإن سلوك " P " لا يتغير عندما يحل محل المادة 1 " المادة 2 " ، ثم الجسم " .
ويتجاوز هذا المبدأ التوقيعات البسيطة، ويطالب نظام الأفضليات المعمم بالتوافق السلوكي: يجب ألا يكون للفئة الفرعية نفس الأساليب فحسب، بل أن تتقيد أيضاً بالافتراضات التي يضعها قانون العملاء بشأن طبقة الأساس، ويشمل ذلك الشروط المسبقة (ما يجب أن يكون صحيحاً قبل تسمية طريقة) والشروط اللاحقة (ما يجب أن يكون صحيحاً) والمتغلين (الشروط التي تظل ثابتة طوال عمر الجسم) وعندما يصمم المطورون الأنظمة الفرعية، فهم هذه القيود الأساسية.
A concrete way to think about LSP is the "is-a" relationship. If you claim that a is a , then every function operating on a ] should work changed with a . When the traditional violation is the Rectangle-Square problem, where a extends [5]
الشروط الرئيسية الأربعة لنظام الأفضليات المعمم
ولضمان توافق النموذج الفرعي السلوكي، يفرض نظام الأفضليات المعمم أربعة شروط محددة يجب أن تلبيها طبقات فرعية، وهذه الشروط، المستمدة من مبدأ التصميم حسب العقد، توفر قائمة مرجعية لتقييم التسلسل الهرمي للفئة.
لا يمكن تعزيز الشروط المسبقة
والشرط المسبق هو شرط يجب أن يصمد قبل التذرع بأسلوب طبقة الأساس الذي يسمح بأن يكون البارمتر أي متفجر، وهو طبقة فرعية تقيد ] من البخار الإيجابي تعزز الشرط المسبق، ويمكن أن تمر مدونة العملاء المدونين على طبقة الأساس بمقياس سلبي وتتوقع أن تعمل، ولكن ينبغي أن ترفضها الفئة الفرعية.
لا يمكن إضعاف حالات ما بعد الولادة
وتحدد شروط ما بعد التنفيذ ما تضمنه طريقة طبقة الأساس من قيمة العائد غير المعلن، إذا كانت درجة فرعية تعود أحياناً لاغية تضعف حالة ما بعد التنفيذ، فالكلاء الذين يعتمدون على عقد الطبقة الأساسية سيفشلون في استثناء لا يُذكر، ويجب على الفئات الفرعية أن تكفل أن تكون شروط ما بعد الولادة قوية على الأقل مثل شروط الطبقة الأساسية.
يجب الحفاظ على الغزاة
الغزاة هي ظروف لا تزال سارية طوال حياة الجسم، على سبيل المثال، لدى المتغير الذي يتم دائماً أمر العناصر به، وإذا انتهكت طبقة فرعية ذلك المتغير (مثلاً، بإدراج عنصر خارج النظام)، فإنه يكسر توقعات البرنامج، ويجب على الفئات الفرعية أن تحافظ على جميع المتحولين من طبقة القاعدة، حتى وإن أضافوا سلوكاً جديداً.
قيود التاريخ
فالأوجه لها تاريخ من التغييرات التي تطرأ على الدولة، حيث ينص على أن لا يسمح هذا القطاع بتغيير الدولة التي تمنعها طبقة القاعدة، فعلى سبيل المثال، إذا لم يكن لفئة الأساس ] أي أساليب للمستقرين، أي فئة فرعية تضيف مثبتة تنتهك نظام خدمة الأسرة لأن مدونة العملاء قد تفترض عدم التقيد بها، وكثيرا ما تُغفل قيود التاريخ، ولكنها حرجة عند التعامل مع الأشياء المطروحة في النظم ذات الوجهة.
لماذا "لوس أنجلوس" حرجية بالنسبة للإستنفاد
ويتوقف التوسع على القدرة على إضافة عناصر جديدة دون تعديل العملاء الحاليين، وعندما يشرف نظام التخطيط، تعمل التعددية على النحو المقصود، ويمكن أن تُدمج طبقة فرعية جديدة في مدونة قديمة مع إدخال تغييرات صفرية، مما يقلل من خطر الانحدار ويعجل التنمية، وبدون نظام الأفضليات المعمم، يصبح التسلسل الهرمي في طبقة الأساس هشا، ويجب على المطورين أن يفتشوا كل فئة فرعية لفهم السلوك الخاص، مما يؤدي إلى زيادة البق.
(ب) النظر في نظام يقوم بعمليات الدفع: تحدد درجة الأساس [(FLT:12]) طريقة .() وتطبق الطبقات الفرعية مثل و] الطريقة، وإذا اتبعت جميع الفئات الفرعية نظام LSP، تضيف الجديد مباشرة، ولكن إذا كانت درجة النجاح دون المستوى ترسي استثناء عندما يتجاوز المبلغ.
كما تشجع خطة العمل على التصميم بالعقد، الذي يحسن من الوثائق والاتصال بالفريق، ويمكن للمطورين الاعتماد على مواصفات فئة الأساس دون قراءة كل تطبيق من الدرجة الفرعية، وهذا أمر ذو قيمة خاصة في قواعد البيانات الكبيرة مع العديد من المساهمين، وبالإضافة إلى ذلك، تدعم نظام دعم الشبكة توسيع نطاقها بإتاحة المجال لمسح المكونات لأغراض الأداء أو لأسباب خاصة دون تغيير الهيكل العام.
الانتهاكات المشتركة لخط الأساس المنطقي وكيفية تجنبها
والاعتراف بانتهاكات نظام الأفضليات المعينة أمر أساسي لكتابة نظم قابلة للاستمرار، كما أن هناك أنماطاً متكررة تكسر المبدأ، إلى جانب استراتيجيات لإصلاحها.
مشكلة "ريكانغل سكوير"
وكما ذُكر، فإن نموذج مربع كفئة فرعية من الركود ينتهك نظام الأفضليات المعمم لأن المربع يقيد العرض والطول ليكونا متساوين، ومن الأفضل تصميمه جعل فصول منفصلة من حيث التراجع والمربع تنفذ وصلة مشتركة بينية مشتركة [(]]]، أو استخدام طريقة مصنع تعيد الأشياء المناسبة، وتجنب التسلسل الهرمي للميراث الذي لا يتوافق تماما مع السلوك.
يلقي الدرجة الفرعية استثناءات غير متوقعة
وإذا لم تعلن طريقة طبقة الأساس أي استثناءات، فإن طريقة من الدرجة الفرعية التي تُصدر استثناءً مدقق تنتهك نظام الأفضليات المعمم، بل إن القيام باستثناء غير متحقق مثل يمكن أن يفاجئ الزبائن إذا لم يفعل ذلك قط، وينبغي للطبقات الفرعية أن تكتفي باستثناءات تسمح بها طبقة الأساس، أو لا شيء على الإطلاق، وأن تستخدم استثناءات مدققة، وأن تُستخدم سلوك الاستثناء المستندي في عقد الأساس.
طريقة تجاوز العائدات الضعيفة
(ب) يُسمح بأنواع العودة البديلة بلغات مثل جافا وجيم بـ (ج): (بطريقة من الدرجة الفرعية أن تعود إلى فئة أقل تحديداً) غير أن العكس هو: إعادة شخص أضعف أو أقل تحديداً يبطل العقد، مثلاً إذا عاد طبقة القاعدة إلى فئة ، فإن فئة فرعية تعيد إلى فئة تنتهك نظام الأفضليات والاستحقاقات الأساسية على الأقل.
Subclass Removes Behavior
وفي بعض الأحيان، يلغي أحد الفئات الفرعية طريقة مع هيئة فارغة، ويزيل عملياً وظيفة، وإذا كان الزبون يعتمد على تلك الطريقة التي لها تأثير، فإن السلوك يتغير، مثلاً، الذي يمدد ويتجاوز أن يفعل شيئاً يخالف عقد طبقة الأساس.
تعزيز الشروط المسبقة
ويُنظر إليه عموماً عندما تُقبل الأساليب المفرطة التي تقبل المعايير الاختيارية، وإذا قبلت درجة الأساس ] بالنسبة لمباراة، فإن طبقة فرعية تُلقي استثناءً على تؤدي إلى انتهاك مسبق.() ويُسمح بوثيقة ما إذا كان ويُحتفظ بهذا البدل في جميع الفئات الفرعية ويُعتبر أمراً حاسماً.
لتجنب الانتهاكات، بدءًا بوصلات بينية تحدد الحد الأدنى من السلوكات المركزة، التكوين المفضّل للميراث عندما تكون علاقة "السابقة" مشكوك فيها، برمجة اختبارات العقد التي تتحقق من سلوك القاعدة ودرجة دون المستوى، وتديرها في الاندماج المستمر.
تطبيق نظام الأفضليات المعلَّقة في تصميم النظم
ويتطلب تصميم نظام الأفضليات المعمم التفكير المتعمد في كل من الهيكل والتنفيذ، وهنا مبادئ توجيهية عملية لإدراجها في تدفق العمل الإنمائي.
عقود العقود المبرمة
تحديد فئات أو وصلات بينية أساسية تعبر عن السلوك المتوقع دون التنفيذ، بما في ذلك توثيق الشروط المسبقة، وشروط ما بعد الولادة، والمتحفين، وبلغات تدعم التصميم حسب العقد (مثل إيفل)، يمكنك إنفاذ هذه العقود بصورة تعاقدية، وفي معظم اللغات الرئيسية، تعتمد على الوثائق واختبارات الوحدة.
التكوين على الميراث
عندما لا تكون العلاقة بين الصفين مجرد تركيبة تستخدم، مثلاً بدلاً من أن يكون ممتداً ، يكون لـ درجة [تحت] تحتوي على ذات أبعاد متساوية، وهذا يتجنب انتهاك نظام LSP بشكل كامل.
طقوس اختبارات العقود
إنشاء مجموعة اختبار لفئة الأساس التي يجب أن تمر بها جميع الفئات الفرعية، وينبغي لهذه الاختبارات أن تثبت أن الشروط المسبقة، وشروط ما بعد، والزواحف، مثلا، قد يتحقق اختبار ] من القيمة العائدة إيجابية بالنسبة لأبعاد معينة، ويجب على أي طبقة فرعية أن تمر بنفس الاختبارات لضمان امتثال نظام التعليم العالي، وهذه التقنية، التي كثيرا ما تسمى " الاختبارات الفرعية " ، تحدث انتهاكات في وقت مبكر.
استخدام النموذج الفرعي السلوكي
عندما يرث، اعتبر الجانب السلوكي أولاً، اسأل: "إذا كنت سأستبدل إحدى صفات القاعدة بهذه الدرجة الفرعية، هل سيلاحظ العملاء أي فرق في السلوك؟" إذا كان الجواب نعم، أعيد تصميم الميراث، اتبع مبدأ الأقل مفاجأة.
المُثبِّت عند العثور على الانتهاكات
وأثناء استعراضات الشفرة أو بعد فشل الاختبار، يُعيد ترتيب الهرمية، ويُجرّد السلوك المشترك إلى طبقة قاعدة أو واجهة مُجرّدة، ويُدفع بالسلوك المتخصص إلى فصول منفصلة.
LSP in Modern Programming Languages
وتختلف طريقة تطبيق نظام الأفضليات المعينة بين اللغات بسبب الاختلافات في نظم الطباعة، ونماذج الميراث، ومناولة الاستثناءات، فيما يلي اعتبارات اللغات الشعبية.
Java and C#
(ب) استخدام الوصلات البينية للعقود المجردة وضمان استيفاء الفصول المنفذة لجميع الشروط، كما أن انتهاكات الخطة الاستراتيجية المحلية المذكورة سابقاً (إضعاف الاختلال، وتعزيز الشروط المسبقة) شائعة في جافا وجيم. (ب) استخدام الشروح [(FLT:32]] في جافا أو ]] [الكلمة الرئيسية في C# لتجنب التوقيعات العرضية.
النوع المكشوف
فنظام الطباعة الهيكلي للنوع يجعل نظام الأفضليات المعنوية أكثر أهمية، حيث أن التوافق بين النوعين يقوم على الهيكل وليس على التسلسل الهرمي الاسمي، وهو فصل له نفس الأساليب ولكن السلوك المختلف قد يكون بديلا عمليا وليس سلوكيا، ويجب على المطورين أن يُنفّذوا نظام الأفضليات المعمّلة يدويا عن طريق اختبارات الكتابة وتوثيق العقود.
Python
ويطبع البيتون بصورة دينامية، مما يعني أن انتهاكات نظام الأفضليات المحلية لا تظهر إلا في وقت العمل، وبدون إجراء فحصات على المجمّع، وكتابة اختبارات قوية للوحدة واستخدام فئات الأساس المجردة من نموذج لتحديد الأساليب المطلوبة، ومن الضروري أن يُفترض بالفعل أن يكون لبطة بيتسون أن تكون متسمة باللازمة، وبالتالي فإن الاتساق السلوكي أمر أساسي.
إذهب
ويستخدم النوع الواجهة البينية ضمناً، إذا كان يلبي كل الأساليب، وينفذ نظام الاتصال في غو بفعل أن الوصلات البينية صغيرة ومركزة، ومع ذلك، يكون حذراً: إذا كان نوعان يلبيان نفس الوصلة البينية ولكن يتصرفان بطريقة مختلفة، فإن قانون العملاء الذي يتوقع أن يفشل.
مبادئ LSP وغيرها من مبادئ SOLID
ولا توجد خطة العمل في عزلة، وهي تتفاعل مع المبادئ الأربعة الأخرى المتعلقة بمكافحة شغب الأطفال بطرق هامة.
مبدأ المسؤولية الوحيدة
ويساعد نظام التعليم غير الرسمي على إبقاء الفصول الدراسية مركزة، مما يقلل من فرص انتهاك نظام الأفضليات المعمم.() ومن الأسهل تصنيف فئة ذات مسؤولية واحدة دون تغيير سلوكها عن طريق الخطأ، مثلاً، أن فصل منطق التحقق من تخزين البيانات يجعل القاعدة والطبقات الفرعية أكثر بساطة.
المبدأ المفتوح/المغلق
ويفيد مكتب مراقبة الممتلكات أن الفصول ينبغي أن تكون مفتوحة للتمديد ولكن مغلقة للتعديل، ويتيح برنامج دعم البرامج للفينول الخماسي الكلور من خلال السماح للطبقات الفرعية بتوسيع نطاق السلوك دون تغيير الرمز القائم، وإذا انتُهك نظام الأفضليات المعينة، لا يمكن أن تضيف سراً فروعاً فرعية جديدة دون تغيير العملاء، وبالتالي كسر برنامج العمليات المكلورة، ويرتبط المبدأان ارتباطاً وثيقاً.
مبدأ الفصل بين الأوجه
ويشجع نظام المعلومات الإدارية المتكامل على أن تُقسم الوصلات البينية السمينة إلى سلاسل أصغر حجماً ومحددة، مما يقلل من احتمال أن تنفذ طبقة فرعية أساليب غير ذات صلة، مما يؤدي في كثير من الأحيان إلى انتهاكات نظام الأفضليات المعمم (مثل التنفيذ الفارغ أو الرمي) وتتجنبون، عن طريق تصميم وصلات وصل صغيرة، إجبار الفئات الفرعية على كسر العقود.
مبدأ الإعالة
وتقدم شعبة التحقيقات الجنائية المشورة حسب الخلاصات، وليس العصيان، وعندما تعتمد على الوصلات البينية، تضمن خطة العمل المحلية إمكانية الاستعاضة عن أي تنفيذ ملموس بحرية، وبدون نظام الأفضليات المعلّقة، تصبح طبقة الارتباك غير جديرة بالثقة، وقد يعتمد المطورون على التنفيذ مباشرة، مما ينتهك برنامج العمل الدولي.
اختبار الامتثال لنظام الأفضليات المعلّقة
التحقق من نظام الأفضليات المعمم ليس دائماً صريحاً، ولكن منهجيات الاختبار المنهجي يمكن أن تساعد على الإمساك بالانتهاكات في وقت مبكر، وهنا استراتيجيات لإدماج اختبارات نظام الأفضليات المعلّقة في سير العمل.
إنشاء فئة اختبار عقود القاعدة
(د) كتابة اختبارات على درجة اختبارية أو مجموعة اختبارات مختصرة تمارس عقد الطبقة الأساسية، ولكل شرط مسبق وتأجيلي، كتابة اختبار، مثلاً، إذا كانت طريقة الطبقة الأساسية على تُلقي استثناء عندما يكون الحزمة فارغاً، تتضمن اختباراً يُصدق عليه.
اختبارات استخدام الممتلكات
(لـ(هاسكل (أدوات مثل (سيكيك (لهاسكل متاحة أيضاً بلغات أخرى عن طريق مكتبات مثل [(FLT:37] أو [(FLT:38])) تولد مدخلات عشوائية وتتحقق من أن الغزاة يحتفظون بها، وبالنسبة لـ (LSP) يمكنك أن تعبر عن خصائص مثل: "لأي تسلسل سليم في المكالمات الهاتفية، الدولة بعد أن تنادي بطريقة تتطابق مع سلوك طبقة الأساس"
Behavioral Invariant Enforcement
ويمكن لبعض اللغات أن تسمح بتأكيدات غير متكررة في جافا، ويمكن أن تستخدم كلمة مفتاح أو مكتبة مثل .() وفي C#، أو .() وتتحقق هذه الشيكات من الغزاة والشروط المسبقة أثناء التنمية، وتلحق انتهاكات في وقت مبكر.
أمثلة عالمية حقيقية على برنامج العمل المتعلق بمكافحة التصحر
ويعتمد العديد من المكتبات والأطر الموحدة على نظام الأفضليات المعمم على العمل بشكل صحيح، ويعمق فهم هذه الأمثلة تقدير المبدأ.
إطار جمعيات جوا
ويحدد الواجهة السلوك الواجب جمعه، ويعرف الصنف الفرعي مثل [(FLT:44]، ، و[الرمز القانوني: LLT]، ويلتزم الجميع بعقد الوصل البيني، ويدعمون ، ، ، وما إلى ذلك، التنفيذ الجديد.
Database Access Layers
وعند تنفيذ مستودعات قواعد البيانات، تحدد واجهة أساسية ] أساليب مثل و.() وتطبق التنفيذ الدقيق لنظام ميسكول (MeSQL) والبريدي SQL، والتخزين داخل الذاكرة العقد نفسه، وتكفل الخطة الاستراتيجية المحلية أن لا يغير تبادل قاعدة البيانات الأساسية منطق التطبيق، وهذا أمر أساسي للقابلية للاختبار والمرونة.
تبسيط عمليات الخط
وفي البرمجة الوظيفية، تحدد العقود التحولات على المجاري (مثل الخريطة، والمرشح، والتقليل) ويجب أن تكون أي وظيفة تُنقل إلى ] تحولا نقيا يحافظ على متغير التيار (مثلا، لا يعدل الوضع الخارجي) وهذا نظام لازم يطبق على وضع الإطار الفرعي الوظيفي: يحدد نوع الوظيفة عقدا، ويجب أن تفي به التنفيذات.
خاتمة
فمشروع ليزكوف البديل هو أكثر من مفهوم نظري - وهو أداة عملية لتصميم برامجيات قابلة للاستمرار ومصنوعة من الصيانة - من خلال ضمان أن تكون الفئات الفرعية في صفوف قاعدتها دون تغيير السلوك الصحيح، وبناء المطورين لنظم تنمو عضوية مع سمات جديدة، والتقيد بنظام الأفضليات المحلية يخفض حشرات التكامل ويحسن وضوح الشفرة ويتوافق مع الفلسفة الأوسع نطاقاً في إطار برنامج التنمية المستدامة.
تطبيق نظام الأفضليات المعينة تطبيقاً فعالاً، والتركيز على العقود السلوكية، وكتابة اختبارات شاملة، واستخدام التكوين عند الشعور بالإكراه، والاعتراف بالشروط الأربعة، وشروط ما بعد، والتجار، والقيود على التاريخ - كإجراءات تفتيش لكل طبقة فرعية جديدة، وببذل العناية، يصبح نظام الأفضليات المعينة جزءاً طبيعياً من عملية تصميمك، مما يؤدي إلى هياكل مرنة وقابلة للتكيف.
For further reading, explore Barbara Liskov’s original paper (Data Abstraction and Hierarchy), Robert C. Martin’s discussion of SOLID principles], and Martin Fowler’s article on substitutability.