Утка печатает - Duck typing

Утка печатает в компьютерном программировании - это приложение утиный тест - «Если он ходит, как утка, и крякает, как утка, значит, это должна быть утка» - чтобы определить, объект можно использовать для определенной цели. При обычном наборе текста пригодность определяется типом объекта. При утином наборе пригодность объекта определяется наличием определенных методы и свойства, а не тип самого объекта.[1][2]

Пример

Это простой пример в Python 3, который демонстрирует, как любой объект может использоваться в любом контексте, до тех пор, пока он не будет использован способом, который он не поддерживает.

учебный класс Утка:    def летать(себя):        Распечатать("Утка летит")учебный класс Воробей:    def летать(себя):        Распечатать("Воробей летит")учебный класс КИТ:    def плавать(себя):        Распечатать(«Китовое плавание»)за животное в Утка(), Воробей(), КИТ():    животное.летать()

Выход:

Duck flyingSparrow flyingAttributeError: объект 'Whale' не имеет атрибута 'fly'

На статически типизированных языках

В некоторых статически типизированный языки, такие как C # и Бу,[3][4] Можно указать, чтобы проверка типа класса происходила во время выполнения, а не во время компиляции. Утиная печать может быть достигнута в Ява с помощью API MethodHandle.[5]

Сравнение с системами других типов

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

Утиная печать похожа на, но отличается от структурная типизация. Структурная типизация - это статическая типизация система, которая определяет совместимость и эквивалентность типов по структуре типа, тогда как утиная типизация динамичный и определяет совместимость типов только по той части структуры типа, к которой осуществляется доступ во время время выполнения.

В Машинопись,[6] OCaml, Scala, Идти, Вяз,[7] Госу и PureScript языки поддерживают структурную типизацию в разной степени.

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

Протоколы и интерфейсы может предоставить некоторые преимущества утиной печати, но утиная типизация отличается тем, что не имеет явного интерфейса. Например, если сторонняя библиотека реализует класс, который не может быть изменен, клиент не может использовать его экземпляр с интерфейсом, неизвестным этой библиотеке, даже если класс действительно удовлетворяет требованиям интерфейса. (Распространенным решением этой проблемы является Шаблон адаптера.) Утиный ввод позволил бы это. Опять же, для совместимости должен быть удовлетворен весь интерфейс.

Шаблоны или универсальные типы

Шаблон, или же общий функции или методы применяют утиный тест в статическая типизация контекст; это приносит все преимущества и недостатки статическая и динамическая проверка типов в целом. Утиная печать также может быть более гибкой, поскольку только методы фактически вызывается во время выполнения должны быть реализованы, в то время как шаблоны требуют реализации всех методов, которые не может быть доказано недоступен во время компиляции.

Такие языки, как Python, Java и Objective-C, являются примерами утиной печати, потому что в них можно создавать новые типы во время выполнения через отражение и проверьте, реализуют ли эти объекты определенные методы. С другой стороны, есть языки, которые полагаются на методы метапрограммирования во время компиляции (например, C ++ и его система шаблонов) и, таким образом, не попадают в категорию утиной печати; вместо этого в какой-то момент конвейера компиляции все типы заполнителей заменяются некоторыми конкретными типами, указанными в конкретном экземпляре. Несмотря на то, что в них возможно стирание определенного типа, проверка во время выполнения ограничена.

Смотрите также

Рекомендации

  1. ^ «Глоссарий - документация Python 3.7.1». docs.python.org. Получено 2018-11-08.
  2. ^ "Python Duck Typing - пример". Techie Hours. 2020-06-28. Получено 2020-07-26.
  3. ^ Бу: Утка печатаетВ архиве 6 октября 2008 г. Wayback Machine
  4. ^ «Андерс Хейлсберг представляет C # 4.0 на PDC 2008». Получено 30 января 2017.
  5. ^ «StackOverflow: Реализуйте утиную типизацию с помощью Java MethodHandles». Получено 13 июн 2020.
  6. ^ "SE Radio Episode 384: Борис Черный о TypeScript". se-radio.net. Получено 2019-10-25.
  7. ^ Чаплицкий, Эван. "Основной язык · Введение в вяз". Получено 30 января 2017.