defmulti против defprotocol? - PullRequest
       19

defmulti против defprotocol?

7 голосов
/ 18 января 2012

Кажется, что оба могут использоваться для определения функций, которые вы можете реализовать позже, с различными типами данных.AFAIK главное отличие в том, что defmulti работает на картах, а defprotocol работает на записях.

Какие еще различия есть?Каковы преимущества использования одного над другим?

Ответы [ 2 ]

13 голосов
/ 18 января 2012

Короткая версия: defmulti гораздо более гибкая и общая, в то время как defprotocol работает лучше.

Немного длиннее версия:

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

defmulti - это более общий механизм, в котором вы можете использовать другие объекты, а не только один тип. Эта гибкость сопровождается ухудшением производительности.

Подробнее о протоколах

Подробнее о мультиметодах

5 голосов
/ 19 января 2012

Просто дополнение, чтобы покрыть мотивацию, ответ Corvuscorax хорошо описывает оригинальный вопрос.

Изначально Clojure имел только мультиметоды и очень рано задумался над созданием абстракции , которая могла бы очень хорошо обрабатывать все случаи и не заставляла бы людей структурировать свои абстракции. вокруг ограничения абстракций, предлагаемых языком.

По мере того, как Clojure созревал, желание создать «clojure in clojure» требовало абстракций, которые, по крайней мере, теоретически способны генерировать любой байт-код, который может быть создан с помощью Java, и, следовательно, необходимы протоколы , абстракция диспетчеризации. что более близко соответствует нативной Java.
Clojure обладает сильным идеалом «охватить вашу платформу», и протоколы очень хорошо подходят для этого мышления.

...