Interested Article - Утиная типизация
- 2021-02-14
- 2
Неявная типизация , латентная типизация или утиная типизация ( англ. 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 , где типы объектов совместимы, если совместимы сигнатуры их методов, независимо от объявленного наследования, причём всё это проверяется во время компиляции программы .
Проблемы иерархической типизации
Утиная типизация решает такие проблемы иерархической типизации, как:
- невозможность явно указать (путём наследования) на совместимость интерфейса со всеми настоящими и будущими интерфейсами, с которыми он идейно совместим;
- экспоненциальное увеличение числа связей в иерархии типов при хотя бы частичной попытке это сделать.
Утиная типизация практически незаменима в прикладных языках сценариев («скриптов»), где приходится работать с внешними по отношению к программе (скрипту) документами (веб-страницы, текстовые и табличные документы), иерархия объектов которых недоступна.
Языки, поддерживающие утиную типизацию
Утиная типизация поддерживается в том числе в языках: Prolog , D , Perl , Smalltalk , Python , Objective-C , Ruby , JavaScript , TypeScript , Groovy , ColdFusion , Boo , Lua , Go , Scala .
Ссылки
- .
- (англ.) .
- (англ.) .
- 2021-02-14
- 2