Qo'llanma

Liskovni almashtirish printsipi, uchinchi SOLID printsipi

Bolalar sinflari hech qachon darslarga ta'sir qilmasligi yoki o'zgartirmasligi kerak defiota-sinf turiga oid bayonotlar.

Ushbu tamoyil kontseptsiyasini Barbara Liskov 1987 yilgi konferentsiyaning asosiy ma'ruzasida kiritgan va keyinchalik 1994 yilda Jannette Wing bilan birgalikda maqolada nashr etilgan. Ularning defiasl nusxasi quyidagicha:

Q (x) T tipidagi x ob'ektlar uchun namoyish etiladigan xususiyat bo'lsin. Keyin q (y) S turdagi y ob'ektlar uchun namoyish etilishi kerak, bu erda S T ning kichik turi hisoblanadi.

Keyinchalik, Robert C. Martinning SOLID tamoyillari o'zining Agile Software Development, Principles, Patterns va Practices kitobida nashr etilishi va keyin C# tilidagi Agile Principles, Patterns va Practices kitobining C# versiyasida qayta nashr etilishi bilan, defiLiskov almashtirish printsipi sifatida tanildi.

Bu bizni olib keladi defiRobert C. Martin tomonidan berilgan ma'lumotlar: Subtiplar ularning asosiy turlari bilan almashtirilishi kerak.

Oddiyroq qilib aytganda, subklass ota-ona sinfining usullarini mijoz nuqtai nazaridan funksionallikni buzmaydigan tarzda bekor qilishi kerak. Kontseptsiyani namoyish etish uchun oddiy bir misol.

sinfdagi transport vositasi {

    startEngine () funktsiyasi {

        // Dvigatelning standart ishga tushirish funktsiyasi

    }

 

    funktsiyani tezlashtirish () {

        // Standart tezlashtirish funktsiyasi

    }

}

Avtomobil sinfini hisobga olgan holda - bu mavhum bo'lishi mumkin - va ikkita dastur:

Class Car avtoulovni kengaytiradi {

    startEngine () funktsiyasi {

        $ this-> engageIgnition ();

        ota-ona :: startEngine ();

    }

 

    xususiy funktsiya engageIgnition () {

        // Ateşleme tartibi

    }

}

 

ElectricBus klassi transport vositasini kengaytiradi {

    funktsiyani tezlashtirish () {

        $ this-> oshirishVoltage ();

        $ this-> connectIndividualEngines ();

    }

 

    xususiy funktsiyani oshirishVoltage () {

        // Elektr mantiqi

    }

 

    xususiy funktsiya connectIndividualEngines () {

        // Ulanish mantiqi

    }

}

sinf haydovchisi {

    function go (Avtomobil $ v) {

        $ v-> startEngine ();

        $ v-> tezlashtirish ();

    }

}

Mijozlar sinfi, agar u transport vositasidan foydalana olsa, ikkalasidan ham foydalanishi kerak.

Bu bizni OCP-da ishlatganimiz uchun Andoza usulini yaratish naqshini oddiy bajarilishiga olib keladi.

Sizni ikkinchi SOLID printsipi ham qiziqtirishi mumkin: https: //bloginnovazione.uz / ochiq-yopiq-ikkinchi-qattiq-tamoyil / 3906 /

Ochiq / yopiq printsipi bo'yicha avvalgi tajribamizga asoslanib, biz Liskovni almashtirish printsipi OCP bilan chambarchas bog'liq degan xulosaga kelishimiz mumkin. Darhaqiqat, "LSP qoidalarini buzish OCP ning yashirin buzilishi" (Robert C. Martin) va Shablon uslubini loyihalashtirish namunasi LSPni hurmat qilish va amalga oshirishning klassik namunasidir, bu esa o'z navbatida, bunga rioya qilishning echimlaridan biridir OCP bilan.

LSP qoidalarini buzish misoli

to'rtburchak sinf {

    xususiy $ topLeft;

    xususiy $ kengligi;

    xususiy $ balandligi;

 

    jamoat funktsiyasi setHeight ($ height) {

        $ this-> height = $ height;

    }

 

Innovatsion axborot byulleteni
Innovatsiyalar haqidagi eng muhim yangiliklarni o'tkazib yubormang. Ularni elektron pochta orqali olish uchun ro'yxatdan o'ting.

    jamoat funktsiyasi getHeight () {

        return $ this-> height;

    }

 

    jamoat funktsiyasi setWidth ($ width) {

        $ this-> width = $ width;

    }

 

    jamoat funktsiyasi getWidth () {

        return $ this-> width;

    }

}

