Почетен курс

Принцип на замена на Лисков, трет принцип на СОЛИД

Часовите за деца никогаш не треба да влијаат или менуваат лес defiискази од типот на матичната класа.

Концептот на овој принцип беше воведен од Барбара Лисков во воведниот говор на конференцијата во 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 може да моделира ДНК, РНК и „сите молекули на животот“

Google DeepMind воведува подобрена верзија на својот модел за вештачка интелигенција. Новиот подобрен модел обезбедува не само…

9 мај 2024

Истражување на модуларната архитектура на Ларавел

Ларавел, познат по својата елегантна синтакса и моќните карактеристики, исто така обезбедува цврста основа за модуларна архитектура. Таму…

9 мај 2024

Cisco Hypershield и стекнување на Splunk Започнува новата ера на безбедност

Cisco и Splunk им помагаат на клиентите да го забрзаат своето патување до Центарот за безбедносни операции (SOC) на иднината со…

8 мај 2024

Надвор од економската страна: неочигледната цена на откупниот софтвер

Ransomware доминира во вестите во последните две години. Повеќето луѓе се свесни дека нападите…

6 мај 2024

Иновативна интервенција во зголемена реалност, со гледач на Apple во поликлиниката Катанија

Операција на офталмопластика со помош на комерцијалниот прегледувач на Apple Vision Pro беше извршена во поликлиниката Катанија…

3 мај 2024

Придобивките од боење страници за деца - свет на магија за сите возрасти

Развивањето на фини моторни вештини преку боење ги подготвува децата за посложени вештини како пишување. Да обои…

2 мај 2024

Иднината е тука: Како бродската индустрија ја револуционизира глобалната економија

Поморскиот сектор е вистинска глобална економска сила, која навигираше кон пазар од 150 милијарди ...

1 мај 2024

Издавачите и OpenAI потпишуваат договори за регулирање на протокот на информации обработени од вештачката интелигенција

Минатиот понеделник, Financial Times објави договор со OpenAI. ФТ го лиценцира своето новинарство од светска класа…

Април 30 2024

Читајте иновации на вашиот јазик

Билтен за иновации
Не пропуштајте ги најважните вести за иновациите. Пријавете се за да ги добивате по е-пошта.

Следете нас