Interested Article - Утиная типизация

Типизация данных

Неявная типизация , латентная типизация или утиная типизация ( англ. Duck typing ) в ОО-языках — определение факта реализации определённого интерфейса объектом без явного указания или наследования этого интерфейса, а просто по реализации полного набора его методов .

Название

Название термина пошло от английского «duck test» утиный тест »), суть которого выражается как:

Если это выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка.

Принцип

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

Такой подход позволяет полиморфно работать с объектами , которые не связаны в иерархии наследования . Достаточно, чтобы все эти объекты поддерживали необходимый набор методов .

Другим близким подходом является структурные подтипы в OCaml , где типы объектов совместимы, если совместимы сигнатуры их методов, независимо от объявленного наследования, причём всё это проверяется во время компиляции программы .

Проблемы иерархической типизации

Утиная типизация решает такие проблемы иерархической типизации, как:

  • невозможность явно указать (путём наследования) на совместимость интерфейса со всеми настоящими и будущими интерфейсами, с которыми он идейно совместим;
  • экспоненциальное увеличение числа связей в иерархии типов при хотя бы частичной попытке это сделать.

Утиная типизация практически незаменима в прикладных языках сценариев («скриптов»), где приходится работать с внешними по отношению к программе (скрипту) документами (веб-страницы, текстовые и табличные документы), иерархия объектов которых недоступна.

Языки, поддерживающие утиную типизацию

Утиная типизация поддерживается в том числе в языках: Prolog , D , Perl , Smalltalk , Python , Objective-C , Ruby , JavaScript , TypeScript , Groovy , ColdFusion , Boo , Lua , Go , Scala .

Ссылки

  • .
  • (англ.) .
  • (англ.) .
Источник —

Same as Утиная типизация