Утиная типизация
Неявная типизация, латентная типизация или утиная типизация (англ. Duck typing) в ОО-языках — определение факта реализации определённого интерфейса объектом без явного указания или наследования этого интерфейса, а просто по реализации полного набора его методов[1].
Название
[править | править код]Название термина пошло от английского «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.
Ссылки
[править | править код]- Утиная типизация в C#.
- Утиная типизация в Python (англ.).
- Утиная типизация в Boo (англ.).
Примечания
[править | править код]- ↑ Ortin, F., Garcia, M. A Programming Language That Combines the Benefits of Static and Dynamic Typing (англ.) // Software and Data Technologies. ICSOFT 2010. — 2013. — 4 January (vol. 170). — P. 77.
В статье есть список источников, но в этом разделе не хватает сносок. |