Качыная тыпізацыя
From Wikipedia, the free encyclopedia
Remove ads
У машынным праграмаваньні качы́ная тыпіза́цыя — гэта прымяненьне тэсту на качку — «Калі гэта выглядае як качка, плавае як качка й квакча як качка, тады гэта, верагодна, і ёсьць качка» — для вызначэньня магчымасьці выкарыстаньня аб’екта з пэўнай мэтаю. Пры намінатыўнай тыпізацыі аб’ект належыць да дадзенага тыпу, калі ён аб’яўлены як такі (або калі асацыяцыя тыпу з аб’ектам вызначаецца праз такія мэханізмы, як спадкаваньне). Пры качынай тыпізацыі — калі ён мае ўсе неабходныя для гэтага тыпу мэтады й уласьцівасьці.[1][2] Качыную тыпізацыю можна разглядаць як структурную эквівалентнасьць паміж дадзеным аб’ектам і патрэбным тыпам.
Remove ads
Прыклад
Наступны прыклад на Python 3 дэманструе, як любы аб’ект можа выкарыстоўвацца ў любым кантэксьце, пакуль ён здольны на тое, што ад яго патрабуюць.
class Duck:
def swim(self):
print("Качка плыве")
def fly(self):
print("Качка ляціць")
class Whale:
def swim(self):
print("Кіт плыве")
for animal in [Duck(), Whale()]:
animal.swim()
animal.fly()
Вынік:
Качка плыве
Качка ляціць
Кіт плыве
AttributeError: 'Whale' object has no attribute 'fly'
Калі можна ўявіць, што ўсё, што можа плаваць, зьяўляецца качкаю — кіт можа лічыцца качкаю; але, калі таксама патрэбна, каб качка мела здольнасьць лётаць, кіт ня можа лічыцца качкаю.
Remove ads
У мовах са статычнай тыпізацыяй
У некаторых мовах са статычнай тыпізацыяй, такіх як Boo[3] й D,[4][5] праверку тыпаў клясаў можна ажыцьцяўляць падчас выканання, а не кампіляцыі.
Параўнаньне з іншымі сыстэмамі тыпаў
Структурная тыпізацыя
Качыная тыпізацыя мае падобныя рысы са структурнай тыпізацыяй. Структурная тыпізацыя — гэта статычная тыпізацыі, якая суадносіць тыпы па іх структуры, у той час як качыная тыпізацыя зьяўляецца дынамічнай і суадносіць тыпы толькі па той частцы структуры, да якой зьвяртаюцца падчас выкананьня.
Мовы TypeScript,[6] Elm[7] і Python[8] у той ці іншай ступені падтрымліваюць структурную тыпізацыю.
Пратаколы й інтэрфэйсы
Пратаколы й інтэрфэйсы дазваляюць яўна вызначыць мэтады, апэратары й паводзіны аб’екта. Калі зьнешняя бібліятэка рэалізуе нязьменную клясу, кліент ня можа карыстацца яе экзэмплярам з інтэрфэйсам, невядомым гэтай бібліятэцы, нават калі кляса задавальняе патрабаваньням інтэрфэйсу. Вядомым вырашэньнем гэтае праблемы зьяўляецца патэрн Адаптэр. У супрацьлегласьць гэтаму, пры качынай тыпізацыі аб’ект будзе прыняты непасрэдна без неабходнасьці адаптэра.
Шаблённыя тыпы
Шаблённыя функцыі або мэтады прымяняюць качыны тэст у кантэксьце статычнае тыпізацыі, што сумяшчае ўсе перавагі й недахопы як статычнае, так і дынамічнае праверкі тыпаў. Як больш гнуткая качыная тыпізацыя дазваляе рэалізаваць толькі мэтады фактычна выклікаемыя падчас выканання, у той час як шаблёны патрабуюць рэалізацыі ўсіх мэтадаў, нават калі яны застануцца нявыкарыстанымі.
У такіх мовах, як Java, Scala й Objective-C, рэфлексія можа быць выкарыстана для праверкі структуры аб’екта. Напрыклад, Java MethodHandle API можна ўжытае такім чынам.[9]
Крыніцы
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads