Водич

Принцип замене Лискова, трећи ЧВРСТИ принцип

Дечје класе никада не би требало да утичу на датотеке или да их мењају defiискази типа родитељске класе.

Концепт овог принципа увела је Барбара Лисков на конференцији 1987. и касније објављена у раду заједно са Јаннетте Винг 1994. године. defiоригинална ција је следећа:

Нека је к (к) доказљиво својство на објектима к типа Т. Тада би к (и) требало да буде доказљиво за објекте и типа С где је С подтип Т.

Након тога, са објављивањем СОЛИД принципа Роберта Ц. Мартина у његовој књизи Агиле Софтваре Девелопмент, Принциплес, Паттернс, анд Працтицес, а затим поново објављеном у Ц# верзији књиге Агиле Принциплес, Паттернс, анд Працтицес ин Ц#, defiција је постала позната као принцип замене Лискова.

Ово нас доводи до defiинформације које је дао Роберт Ц. Мартин: Подтипови морају бити заменљиви основним типовима.

Једноставније, поткласа треба да замени методе родитељске класе на начин који не нарушава функционалност са становишта купца. Ево једноставног примера за демонстрацију концепта.

цласс Вехицле {

    функција стартЕнгине () {

        // Подразумевана функционалност покретања мотора

    }

 

    функција аццелерате () {

        // Подразумевана функционалност убрзања

    }

}

С обзиром на класу возила - може бити апстрактна - и две примене:

класа Цар продужује возило {

    функција стартЕнгине () {

        $ тхис-> енгаггнитион ();

        родитељ :: стартЕнгине ();

    }

 

    приватна функција енгаИгнитион () {

        // Поступак паљења

    }

}

 

класа ЕлецтрицБус проширује возило {

    функција аццелерате () {

        $ ово-> повећајВолтаге ();

        $ тхис-> цоннецтИндивидуалЕнгинес ();

    }

 

    приватна функција повећањеВолтаге () {

        // Електрична логика

    }

 

    приватна функција цоннецтИндивидуалЕнгинес () {

        // Логика везе

    }

}

цласс Дривер {

    функција го (возило $ в) {

        $ в-> стартЕнгине ();

        $ в-> убрзати ();

    }

}

Клијентска класа би требало да може да користи и једно и друго ако може да користи возило.

Што нас доводи до једноставне примене обрасца дизајна методе предлошка какав смо користили у ОЦП-у.

Можда ће вас занимати и други СОЛИД принцип: хттпс://bloginnovazione.ен / отворено-затворено-други-принцип-чврсто / 3906 /

На основу нашег претходног искуства са отвореним / затвореним принципом, можемо закључити да је Лисков принцип замене уско повезан са ОЦП. У ствари, „кршење ЛСП-а представља латентно кршење ОЦП-а“ (Роберт Ц. Мартин), а образац дизајна шаблона методе класичан је пример поштовања и примене ЛСП-а, што је заузврат једно од решења за усклађивање са ОЦП.

Пример кршења ЛСП

цласс Рецтангле {

    привате $ топЛефт;

    привате $ видтх;

    привате $ хеигхт;

 

    јавна функција сетХеигхт ($ хеигхт) {

        $ ово-> висина = $ висина;

    }

 

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

    јавна функција гетХеигхт () {

        ретурн $ тхис-> хеигхт;

    }

 

    јавна функција сетВидтх ($ видтх) {

        $ тхис-> видтх = $ видтх;

    }

 

    јавна функција гетВидтх () {

        ретурн $ тхис-> видтх;

    }

}

Почнимо са основним геометријским обликом, правоугаоником. То је само једноставан објект података са сеттерима и геттерима за ширину и висину. Замислите да наша апликација ради и да је већ постављена на неколико клијената. Сада им је потребна нова карактеристика. Морају бити у стању да манипулишу квадратима.

У стварном животу, у геометрији, квадрат је одређени облик правоугаоника. Тако бисмо могли покушати да имплементирамо класу Скуаре која проширује класу Рецтангле. Често се каже да је класа дете родитељска класа, а овај израз такође одговара ЛСП, бар на први поглед.

цласс Скуаре ектендс Рецтангле {

    јавна функција сетХеигхт ($ валуе) {

        $ тхис-> видтх = $ валуе;

        $ ово-> висина = $ вредност;

    }

 

    јавна функција сетВидтх ($ валуе) {

        $ тхис-> видтх = $ валуе;

        $ ово-> висина = $ вредност;

    }

}

Квадрат је правоугаоник једнаке ширине и висине и могли бисмо да изведемо необичну примену као у претходном примеру. Могли бисмо да заменимо оба сетера да подесимо и висину и ширину. Али како ће ово утицати на клијентски код?

цласс Цлиент {

    фунцтион ареаВерифиер (правоугаоник $ р) {

        $ р-> сетВидтх (5);

        $ р-> сетХеигхт (4);

        иф ($ р-> ареа ()! = 20) {

            баци нови изузетак ('Лоше подручје!');

        }

        ретурн труе;

    }

}

Замишљено је да постоји клијентска класа која проверава површину правоугаоника и даје изузетак ако је погрешан.

област функције () {

    ретурн $ тхис-> видтх * $ тхис-> хеигхт;

}

Очигледно смо додали горњу методу у нашу класу Рецтангле да бисмо обезбедили подручје.

класа ЛспТест проширује ПХПУнит_Фрамеворк_ТестЦасе {

    фунцтион тестРецтанглеАреа () {

        $ р = нови правоугаоник ();

        $ ц = нови клијент ();

        $ тхис-> ассертТруе ($ ц-> ареаВерифиер ($ р));

    }

}

И направили смо једноставан тест тако што смо послали празан правоугаоник у контролор области и тест је прошао. Ако је наш разредни Трг defiзавршено исправно, слање у клијентову областВерифиер() не би требало да наруши његову функционалност. На крају крајева, квадрат је правоугаоник у сваком математичком смислу. Али да ли је то наша класа?

фунцтион тестСкуареАреа () {

    $ р = нови квадрат ();

    $ ц = нови клијент ();

    $ тхис-> ассертТруе ($ ц-> ареаВерифиер ($ р));

}

Дакле, наша квадратна класа ипак није правоугаоник. Крши законе геометрије. Не успева и крши принцип замене Лискова.

Ercole Palmeri

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Недавни чланци

Британски антимонополски регулатор подигао је БигТецх аларм због ГенАИ

УК ЦМА је издао упозорење о понашању Биг Тецх-а на тржишту вештачке интелигенције. Тамо…

КСНУМКС април КСНУМКС

Цаса Греен: енергетска револуција за одрживу будућност у Италији

Уредба „Цасе Греен“, коју је формулисала Европска унија за побољшање енергетске ефикасности зграда, завршила је свој законодавни процес са…

КСНУМКС април КСНУМКС

Е-трговина у Италији на +27% према новом извештају Цасалеггио Ассоциати

Представљен годишњи извештај Цасалеггио Ассоциати-а о е-трговини у Италији. Извештај под насловом „АИ-Цоммерце: границе е-трговине са вештачком интелигенцијом“.…

КСНУМКС април КСНУМКС

Сјајна идеја: Бандалук представља Аирпуре®, завесу која прочишћава ваздух

Резултат сталних технолошких иновација и посвећености животној средини и добробити људи. Бандалук представља Аирпуре®, шатор…

КСНУМКС април КСНУМКС

Прочитајте Иновације на свом језику

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Пратите нас