Концепт овог принципа увела је Барбара Лисков на конференцији 1987. и касније објављена у раду заједно са Јаннетте Винг 1994. године. defiоригинална ција је следећа:
Нека је к (к) доказљиво својство на објектима к типа Т. Тада би к (и) требало да буде доказљиво за објекте и типа С где је С подтип Т.
Након тога, са објављивањем СОЛИД принципа Роберта Ц. Мартина у његовој књизи Агиле Софтваре Девелопмент, Принциплес, Паттернс, анд Працтицес, а затим поново објављеном у Ц# верзији књиге Агиле Принциплес, Паттернс, анд Працтицес ин Ц#, defiција је постала позната као принцип замене Лискова.
Ово нас доводи до defiинформације које је дао Роберт Ц. Мартин: Подтипови морају бити заменљиви основним типовима.
цласс Вехицле {
функција стартЕнгине () {
// Подразумевана функционалност покретања мотора
}
функција аццелерате () {
// Подразумевана функционалност убрзања
}
}
С обзиром на класу возила - може бити апстрактна - и две примене:
класа Цар продужује возило {
функција стартЕнгине () {
$ тхис-> енгаггнитион ();
родитељ :: стартЕнгине ();
}
приватна функција енгаИгнитион () {
// Поступак паљења
}
}
класа ЕлецтрицБус проширује возило {
функција аццелерате () {
$ ово-> повећајВолтаге ();
$ тхис-> цоннецтИндивидуалЕнгинес ();
}
приватна функција повећањеВолтаге () {
// Електрична логика
}
приватна функција цоннецтИндивидуалЕнгинес () {
// Логика везе
}
}
цласс Дривер {
функција го (возило $ в) {
$ в-> стартЕнгине ();
$ в-> убрзати ();
}
}
Што нас доводи до једноставне примене обрасца дизајна методе предлошка какав смо користили у ОЦП-у.
Можда ће вас занимати и други СОЛИД принцип: хттпс://bloginnovazione.ен / отворено-затворено-други-принцип-чврсто / 3906 /
На основу нашег претходног искуства са отвореним / затвореним принципом, можемо закључити да је Лисков принцип замене уско повезан са ОЦП. У ствари, „кршење ЛСП-а представља латентно кршење ОЦП-а“ (Роберт Ц. Мартин), а образац дизајна шаблона методе класичан је пример поштовања и примене ЛСП-а, што је заузврат једно од решења за усклађивање са ОЦП.
цласс Рецтангле {
привате $ топЛефт;
привате $ видтх;
привате $ хеигхт;
јавна функција сетХеигхт ($ хеигхт) {
$ ово-> висина = $ висина;
}
јавна функција гетХеигхт () {
ретурн $ тхис-> хеигхт;
}
јавна функција сетВидтх ($ видтх) {
$ тхис-> видтх = $ видтх;
}
јавна функција гетВидтх () {
ретурн $ тхис-> видтх;
}
}
Почнимо са основним геометријским обликом, правоугаоником. То је само једноставан објект података са сеттерима и геттерима за ширину и висину. Замислите да наша апликација ради и да је већ постављена на неколико клијената. Сада им је потребна нова карактеристика. Морају бити у стању да манипулишу квадратима.
У стварном животу, у геометрији, квадрат је одређени облик правоугаоника. Тако бисмо могли покушати да имплементирамо класу Скуаре која проширује класу Рецтангле. Често се каже да је класа дете родитељска класа, а овај израз такође одговара ЛСП, бар на први поглед.
цласс Скуаре ектендс Рецтангле {
јавна функција сетХеигхт ($ валуе) {
$ тхис-> видтх = $ валуе;
$ ово-> висина = $ вредност;
}
јавна функција сетВидтх ($ валуе) {
$ тхис-> видтх = $ валуе;
$ ово-> висина = $ вредност;
}
}
Квадрат је правоугаоник једнаке ширине и висине и могли бисмо да изведемо необичну примену као у претходном примеру. Могли бисмо да заменимо оба сетера да подесимо и висину и ширину. Али како ће ово утицати на клијентски код?
цласс Цлиент {
фунцтион ареаВерифиер (правоугаоник $ р) {
$ р-> сетВидтх (5);
$ р-> сетХеигхт (4);
иф ($ р-> ареа ()! = 20) {
баци нови изузетак ('Лоше подручје!');
}
ретурн труе;
}
}
област функције () {
ретурн $ тхис-> видтх * $ тхис-> хеигхт;
}
Очигледно смо додали горњу методу у нашу класу Рецтангле да бисмо обезбедили подручје.
класа ЛспТест проширује ПХПУнит_Фрамеворк_ТестЦасе {
фунцтион тестРецтанглеАреа () {
$ р = нови правоугаоник ();
$ ц = нови клијент ();
$ тхис-> ассертТруе ($ ц-> ареаВерифиер ($ р));
}
}
И направили смо једноставан тест тако што смо послали празан правоугаоник у контролор области и тест је прошао. Ако је наш разредни Трг defiзавршено исправно, слање у клијентову областВерифиер() не би требало да наруши његову функционалност. На крају крајева, квадрат је правоугаоник у сваком математичком смислу. Али да ли је то наша класа?
фунцтион тестСкуареАреа () {
$ р = нови квадрат ();
$ ц = нови клијент ();
$ тхис-> ассертТруе ($ ц-> ареаВерифиер ($ р));
}
Дакле, наша квадратна класа ипак није правоугаоник. Крши законе геометрије. Не успева и крши принцип замене Лискова.
Ercole Palmeri
УК ЦМА је издао упозорење о понашању Биг Тецх-а на тржишту вештачке интелигенције. Тамо…
Уредба „Цасе Греен“, коју је формулисала Европска унија за побољшање енергетске ефикасности зграда, завршила је свој законодавни процес са…
Представљен годишњи извештај Цасалеггио Ассоциати-а о е-трговини у Италији. Извештај под насловом „АИ-Цоммерце: границе е-трговине са вештачком интелигенцијом“.…
Резултат сталних технолошких иновација и посвећености животној средини и добробити људи. Бандалук представља Аирпуре®, шатор…