Объединение Clojure defprotocol и defrecord

Насколько я могу судить, если я хочу определить протокол (defprotocol), который будет реализован только одним defrecord, мне все равно придется сначала определить протокол, а затем определить defrecord, который реализует это:

(defprotocol AProtocol
 (a-method [this])
 (b-method [this that]))
(defrecord ARecord [a-field b-field]
 AProtocol
 (a-method [this] ...)
 (b-method [this that] ...))

Нет ли способа объединить два, возможно, с анонимным протоколом?

2 ответа

Не делай этого. Протокол "private" или "анонимный", который реализует ваша запись, просто изобретает бессмысленную версию ООП на языке, который имеет лучшие варианты. Определите обычную старую функцию, которая работает с вашими записями; нет причин, по которым он должен быть физически привязан к ним.

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


Да, это абсолютно правильно:)

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

licensed under cc by-sa 3.0 with attribution.