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.
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 ();
}
}
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.
to'rtburchak sinf {
xususiy $ topLeft;
xususiy $ kengligi;
xususiy $ balandligi;
jamoat funktsiyasi setHeight ($ height) {
$ this-> height = $ height;
}
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;
}
}
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
Veeam tomonidan ishlab chiqarilgan Coveware kiber tovlamachilik hodisalariga javob berish xizmatlarini taqdim etishda davom etadi. Coveware sud tibbiyoti va remediatsiya imkoniyatlarini taklif qiladi ...
Bashoratli texnik xizmat ko'rsatish zavodlarni boshqarishga innovatsion va proaktiv yondashuv bilan neft va gaz sektorini inqilob qilmoqda.…
Buyuk Britaniya CMA Big Tech kompaniyasining sun'iy intellekt bozoridagi xatti-harakatlari haqida ogohlantirish e'lon qildi. U yerda…
Evropa Ittifoqi tomonidan binolarning energiya samaradorligini oshirish uchun ishlab chiqilgan "Yashil uylar" qarori qonunchilik jarayonini yakunladi ...