Сочетание Clojure defprotocol и defrecord - PullRequest
6 голосов
/ 08 июля 2011

Насколько я могу судить, если я хочу определить протокол (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 ]

11 голосов
/ 08 июля 2011

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

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

4 голосов
/ 08 июля 2011

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

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

...