Качыная тыпізацыя
У машынным праграмаваньні качыная тыпізацыя — гэта прымяненьне тэсту на качку — «Калі нешта ходзіць як качка і квакча як качка, тады, яно павінна быць качкаю» — для вызначэньня магчымасьці выкарыстаньня аб’екта з пэўнай мэтаю. Пры намінатыўнай тыпізацыі аб’ект належыць да дадзенага тыпу, калі ён аб’яўлены як такі (або калі асацыяцыя тыпу з аб’ектам вызначаецца праз такія мэханізмы, як спадкаваньне). Пры качынай тыпізацыі — калі ён мае ўсе неабходныя для гэтага тыпу мэтады і ўласьцівасьці.[1][2] Качыную тыпізацыю можна разглядаць як структурную эквівалентнасць паміж дадзеным аб’ектам і патрэбным тыпам.
Прыклад
рэдагавацьНаступны прыклад на 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'
Калі можна ўявіць, што ўсё, што можа плаваць, з’яўляецца качкаю — кіт можа лічыцца качкаю; але, калі таксама патрэбна, каб качка мела здольнасьць лётаць, кіт не можа лічыцца качкаю.
У мовах са статычнай тыпізацыяй
рэдагавацьУ некаторых мовах са статычнай тыпізацыяй, такіх як Boo[3] й D,[4][5] праверку тыпаў клясаў можна ажыцьцяўляць падчас выканання, а не кампіляцыі.
Параўнаньне з іншымі сыстэмамі тыпаў
рэдагавацьСтруктурная тыпізацыя
рэдагавацьКачыная тыпізацыя мае падобныя рысы са структурнай тыпізацыяй. Структурная тыпізацыя — гэта статычная тыпізацыі, якая суадносіць тыпы па іх структуры, у той час як качыная тыпізацыя з’яўляецца дынамічнай і суадносіць тыпы толькі па той частцы структуры, да якой звяртаюцца падчас выкананьня.
Мовы TypeScript,[6] Elm[7] і Python[8] у той ці іншай ступені падтрымліваюць структурную тыпізацыю.
Пратаколы й інтэрфэйсы
рэдагавацьПратаколы й інтэрфэйсы дазваляюць яўна вызначыць мэтады, апэратары й паводзіны аб’екта. Калі зьнешняя бібліятэка рэалізуе нязменную клясу, кліент не можа карыстацца яе экзэмплярам з інтэрфейсам, невядомым гэтай бібліятэцы, нават калі кляса задавальняе патрабаваньням інтэрфэйса. Вядомым вырашэньнем гэтае праблемы з’яўляецца патэрн Адаптэр. У супрацьлегласць гэтаму, пры качынай тыпізацыі аб’ект будзе прыняты непасрэдна без неабходнасьці адаптэра.
Шаблённыя тыпы
рэдагавацьШаблённыя функцыі або мэтады прымяняюць качыны тэст у кантэксьце статычнае тыпізацыі, што сумяшчае ўсе перавагі і недахопы як статычнае так і дынамічнае праверкі тыпаў. Як больш гнуткая качыная тыпізацыя дазваляе рэалізаваць толькі мэтады фактычна выклікаемыя падчас выканання, у той час як шаблёны патрабуюць рэалізацыі ўсіх мэтадаў, нават калі яны застануцца нявыкарыстанымі.
У такіх мовах, як Java, Scala і Objective-C, рэфлексія можа быць выкарыстана для праверкі структуры аб’екта. Напрыклад, Java MethodHandle API можна ўжытае такім чынам.[9]
Крыніцы
рэдагаваць- ^ Дакумэнтацыя Python 3.7.1 = Glossary — Python 3.7.1 documentation (анг.). docs.python.org.
- ^ Прыклад качынае тыпізацыі на Python = Python Duck Typing - Example (анг.). techiehours.com (2020-06-28). Архіўная копія ад 2022-03-31 г.
- ^ Boo: Качыная тыпізацыя = Boo: Duck Typing (анг.). boo.codehaus.org (October 6, 2008). Архіўная копія
- ^ Дынамічныя клясы й качыная тыпізацыя = Dynamic classes and duck typing (анг.). forum.dlang.org.
- ^ "качыная тыпізацыя ў D" = "duck typing in D" (анг.). StackOverflow.
- ^ Дакумэнтацыя TypeScript - Сумяшчальнасьць тыпаў = TypeScript: Documentation - Type Compatibility (анг.). www.typescriptlang.org.
- ^ Эван Чапліцкі Нутро мовы · Уводзіны ў Elm = Core Language · An Introduction to Elm (анг.). guide.elm-lang.org.
- ^ PEP 544 – Пратаколы: структурная тыпізацыя (статычная качыная тыпізацыя) = PEP 544 – Protocols: Structural subtyping (static duck typing) (анг.). peps.python.org.
- ^ Качынай тыпізацыі на Java з MethodHandles = Implement duck typing using java MethodHandles (анг.). StackOverflow.