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

Catania poliklinikasida Apple tomoshabin bilan kengaytirilgan haqiqatga innovatsion aralashuv

Kataniya poliklinikasida Apple Vision Pro tijorat ko‘rish vositasi yordamida oftalmoplastika operatsiyasi o‘tkazildi...

3 may 2024

Bolalar uchun sahifalarni bo'yashning afzalliklari - barcha yoshdagilar uchun sehrli dunyo

Rang berish orqali nozik vosita ko'nikmalarini rivojlantirish bolalarni yozish kabi murakkabroq ko'nikmalarga tayyorlaydi. Rang berish uchun…

2 may 2024

Kelajak bu yerda: Yuk tashish sanoati global iqtisodiyotni qanday inqilob qilmoqda

Harbiy dengiz sektori 150 milliardlik bozorga yo'l olgan haqiqiy global iqtisodiy kuchdir...

1 may 2024

Noshirlar va OpenAI sun'iy intellekt tomonidan qayta ishlangan ma'lumotlar oqimini tartibga solish bo'yicha shartnomalar imzolaydilar.

O'tgan dushanba kuni Financial Times OpenAI bilan shartnoma imzolaganini e'lon qildi. FT o'zining jahon darajasidagi jurnalistikasini litsenziyalaydi...

30 Aprel 2024