Відмінності між версіями «Качина типізація»

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[перевірена версія][перевірена версія]
м (заміна застарілого тегу source)
(вікіфікація)
 
Рядок 1: Рядок 1:
 
'''Неявна типізація''', '''латентна типізація''' або '''качина типізація''' (калька з {{lang-en|Duck typing}}) — різновид [[динамічна типізація|динамічної типізації]], застосовуваної в деяких [[мова програмування|мовах програмування]], коли межі використання об'єкта визначаються його поточним набором методів і властивостей, на противагу [[Успадкування (програмування)|успадкуванню]] від певного [[клас (програмування)|класу]]. Тобто вважається, що об'єкт реалізує [[інтерфейс (програмування)|інтерфейс]], якщо він містить всі методи цього інтерфейсу, незалежно від зв'язків в ієрархії наслідування та приналежності до якогось конкретного класу.
 
'''Неявна типізація''', '''латентна типізація''' або '''качина типізація''' (калька з {{lang-en|Duck typing}}) — різновид [[динамічна типізація|динамічної типізації]], застосовуваної в деяких [[мова програмування|мовах програмування]], коли межі використання об'єкта визначаються його поточним набором методів і властивостей, на противагу [[Успадкування (програмування)|успадкуванню]] від певного [[клас (програмування)|класу]]. Тобто вважається, що об'єкт реалізує [[інтерфейс (програмування)|інтерфейс]], якщо він містить всі методи цього інтерфейсу, незалежно від зв'язків в ієрархії наслідування та приналежності до якогось конкретного класу.
   
Назва терміна походить від англійського «duck test» («качиний тест»), який в оригіналі звучить так:
+
Назва терміна походить від англійського «duck test» («[[качиний тест]]»), який в оригіналі звучить так:
 
: «If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck».
 
: «If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck».
 
: («Якщо воно виглядає як качка, плаває як качка і крякає як качка, то це напевно і є качка»).
 
: («Якщо воно виглядає як качка, плаває як качка і крякає як качка, то це напевно і є качка»).

Поточна версія на 09:58, 30 червня 2020

Неявна типізація, латентна типізація або качина типізація (калька з англ. Duck typing) — різновид динамічної типізації, застосовуваної в деяких мовах програмування, коли межі використання об'єкта визначаються його поточним набором методів і властивостей, на противагу успадкуванню від певного класу. Тобто вважається, що об'єкт реалізує інтерфейс, якщо він містить всі методи цього інтерфейсу, незалежно від зв'язків в ієрархії наслідування та приналежності до якогось конкретного класу.

Назва терміна походить від англійського «duck test» («качиний тест»), який в оригіналі звучить так:

«If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck».
(«Якщо воно виглядає як качка, плаває як качка і крякає як качка, то це напевно і є качка»).

Качина типізація вирішує такі проблеми ієрархічної типізації як:

  • неможливість явно вказати (шляхом наслідування) на сумісність інтерфейсу з усіма справжніми і майбутніми інтерфейсами, з якими він ідейно сумісний;
  • експоненціальне збільшення числа зв'язків в ієрархії типів при хоча б частковій спробі це зробити.

Іншим близьким підходом є структурні підтипи в OCaml, де типи об'єктів сумісні, якщо сумісні сигнатури їхніх методів, незалежно від оголошеного наслідування, причому все це перевіряється під час компіляції програми.

Приклади концепції[ред. | ред. код]

Розглянемо такий псевдо-код мови з качиною типізацією:

function calculate(a, b, c) => return (a+b)*c

example1 = calculate (1, 2, 3)
example2 = calculate ([1, 2, 3], [4, 5, 6], 2)
example3 = calculate ('apples ', 'and oranges, ', 3)

print to_string example1
print to_string example2
print to_string example3

У цьому прикладі кожного разу викликається функція calculate з об'єктами без спорідненої спадковості — числа, списки, рядки. Оскільки об'єкти підтримують методи «+» та «*», функція буде виконана. Якщо код, приміром, виконуватиметься у Ruby або Python, результатом буде

9
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
apples and oranges, apples and oranges, apples and oranges,


Таким чином, качина типізація дозволяє поліморфізм без успадкування. Єдиним обмеженням на функцію calculate є здатність її аргументів застосовувати методи «+» та «*».

На Python[ред. | ред. код]

Перевірка на качку може бути ілюстрована такими кодами. В цьому прикладі Sparrow є качкою.

В цьому прикладі розглядається функція in_the_forest (у_лісі), згідно якого об'єкти Human і Dog є качками:

У мовах зі статичною типізацією[ред. | ред. код]

Іноді мови зі статичною типізацією, такі як Boo чи версія 4 випуску C# мають додаткову анотацію типів[1][2], котра інструктує компілятор розміщувати перевірку типів і класів на стадії виконання, а не під час компіляції, і включати код для перевірки типів у відкомпільований вивід.

Інші мови зі статичною типізацією, наприклад F#, підтримують статичну качину типізацію, коли типи перевіряються на наявність певних сигнатур методів під час компіляції.

Виноски[ред. | ред. код]

  1. Boo: Duck Typing. Архів оригіналу за 6 жовтень 2008. Процитовано 9 січень 2014. 
  2. Anders Hejlsberg Introduces C# 4.0 at PDC 2008

Посилання[ред. | ред. код]