Кіріспе

Объектіге бағытталған бағдарламалау принципі

Лисковтың алмастыру принципі (LSP) – күшті мінез-құлықтық субтипификация деп аталатын субтипификация қатынасының ерекше анықтамасы. Оны алғаш рет Барбара Лисков 1987 жылы «Деректерді абстракциялау және иерархия» атты конференцияның бас баяндамасында енгізді. Ол «алмастырылатындық» ұғымына негізделген, объектіге бағытталған бағдарламалаудағы принцип, онда объект (мысалы, класс) бағдарламаны бұзбай, кіші объект (мысалы, бірінші класты кеңейтетін класс) арқылы алмастырылуы мүмкін. Бұл тек синтаксистік емес, семантикалық қатынас, өйткені ол иерархиядағы типтердің семантикалық үйлесімділігіне кепілдік беруді мақсат етеді, әсіресе объект типтері үшін. Барбара Лисков және Жаннет Уинг 1994 жылғы мақаласында принципті былайша қысқаша сипаттады:

Субтип талабы: Егер \phi(x) – T типіндегі x объектілері үшін дәлелденетін қасиет болса, онда \phi(y) – S типіндегі y объектілері үшін де дұрыс болуы керек, мұнда S – T-нің субтипі.

Символдық түрде:

Яғни, егер S, T субтипі болса, T объектілері үшін дұрыс болған нәрсе S объектілері үшін де дұрыс болады. Сол мақалада Лисков және Уинг мінез-құлықтық субтипификация туралы түсініктерін Хоар логикасының кеңейтуі арқылы түсіндірді, ол Бертран Мейердің «келісімшарт бойынша жобалау» әдісіне ұқсас, себебі ол субтипификацияның алғышарттармен, соңғышарттармен және инварианттармен өзара әрекеттесуін қарастырады.

Принцип

Лисковтың мінез-құлықтық субтипі туралы ұғымы объектілерді алмастыру ұғымын анықтайды; яғни, егер S – T-ның субтипі болса, онда бағдарламадағы T типіндегі объектілерді сол бағдарламаның қажетті қасиеттерін өзгертпей S типіндегі объектілермен алмастыруға болады (мысалы, дұрыстық). Мінез-құлықтық субтипілеу, типтік теорияда анықталған функциялардың типтік субтипілеуінен гөрі күшті ұғым болып табылады, ол тек параметр типтерінің қарама-қайшылығы мен қайтарым типінің коварианттылығына негізделеді. Мінез-құлықтық субтипілеу жалпы жағдайда шешілмейді: егер q – «x үшін әдіс әрқашан аяқталады» қасиеті болса, онда бағдарламаның (мысалы, компилятордың) T-ның кейбір S субтипі үшін бұл қасиет дұрыс екенін тексеруі мүмкін емес, тіпті q T үшін дұрыс болса да. Дегенмен, бұл принцип сыныптар иерархиясының дизайны туралы ой-пікірлерді қалыптастыруда пайдалы. Лисковтың алмастыру принципі жаңа объектіге бағытталған бағдарламалау тілдерінде қабылданған қолтаңбаларға қатысты кейбір стандартты талаптарды қояды (әдетте типтер емес, сыныптар деңгейінде; номиналды және құрылымдық субтипілеу арасындағы айырмашылыққа назар аударыңыз):

Субтиптегі әдіс параметрлерінің типтерінің қарама-қайшылығы.
Субтиптегі әдіс қайтарым типтерінің коварианттылығы.
Субтиптегі әдістер супертип әдістерімен шығарылған ерекшеліктердің кіші типтері болмаса, жаңа ерекшеліктерді шығаруға болмайды.
Қолтаңба талаптарынан басқа, субтип бірқатар мінез-құлықтық шарттарды орындауы тиіс. Бұл шарттар келісімшарт әдістемесімен жобалау терминологиясында егжей-тегжейлі сипатталған, бұл келісімшарттардың мұрагерлікпен қалай өзара әрекеттесетініне қатысты белгілі бір шектеулерге әкеледі:

Алдын ала шарттарды субтипте күшейтуге болмайды.
Қосалқы типтегі постшарттарды әлсіретуге болмайды.
Инвариантты субтипте әлсіретуге болмайды.
Тарих шектеуі («тарих ережесі»).
Объектілерге тек олардың әдістері арқылы өзгеріс енгізіледі (инкапсуляция).
Субтиптерде супертипте жоқ әдістер енгізілуі мүмкін болғандықтан, осы әдістерді енгізу супертипте рұқсат етілмейтін субтиптегі күйді өзгертуге мүмкіндік беруі мүмкін. Тарих шектеуі бұған тыйым салады. Бұл Лисков пен Уинг енгізген жаңа элемент. Бұл шектеуді бұзуға мысал ретінде өзгермелі нүктені өзгермейтін нүктенің субтипі ретінде анықтауға болады. Бұл тарих шектеуін бұзу, өйткені өзгермейтін нүктенің тарихында күй жаратылғаннан кейін әрқашан бірдей болады, сондықтан ол жалпы өзгермелі нүктенің тарихын қамтымайды. Дегенмен, субтипке қосылған өрістерді қауіпсіз түрде өзгертуге болады, өйткені олар супертип әдістері арқылы байқалмайды. Осылайша, өзгермейтін ортасы және өзгермелі радиусы бар шеңберді өзгермейтін нүктенің субтипі ретінде тарих шектеуін бұзбай анықтауға болады.

Шығу тегі

Алдын ала және кейінгі шарттар туралы ережелер Бертран Мейердің 1988 жылғы «Объектіге бағытталған бағдарламалық құралым» кітабында ұсынылған ережелермен толық сәйкес. Мейер де, кейіннен мінез-құлықтық субтипі терминін алғаш қолданған Пьер Америка да, кейбір мінез-құлықтық субтипі түсініктерінің дәлелдік теориялық анықтамаларын берді, бірақ олардың анықтамаларында сілтемелер немесе көрсеткіштерді қолдайтын бағдарламалау тілдерінде кездесетін псевдонимдер ескерілмеді. Аллиазингті ескеру Liskov және Wing (1994) жасаған маңызды жақсарту болды, ал тарих шектеуі – оның негізгі құралы. Мейер мен Американың анықтамалары бойынша өзгертілетін нүкте өзгертілмейтін нүктенің мінез-құлықтық субтипі болар еді, бірақ Лисковтың алмастыру принципі мұны қабылдамайды.

Ерекше сілтемелер

Лисков бұл қағиданы алғаш рет айтқан маңызды лекциясы.

Жалпы сілтеме

Бұл мақалада Лисков пен Вингтің ұғымдарының ішіндегі әртүрлі мінез-құлық субтипі түсініктері қарастырылады. Жаңартылған нұсқасы жарияланды: принципті авторлары ресми түрде жазды. 2-тарауда мінез-құлық субтипінің әртүрлі формаларына кіріспе жасалған. Объектіге бағытталған бағдарламалау қауымдастығында танымал мақала, онда LSP бұзудың бірнеше мысалы келтірілген. Бұл мақалада аталған контексте LSP талқыланады.