Описание тега clojure-protocol

Протоколы были введены в Clojure 1.2

Протоколы были введены в Clojure 1.2.

Clojure написан в терминах абстракций. Существуют абстракции для последовательностей, коллекций, возможности вызова и т. Д. Кроме того, Clojure предоставляет множество реализаций этих абстракций. Абстракции определяются интерфейсами хоста, а реализации - классами хоста. Хотя этого было достаточно для начальной загрузки языка, он оставил Clojure без аналогичной абстракции и средств реализации низкого уровня. Функции протоколов и типов данных добавляют мощные и гибкие механизмы для абстрагирования и определения структуры данных без каких-либо компромиссов по сравнению с возможностями платформы хоста.

Есть несколько мотивов для протоколов:

  • Обеспечить высокопроизводительную динамическую конструкцию полиморфизма в качестве альтернативы интерфейсам
  • Поддержка лучших частей интерфейсов
    ° спецификация, только реализация
    ° один тип может реализовать несколько протоколов
  • Избегая некоторых недостатков
    ° Какие интерфейсы реализованы - это выбор автора типа во время разработки, который не может быть расширен позже (хотя внедрение интерфейса может в конечном итоге решить эту проблему)
    ° реализация интерфейса создает отношения и иерархию типа isa/instanceof
  • Избегайте "проблемы выражений", позволяя независимым расширениям набора типов, протоколов и реализации протоколов для типов различными сторонами
    ° сделать это без упаковщиков / адаптеров
  • Поддержка 90% случаев мультиметодов (одна отправка по типу) при обеспечении абстракции / организации более высокого уровня

Ссылка: http://clojure.org/protocols