Перайсьці да зьместу

Качыная тыпізацыя

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі

У машынным праграмаваньні качы́ная тыпіза́цыя — гэта прымяненьне тэсту на качку — «Калі гэта выглядае як качка, плавае як качка й квакча як качка, тады гэта, верагодна, і ёсьць качка» — для вызначэньня магчымасьці выкарыстаньня аб’екта з пэўнай мэтаю. Пры намінатыўнай тыпізацыі аб’ект належыць да дадзенага тыпу, калі ён аб’яўлены як такі (або калі асацыяцыя тыпу з аб’ектам вызначаецца праз такія мэханізмы, як спадкаваньне). Пры качынай тыпізацыі — калі ён мае ўсе неабходныя для гэтага тыпу мэтады й уласьцівасьці.[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]