البرنامج التعليمي

مبدأ استبدال Liskov ، مبدأ SOLID الثالث

يجب ألا تؤثر فصول الأطفال أبدًا أو تعدل على les defiبيانات من نوع الفئة الأصل.

تم تقديم مفهوم هذا المبدأ من قبل باربرا ليسكوف في خطاب رئيسي في مؤتمر عام 1987 ونشر لاحقًا في ورقة مع جانيت وينج في عام 1994. defiنشوئها الأصلي كما يلي:

لنفترض أن q (x) خاصية يمكن إثباتها على الكائنات x من النوع T. ثم يجب إثبات q (y) للكائنات y من النوع S حيث S هو نوع فرعي من T.

في وقت لاحق ، مع نشر مبادئ روبرت سي مارتن SOLID في كتابه Agile Software Development والمبادئ والأنماط والممارسات ثم أعيد نشره في الإصدار C # من كتاب Agile Principles، Patterns، and Practices in C # ، defiأصبح يُعرف باسم مبدأ استبدال ليسكوف.

هذا يقودنا إلى defiالمعلومات التي قدمها روبرت سي مارتن: يجب استبدال الأنواع الفرعية بأنواعها الأساسية.

بشكل أكثر بساطة ، يجب أن تتجاوز الفئة الفرعية طرق الفئة الأصلية بطريقة لا تؤدي إلى تعطيل الوظائف من وجهة نظر العميل. هنا مثال بسيط لتوضيح المفهوم.

فئة مركبة {

    وظيفة startEngine () {

        // وظيفة بدء تشغيل المحرك الافتراضية

    }

 

    تسريع الوظيفة () {

        // وظيفة التسريع الافتراضية

    }

}

إعطاء فئة مركبة - يمكن أن تكون مجردة - وتطبيقان:

فئة السيارة تمتد السيارة {

    وظيفة startEngine () {

        $ this-> Engagement ()؛

        الوالد :: startEngine () ؛

    }

 

    وظيفة خاصة engIgnition () {

        // إجراء الإشعال

    }

}

 

فئة ElectricBus تمد السيارة {

    تسريع الوظيفة () {

        $ this-> زيادة الجهد ()؛

        $ this-> connectIndividualEngines ()؛

    }

 

    زيادة الوظيفة الخاصةVoltage () {

        // المنطق الكهربائي

    }

 

    وظيفة خاصة connectIndividualEngines () {

        // منطق الاتصال

    }

}

سائق فئة {

    وظيفة go (مركبة $ v) {

        $ v-> startEngine () ؛

        $ v-> تسريع ()؛

    }

}

يجب أن تكون فئة العملاء قادرة على استخدام كليهما إذا كان بإمكانها استخدام السيارة.

وهو ما يقودنا إلى تنفيذ بسيط لنموذج تصميم أسلوب النموذج كما استخدمناه في OCP.

قد تكون مهتمًا أيضًا بمبدأ SOLID الثاني: https: //bloginnovazione.ar / فتح-مغلق-ثاني-صلب-مبدأ / 3906 /

بناءً على تجربتنا السابقة مع مبدأ Open / Closed ، يمكننا أن نستنتج أن مبدأ استبدال Liskov وثيق الصلة بـ OCP. في الواقع ، "يعد انتهاك LSP انتهاكًا كامنًا لـ OCP" (Robert C. Martin) ، ونمط تصميم أسلوب النموذج هو مثال كلاسيكي للامتثال وتنفيذ LSP ، والذي يعد بدوره أحد الحلول للامتثال أيضًا مع OCP.

مثال على انتهاك LSP

فئة مستطيل {

    خاص $ topLeft؛

    عرض $ خاص؛

    ارتفاع دولار خاص ؛

 

    تعيين الوظيفة العامةالارتفاع (ارتفاع دولار) {

        $ this-> الارتفاع = الارتفاع بالدولار ؛

    }

 

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

    وظيفة عامة getHeight () {

        إرجاع $ this-> height؛

    }

 

    عرض تعيين الوظيفة العامة (عرض دولار) {

        $ this-> width = $ width؛

    }

 

    وظيفة عامة getWidth () {

        إرجاع $ this-> width؛

    }

}

لنبدأ بشكل هندسي أساسي ، مستطيل. إنه مجرد كائن بيانات بسيط به محددات ومعرفة للعرض والارتفاع. تخيل أن تطبيقنا يعمل وتم نشره بالفعل على العديد من العملاء. الآن هم بحاجة إلى ميزة جديدة. يجب أن يكونوا قادرين على التلاعب بالمربعات.

