Кіріспе
Объектіге бағытталған бағдарламалау принципі
The Liskov substitution principle (LSP) is a particular definition of a subtyping relation, called strong behavioral subtyping, that was initially introduced by Barbara Liskov in a 1987 conference keynote address titled Data abstraction and hierarchy. It is based on the concept of "substitutability" a principle in object oriented programming stating that an object (such as a class) may be replaced by a sub object (such as a class that extends the first class) without breaking the program. It is a semantic rather than merely syntactic relation, because it intends to guarantee semantic interoperability of types in a hierarchy, object types in particular. Barbara Liskov and Jeannette Wing described the principle succinctly in a 1994 paper as follows:
Subtype Requirement: Let \phi(x) be a property provable about objects x of type T. Then \phi(y) should be true for objects y of type S where S is a subtype of T.
Symbolically:
That is, if S subtypes T, what holds for T objects holds for S objects. In the same paper, Liskov and Wing detailed their notion of behavioral subtyping in an extension of Hoare logic, which bears a certain resemblance to Bertrand Meyer's design by contract in that it considers the interaction of subtyping with preconditions, postconditions and invariants.
Лисковтың алмастыру принципі (LSP) – күшті мінез-құлықтық субтипификация деп аталатын субтипификация қатынасының ерекше анықтамасы. Оны алғаш рет Барбара Лисков 1987 жылы «Деректерді абстракциялау және иерархия» атты конференцияның бас баяндамасында енгізді. Ол «алмастырылатындық» ұғымына негізделген, объектіге бағытталған бағдарламалаудағы принцип, онда объект (мысалы, класс) бағдарламаны бұзбай, кіші объект (мысалы, бірінші класты кеңейтетін класс) арқылы алмастырылуы мүмкін. Бұл тек синтаксистік емес, семантикалық қатынас, өйткені ол иерархиядағы типтердің семантикалық үйлесімділігіне кепілдік беруді мақсат етеді, әсіресе объект типтері үшін. Барбара Лисков және Жаннет Уинг 1994 жылғы мақаласында принципті былайша қысқаша сипаттады:
The Liskov substitution principle (LSP) is a particular definition of a subtyping relation, called strong behavioral subtyping, that was initially introduced by Barbara Liskov in a 1987 conference keynote address titled Data abstraction and hierarchy. It is based on the concept of "substitutability" a principle in object oriented programming stating that an object (such as a class) may be replaced by a sub object (such as a class that extends the first class) without breaking the program. It is a semantic rather than merely syntactic relation, because it intends to guarantee semantic interoperability of types in a hierarchy, object types in particular. Barbara Liskov and Jeannette Wing described the principle succinctly in a 1994 paper as follows:
Subtype Requirement: Let \phi(x) be a property provable about objects x of type T. Then \phi(y) should be true for objects y of type S where S is a subtype of T.
Symbolically:
That is, if S subtypes T, what holds for T objects holds for S objects. In the same paper, Liskov and Wing detailed their notion of behavioral subtyping in an extension of Hoare logic, which bears a certain resemblance to Bertrand Meyer's design by contract in that it considers the interaction of subtyping with preconditions, postconditions and invariants.
Субтип талабы: Егер \phi(x) – T типіндегі x объектілері үшін дәлелденетін қасиет болса, онда \phi(y) – S типіндегі y объектілері үшін де дұрыс болуы керек, мұнда S – T-нің субтипі.
The Liskov substitution principle (LSP) is a particular definition of a subtyping relation, called strong behavioral subtyping, that was initially introduced by Barbara Liskov in a 1987 conference keynote address titled Data abstraction and hierarchy. It is based on the concept of "substitutability" a principle in object oriented programming stating that an object (such as a class) may be replaced by a sub object (such as a class that extends the first class) without breaking the program. It is a semantic rather than merely syntactic relation, because it intends to guarantee semantic interoperability of types in a hierarchy, object types in particular. Barbara Liskov and Jeannette Wing described the principle succinctly in a 1994 paper as follows:
Subtype Requirement: Let \phi(x) be a property provable about objects x of type T. Then \phi(y) should be true for objects y of type S where S is a subtype of T.
Symbolically:
That is, if S subtypes T, what holds for T objects holds for S objects. In the same paper, Liskov and Wing detailed their notion of behavioral subtyping in an extension of Hoare logic, which bears a certain resemblance to Bertrand Meyer's design by contract in that it considers the interaction of subtyping with preconditions, postconditions and invariants.
Символдық түрде:
The Liskov substitution principle (LSP) is a particular definition of a subtyping relation, called strong behavioral subtyping, that was initially introduced by Barbara Liskov in a 1987 conference keynote address titled Data abstraction and hierarchy. It is based on the concept of "substitutability" a principle in object oriented programming stating that an object (such as a class) may be replaced by a sub object (such as a class that extends the first class) without breaking the program. It is a semantic rather than merely syntactic relation, because it intends to guarantee semantic interoperability of types in a hierarchy, object types in particular. Barbara Liskov and Jeannette Wing described the principle succinctly in a 1994 paper as follows:
Subtype Requirement: Let \phi(x) be a property provable about objects x of type T. Then \phi(y) should be true for objects y of type S where S is a subtype of T.
Symbolically:
That is, if S subtypes T, what holds for T objects holds for S objects. In the same paper, Liskov and Wing detailed their notion of behavioral subtyping in an extension of Hoare logic, which bears a certain resemblance to Bertrand Meyer's design by contract in that it considers the interaction of subtyping with preconditions, postconditions and invariants.
Яғни, егер S, T субтипі болса, T объектілері үшін дұрыс болған нәрсе S объектілері үшін де дұрыс болады. Сол мақалада Лисков және Уинг мінез-құлықтық субтипификация туралы түсініктерін Хоар логикасының кеңейтуі арқылы түсіндірді, ол Бертран Мейердің «келісімшарт бойынша жобалау» әдісіне ұқсас, себебі ол субтипификацияның алғышарттармен, соңғышарттармен және инварианттармен өзара әрекеттесуін қарастырады.
The Liskov substitution principle (LSP) is a particular definition of a subtyping relation, called strong behavioral subtyping, that was initially introduced by Barbara Liskov in a 1987 conference keynote address titled Data abstraction and hierarchy. It is based on the concept of "substitutability" a principle in object oriented programming stating that an object (such as a class) may be replaced by a sub object (such as a class that extends the first class) without breaking the program. It is a semantic rather than merely syntactic relation, because it intends to guarantee semantic interoperability of types in a hierarchy, object types in particular. Barbara Liskov and Jeannette Wing described the principle succinctly in a 1994 paper as follows:
Subtype Requirement: Let \phi(x) be a property provable about objects x of type T. Then \phi(y) should be true for objects y of type S where S is a subtype of T.
Symbolically:
That is, if S subtypes T, what holds for T objects holds for S objects. In the same paper, Liskov and Wing detailed their notion of behavioral subtyping in an extension of Hoare logic, which bears a certain resemblance to Bertrand Meyer's design by contract in that it considers the interaction of subtyping with preconditions, postconditions and invariants.
Принцип
Лисковтың мінез-құлықтық субтипі туралы ұғымы объектілерді алмастыру ұғымын анықтайды; яғни, егер S – T-ның субтипі болса, онда бағдарламадағы T типіндегі объектілерді сол бағдарламаның қажетті қасиеттерін өзгертпей S типіндегі объектілермен алмастыруға болады (мысалы, дұрыстық). Мінез-құлықтық субтипілеу, типтік теорияда анықталған функциялардың типтік субтипілеуінен гөрі күшті ұғым болып табылады, ол тек параметр типтерінің қарама-қайшылығы мен қайтарым типінің коварианттылығына негізделеді. Мінез-құлықтық субтипілеу жалпы жағдайда шешілмейді: егер q – «x үшін әдіс әрқашан аяқталады» қасиеті болса, онда бағдарламаның (мысалы, компилятордың) T-ның кейбір S субтипі үшін бұл қасиет дұрыс екенін тексеруі мүмкін емес, тіпті q T үшін дұрыс болса да. Дегенмен, бұл принцип сыныптар иерархиясының дизайны туралы ой-пікірлерді қалыптастыруда пайдалы. Лисковтың алмастыру принципі жаңа объектіге бағытталған бағдарламалау тілдерінде қабылданған қолтаңбаларға қатысты кейбір стандартты талаптарды қояды (әдетте типтер емес, сыныптар деңгейінде; номиналды және құрылымдық субтипілеу арасындағы айырмашылыққа назар аударыңыз):
Субтиптегі әдіс параметрлерінің типтерінің қарама-қайшылығы.
Субтиптегі әдіс қайтарым типтерінің коварианттылығы.
Субтиптегі әдістер супертип әдістерімен шығарылған ерекшеліктердің кіші типтері болмаса, жаңа ерекшеліктерді шығаруға болмайды.
Қолтаңба талаптарынан басқа, субтип бірқатар мінез-құлықтық шарттарды орындауы тиіс. Бұл шарттар келісімшарт әдістемесімен жобалау терминологиясында егжей-тегжейлі сипатталған, бұл келісімшарттардың мұрагерлікпен қалай өзара әрекеттесетініне қатысты белгілі бір шектеулерге әкеледі:
Алдын ала шарттарды субтипте күшейтуге болмайды.
Қосалқы типтегі постшарттарды әлсіретуге болмайды.
Инвариантты субтипте әлсіретуге болмайды.
Тарих шектеуі («тарих ережесі»).
Объектілерге тек олардың әдістері арқылы өзгеріс енгізіледі (инкапсуляция).
Субтиптерде супертипте жоқ әдістер енгізілуі мүмкін болғандықтан, осы әдістерді енгізу супертипте рұқсат етілмейтін субтиптегі күйді өзгертуге мүмкіндік беруі мүмкін. Тарих шектеуі бұған тыйым салады. Бұл Лисков пен Уинг енгізген жаңа элемент. Бұл шектеуді бұзуға мысал ретінде өзгермелі нүктені өзгермейтін нүктенің субтипі ретінде анықтауға болады. Бұл тарих шектеуін бұзу, өйткені өзгермейтін нүктенің тарихында күй жаратылғаннан кейін әрқашан бірдей болады, сондықтан ол жалпы өзгермелі нүктенің тарихын қамтымайды. Дегенмен, субтипке қосылған өрістерді қауіпсіз түрде өзгертуге болады, өйткені олар супертип әдістері арқылы байқалмайды. Осылайша, өзгермейтін ортасы және өзгермелі радиусы бар шеңберді өзгермейтін нүктенің субтипі ретінде тарих шектеуін бұзбай анықтауға болады.
Шығу тегі
Алдын ала және кейінгі шарттар туралы ережелер Бертран Мейердің 1988 жылғы «Объектіге бағытталған бағдарламалық құралым» кітабында ұсынылған ережелермен толық сәйкес. Мейер де, кейіннен мінез-құлықтық субтипі терминін алғаш қолданған Пьер Америка да, кейбір мінез-құлықтық субтипі түсініктерінің дәлелдік теориялық анықтамаларын берді, бірақ олардың анықтамаларында сілтемелер немесе көрсеткіштерді қолдайтын бағдарламалау тілдерінде кездесетін псевдонимдер ескерілмеді. Аллиазингті ескеру Liskov және Wing (1994) жасаған маңызды жақсарту болды, ал тарих шектеуі – оның негізгі құралы. Мейер мен Американың анықтамалары бойынша өзгертілетін нүкте өзгертілмейтін нүктенің мінез-құлықтық субтипі болар еді, бірақ Лисковтың алмастыру принципі мұны қабылдамайды.
Ерекше сілтемелер
Лисков бұл қағиданы алғаш рет айтқан маңызды лекциясы.
Жалпы сілтеме
Бұл мақалада Лисков пен Вингтің ұғымдарының ішіндегі әртүрлі мінез-құлық субтипі түсініктері қарастырылады. Жаңартылған нұсқасы жарияланды: принципті авторлары ресми түрде жазды. 2-тарауда мінез-құлық субтипінің әртүрлі формаларына кіріспе жасалған. Объектіге бағытталған бағдарламалау қауымдастығында танымал мақала, онда LSP бұзудың бірнеше мысалы келтірілген. Бұл мақалада аталған контексте LSP талқыланады.