Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Пример [ править ]

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

class  Duck :  def  fly ( self ):  print ( "Утка летит" )class  Whale :  def  swim ( self ):  print ( «Плавание кита» )для  животных  в  ( Утка (),  Кит ()):  животное . летать ()

Выход:

Утка летитAttributeError: объект 'Whale' не имеет атрибута 'fly'

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

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

Сравнение с другими системами типов [ править ]

Системы структурного типа [ править ]

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

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

Протоколы и интерфейсы [ править ]

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

Шаблоны или общие типы [ править ]

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

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

См. Также [ править ]

  • Методы расширения
  • UFCS
  • Слабая связь
  • Патч обезьяны
  • Язык динамического программирования

Ссылки [ править ]

  1. ^ «Глоссарий - документация Python 3.7.1» . docs.python.org . Проверено 8 ноября 2018 .
  2. ^ «Python Duck Typing - Пример» . Techie Hours . 2020-06-28 . Проверено 26 июля 2020 .
  3. Boo: Duck Typing. Архивировано 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 . Проверено 25 октября 2019 .
  7. ^ Czaplicki, Эван. «Основной язык · Введение в вяз» . Проверено 30 января 2017 года .