في الحياة الواقعية ، في الهندسة ، المربع هو شكل معين من أشكال المستطيل. لذا يمكننا محاولة تطبيق فئة مربعة توسع فئة المستطيل. غالبًا ما يُقال أن فئة الأطفال هي فئة الأصل ، وهذا التعبير يتوافق أيضًا مع LSP ، على الأقل للوهلة الأولى.

يمتد مربع فئة المستطيل {

    مجموعة الوظائف العامةالارتفاع (القيمة بالدولار) {

        $ this-> width = $ value؛

        $ this-> الارتفاع = القيمة بالدولار ؛

    }

 

    عرض تعيين الوظيفة العامة (القيمة بالدولار) {

        $ this-> width = $ value؛

        $ this-> الارتفاع = القيمة بالدولار ؛

    }

}

المربع هو مستطيل متساوي العرض والارتفاع ويمكننا القيام بتنفيذ غريب كما في المثال السابق. يمكننا تجاوز كلا المستوطنين لضبط الطول والعرض. ولكن كيف سيؤثر ذلك على كود العميل؟

عميل فئة {

    وظيفة areaVerifier (مستطيل $ r) {

        $ r-> setWidth (5) ؛

        $ r-> setHeight (4) ؛

        إذا ($ r-> area ()! = 20) {

            رمي استثناء جديد ("منطقة سيئة!") ؛

        }

        عودة صحيح؛

    }

}

من المتصور أن يكون لديك فئة عميل تقوم بفحص منطقة المستطيل وتلقي استثناءً إذا كانت خاطئة.

منطقة الوظيفة () {

    إرجاع $ this-> width * $ this-> height؛

}

من الواضح أننا أضفنا الطريقة المذكورة أعلاه إلى فئة المستطيل لدينا لتوفير المساحة.

تمدد فئة LspTest PHPUnit_Framework_TestCase {

    اختبار الوظيفة RectangleArea () {

        $ r = مستطيل جديد () ؛

        $ c = عميل جديد () ؛

        $ this-> assertTrue ($ c-> areaVerifier ($ r)) ؛

    }

}

وقمنا بإنشاء اختبار بسيط عن طريق إرسال كائن مستطيل فارغ إلى مدقق المنطقة ويجتاز الاختبار. إذا كانت ساحة الفصل لدينا defiبشكل صحيح ، إرساله إلى منطقة العميل يجب ألا يكسر Verifier () وظائفه. بعد كل شيء ، المربع هو مستطيل بكل معنى الكلمة. لكن هل هو صفنا؟

اختبار الوظيفة SquareArea () {

    $ r = مربع جديد () ؛

    $ c = عميل جديد () ؛

    $ this-> assertTrue ($ c-> areaVerifier ($ r)) ؛

}

لذا، ففئتنا المربعة ليست مستطيلة على الإطلاق. إنه يكسر قوانين الهندسة. إنه يفشل وينتهك مبدأ استبدال ليسكوف.

Ercole Palmeri

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

المقالات الأخيرة

فوائد صفحات التلوين للأطفال - عالم السحر لجميع الأعمار

إن تطوير المهارات الحركية الدقيقة من خلال التلوين يؤهل الأطفال لمهارات أكثر تعقيدًا مثل الكتابة. للتلوين…

2 مايو 2024

المستقبل هنا: كيف تُحدث صناعة الشحن ثورة في الاقتصاد العالمي

يعد القطاع البحري قوة اقتصادية عالمية حقيقية، وقد اتجه نحو سوق يبلغ حجمه 150 مليارًا...

1 مايو 2024

يوقع الناشرون وOpenAI اتفاقيات لتنظيم تدفق المعلومات التي تتم معالجتها بواسطة الذكاء الاصطناعي

أعلنت صحيفة فاينانشيال تايمز يوم الاثنين الماضي عن صفقة مع OpenAI. "فاينانشيال تايمز" ترخص صحافتها ذات المستوى العالمي...

أبريل 30 2024

المدفوعات عبر الإنترنت: إليك كيف تجعلك خدمات البث تدفع إلى الأبد

يدفع الملايين من الأشخاص مقابل خدمات البث، ويدفعون رسوم الاشتراك الشهرية. من الشائع أنك…

أبريل 29 2024

اقرأ الابتكار بلغتك

النشرة الإخبارية
لا تفوّت أهم أخبار الابتكار. قم بالتسجيل لتلقيهم عن طريق البريد الإلكتروني.

تابعنا