Asosiy geometrik shakl, to'rtburchakdan boshlaymiz. Bu shunchaki kenglik va balandlik uchun o'rnatuvchi va qidiruvchilarga ega oddiy ma'lumotlar ob'ekti. Tasavvur qiling, bizning dasturimiz ishlaydi va allaqachon bir nechta mijozlarga joylashtirilgan. Endi ularga yangi xususiyat kerak. Ular kvadratchalar bilan ishlashga qodir bo'lishi kerak.

Haqiqiy hayotda geometriyada kvadrat to'rtburchakning ma'lum bir shakli hisoblanadi. Shunday qilib, biz to'rtburchaklar sinfini kengaytiradigan Square sinfini amalga oshirishga urinishimiz mumkin. Tez-tez aytadiki, bolalar sinfi ota-ona sinfidir va bu ibora ham hech bo'lmaganda birinchi qarashda LSP ga mos keladi.

Kvadrat to'rtburchakni kengaytiradi {

    jamoat funktsiyasi setHeight ($ value) {

        $ this-> width = $ value;

        $ this-> height = $ value;

    }

 

    jamoat funktsiyasi setWidth ($ value) {

        $ this-> width = $ value;

        $ this-> height = $ value;

    }

}

Kvadrat - bu kengligi va balandligi teng bo'lgan to'rtburchak va biz oldingi misolda bo'lgani kabi g'alati dasturni amalga oshirishimiz mumkin. Ham balandlik, ham kenglikni o'rnatish uchun ikkala o'rnatuvchini bekor qilishimiz mumkin. Ammo bu mijoz kodiga qanday ta'sir qiladi?

sinf mijozi {

    function areaVerifier (To'rtburchak $ r) {

        $ r-> setWidth (5);

        $ r-> setHeight (4);

        agar ($ r-> maydon ()! = 20) {

            yangi istisno ('Yomon maydon!');

        }

        haqiqiy qaytish;

    }

}

To'rtburchakning maydonini tekshiradigan va agar u noto'g'ri bo'lsa, istisno qiladigan mijozlar sinfiga ega bo'lish mumkin.

funktsiya maydoni () {

    return $ this-> width * $ this-> height;

}

Biz maydonni ta'minlash uchun yuqoridagi usulni to'rtburchaklar sinfimizga qo'shdik.

LspTest sinfi PHPUnit_Framework_TestCase-ni kengaytiradi {

    funktsiya testRectangleArea () {

        $ r = yangi to'rtburchak ();

        $ c = yangi mijoz ();

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

    }

}

Va biz maydonni tekshirgichga bo'sh to'rtburchak ob'ektni yuborish orqali oddiy test yaratdik va test o'tadi. Bizning sinfimiz maydoni bo'lsa defiTo'g'ri ishlangan bo'lsa, uni Mijozning areaVerifier() ga yuborish uning funksionalligini buzmasligi kerak. Axir, kvadrat har qanday matematik ma'noda to'rtburchakdir. Lekin bu bizning sinfimizmi?

funktsiyasi testSquareArea () {

    $ r = yangi kvadrat ();

    $ c = yangi mijoz ();

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

}

Shunday qilib, bizning Square sinfimiz to'rtburchak emas. Bu geometriya qonunlarini buzadi. U muvaffaqiyatsizlikka uchraydi va Liskov almashtirish tamoyilini buzadi.

Ercole Palmeri

Innovatsion axborot byulleteni
Innovatsiyalar haqidagi eng muhim yangiliklarni o'tkazib yubormang. Ularni elektron pochta orqali olish uchun ro'yxatdan o'ting.

So'nggi maqolalar

Veeam to'lov dasturini himoya qilishdan tortib javob berish va tiklashgacha bo'lgan eng keng qamrovli yordamga ega

Veeam tomonidan ishlab chiqarilgan Coveware kiber tovlamachilik hodisalariga javob berish xizmatlarini taqdim etishda davom etadi. Coveware sud tibbiyoti va remediatsiya imkoniyatlarini taklif qiladi ...

23 Aprel 2024

Yashil va raqamli inqilob: prognozli texnik xizmat ko'rsatish neft va gaz sanoatini qanday o'zgartirmoqda

Bashoratli texnik xizmat ko'rsatish zavodlarni boshqarishga innovatsion va proaktiv yondashuv bilan neft va gaz sektorini inqilob qilmoqda.…

22 Aprel 2024

Buyuk Britaniyaning monopoliyaga qarshi regulyatori GenAI ustidan BigTech signalini oshiradi

Buyuk Britaniya CMA Big Tech kompaniyasining sun'iy intellekt bozoridagi xatti-harakatlari haqida ogohlantirish e'lon qildi. U yerda…

18 Aprel 2024

Casa Green: Italiyada barqaror kelajak uchun energiya inqilobi

Evropa Ittifoqi tomonidan binolarning energiya samaradorligini oshirish uchun ishlab chiqilgan "Yashil uylar" qarori qonunchilik jarayonini yakunladi ...

18 Aprel 2024