Концептот на овој принцип беше воведен од Барбара Лисков во воведниот говор на конференцијата во 1987 година, а подоцна беше објавен во труд заедно со Џенет Винг во 1994 година. defiоригиналната верзија е како што следува:
Нека q (x) биде докажано својство на предметите x од типот T. Тогаш q (y) треба да се докаже за објектите од типот S каде што S е подтип на Т.
Последователно, со објавувањето на Цврсти принципи на Роберт К. Мартин во неговата книга Агилен развој на софтвер, принципи, модели и практики, а потоа повторно објавена во C# верзијата на книгата Агилни принципи, модели и практики во C#, defiција стана познат како принцип на замена на Лисков.
Ова нè доведува до defiинформации дадени од Роберт К. Мартин: Подтиповите мора да бидат заменливи со нивните основни типови.
возило од класа {
функција startEngine () {
// Стандардна функционалност за стартување на моторот
}
функција забрза () {
// Стандардна функционалност за забрзување
}
}
Со оглед на класа на возило - може да биде апстрактно - и две имплементации:
класа Автомобил продолжува возило {
функција startEngine () {
$ ова-> ангажирањеIgnition ();
родител :: startEngine ();
}
приватна функција EngIgnition () {
// Постапка на палење
}
}
класа ElectricBus го проширува возилото {
функција забрза () {
$ ова-> зголемување на напон ();
$ this-> connectIndividualEngines ();
}
зголемување на приватната функцијаНапон () {
// Електрична логика
}
приватна функција ConnectIndividualEngines () {
// Логика за поврзување
}
}
класа возач {
функција оди (возило $ v) {
$ v-> startEngine ();
$ v-> забрза ();
}
}
Што нè носи до едноставна имплементација на Шаблонот за дизајн на моделот на шаблон, како што го користевме во OCP.
Можеби ќе ве интересира и вториот СОЛИД принцип: https: //bloginnovazione.en / open-closed-second-solid-principle / 3906 /
Врз основа на нашето претходно искуство со принципот Отворено / затворено, можеме да заклучиме дека принципот на замена на Лисков е тесно поврзан со ОПП. Всушност, „кршењето на ЛСП е латентно кршење на ОЦП“ (Роберт Ц. Мартин), а Шаблонот за дизајн на моделот е класичен пример за почитување и имплементација на ЛСП, што пак е едно од решенијата исто така да се усогласи со OCP.
класа правоаголник {
приватна $ topLeft;
приватна ширина $;
приватна висина $;
јавна функција во собата Висина ($ висина) {
$ ова-> висина = $ висина;
}
јавна функција getHeight () {
вратете $ ова-> висина;
}
јавна функција поставена Ширина ($ ширина) {
$ ова-> ширина = $ ширина;
}
јавна функција getWidth () {
вратете $ ова-> ширина;
}
}
Да почнеме со основна геометриска форма, правоаголник. Тоа е само едноставен податочен објект со поставувачи и приемници за ширина и висина. Замислете дека нашата апликација работи и е веќе распоредена на неколку клиенти. Сега им треба нова опција. Тие мора да бидат во можност да манипулираат со плоштадите.
Во реалниот живот, во геометријата, квадрат е одредена форма на правоаголник. Значи, би можеле да се обидеме да имплементираме класа Square која се протега на класа Rectangle. Често се вели дека часот за деца е родителска класа, и овој израз исто така одговара на LSP, барем на прв поглед.
класа Плоштад се протега на правоаголник {
јавна функција во собата Висина ($ вредност) {
$ ова-> ширина = $ вредност;
$ ова-> висина = вредност од $;
}
јавна функција поставена Ширина ($ вредност) {
$ ова-> ширина = $ вредност;
$ ова-> висина = вредност од $;
}
}
Квадрат е правоаголник со еднаква ширина и висина и можеме да направиме чудна имплементација како во претходниот пример. Можеме да ги замениме и двата поставувачи за да поставиме висина и ширина. Но, како ова ќе влијае на кодот на клиентот?
клиент за класа {
област за функции Верификатор (правоаголник $ r) {
$ r-> setWidth (5);
$ r-> setHeight (4);
ако ($ r-> област ()! = 20) {
фрли нов Исклучок ('Лоша област!');
}
вратете се вистинито;
}
}
област на функција () {
вратете $ ова-> ширина * $ ова-> висина;
}
Ние очигледно го додадовме горенаведениот метод во нашата класа Правоаголник за да ја обезбедиме областа.
класата LspTest ја проширува PHPUnit_Framework_TestCase {
тест на функцијатаRectangleArea () {
$ r = нов правоаголник ();
$ c = нов клиент ();
$ this-> assertTrue ($ c-> areaVerifier ($ r));
}
}
И создадовме едноставен тест со испраќање празен правоаголен објект до проверката на областа и тестот поминува. Ако нашата класа Плоштад е defiправилно, испраќајќи го во областа на клиентотVerifier() не треба да ја наруши неговата функционалност. На крајот на краиштата, квадрат е правоаголник во секоја математичка смисла. Но, дали е тоа наша класа?
тест на функцијаSquareArea () {
$ r = нов плоштад ();
$ c = нов клиент ();
$ this-> assertTrue ($ c-> areaVerifier ($ r));
}
Значи, нашата класа Квадрат сепак не е правоаголник. Ги крши законите на геометријата. Тоа пропаѓа и го нарушува принципот на замена на Лисков.
Ercole Palmeri
Google DeepMind воведува подобрена верзија на својот модел за вештачка интелигенција. Новиот подобрен модел обезбедува не само…
Ларавел, познат по својата елегантна синтакса и моќните карактеристики, исто така обезбедува цврста основа за модуларна архитектура. Таму…
Cisco и Splunk им помагаат на клиентите да го забрзаат своето патување до Центарот за безбедносни операции (SOC) на иднината со…
Ransomware доминира во вестите во последните две години. Повеќето луѓе се свесни дека нападите…
Операција на офталмопластика со помош на комерцијалниот прегледувач на Apple Vision Pro беше извршена во поликлиниката Катанија…
Развивањето на фини моторни вештини преку боење ги подготвува децата за посложени вештини како пишување. Да обои…
Поморскиот сектор е вистинска глобална економска сила, која навигираше кон пазар од 150 милијарди ...
Минатиот понеделник, Financial Times објави договор со OpenAI. ФТ го лиценцира своето новинарство од светска класа…