дефмульти против дефпротокола?

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

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


person wrongusername    schedule 18.01.2012    source источник


Ответы (2)


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

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

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

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

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

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

person corvuscorax    schedule 18.01.2012
comment
Ага, спасибо! Также кажется, что функции не нужно объявлять вместе, как требует extend-type. Это правильно? - person wrongusername; 18.01.2012
comment
Вы можете думать о протоколе как о интерфейсе Java. Итак, с defprotocol вам нужно объявить функции вместе. Объявление мультиметода — это одна вещь, но определения defmethod не обязательно должны быть вместе. - person corvuscorax; 18.01.2012

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

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

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

person Arthur Ulfeldt    schedule 19.01.2012
comment
Я понимаю. Итак, в чем преимущество написания Clojure на Clojure? - person wrongusername; 19.01.2012
comment
Одна из причин — возможность писать на Clojure на более высоком уровне абстракции. Это похоже на написание компилятора C на C, а не на ассемблере. Это также упростит выполнение таких вещей, как ClojureScript, и упростит синхронизацию CLR-порта Clojure с версией JVM. Кроме того, это круто и элегантно в духе Геделя, Эшера и Баха :-) - person corvuscorax; 19.01.2012