Введение

Стиль динамической типизации в объектно-ориентированном программировании

В компьютерном программировании, "утиная типизация" – это применение "утиного теста" – "Если оно ходит как утка и крякает как утка, то это, должно быть, утка" – для определения, можно ли использовать объект для конкретной цели. При номинативной типизации объект относится к определенному типу, если он объявлен как таковой (или если связь типа с объектом выводится посредством механизмов, таких как наследование). При утиной типизации объект считается относящимся к определенному типу, если он обладает всеми методами и свойствами, необходимыми для этого типа. Утиная типизация может рассматриваться как структурное соответствие между данным объектом и требованиями типа, основанное на использовании.

На языках с статическим типом

В некоторых статически типизированных языках, таких как Boo и D, можно указать, чтобы проверка типов классов выполнялась во время выполнения, а не во время компиляции.

Системы структурного типа

Утиная типизация похожа на, но отличается от, структурной типизации. Структурная типизация — это статическая система типизации, которая определяет совместимость и эквивалентность типов по структуре типа, в то время как утиная типизация является динамической и определяет совместимость типа только на основе той части структуры типа, к которой осуществляется доступ во время выполнения. Языки TypeScript, Elm и Python поддерживают структурную типизацию в различной степени.

Протоколы и интерфейсы

Протоколы и интерфейсы предоставляют способ явно объявить, что некоторые методы, операторы или поведение должны быть реализованы. Если сторонняя библиотека реализует класс, который нельзя изменить, клиент не сможет использовать его экземпляр с интерфейсом, неизвестным этой библиотеке, даже если класс соответствует требованиям этого интерфейса. Распространенным решением этой проблемы является шаблон "адаптер". В отличие от этого, при "утиной типизации" объект будет принят напрямую, без необходимости использования адаптера.

Шаблоны или общие типы

Функции или методы шаблона (также называемые обобщёнными) применяют принцип "утки" в контексте статической типизации; это сочетает в себе все преимущества и недостатки статической и динамической проверки типов. Duck typing также может быть более гибким, поскольку необходимо реализовать только те методы, которые фактически вызываются во время выполнения, в то время как шаблоны требуют реализации всех методов, недостижимость которых нельзя доказать на этапе компиляции. В языках, таких как Java, Scala и Objective-C, механизм рефлексии может использоваться для проверки, реализуют ли объекты необходимые методы или для добавления этих методов во время выполнения. Например, API MethodHandle в Java может быть использован таким образом.