Ответ 1
Я думаю, что первый вариант лучше. Это более расширяемо, в зависимости от того, как эти объекты будут использоваться. Легче добавить или изменить новую функцию, которая работает с существующим объектом, если функции и объекты являются отдельными. В Clojure обычно не так много причин связывать функции вместе с объектами, над которыми они работают, если вы действительно не хотите скрывать детали реализации от пользователей вашего кода.
Если вы пишете интерфейс, для которого вы ожидаете многих реализаций, рассмотрите возможность использования multimethods. Вы можете по умолчанию выбросить исключение "не реализовано", чтобы заставить разработчиков реализовать интерфейс.
Как Gutzofter, если единственная причина, по которой вы рассматриваете второй вариант, - это позволить людям не вводить параметр при каждом вызове функции, вы можете подумать о том, что все ваши функции используют некоторый var в качестве объекта сокета по умолчанию и пишут макрос with-socket
, который использует binding
для установки этого значения var. См. Встроенные методы печати, которые по умолчанию используют значение *out*
в качестве выходного потока, и with-out-str
, который связывает *out*
с писателем строки, как пример Clojure.
Эта статья может вас заинтересовать; он сравнивает и противопоставляет некоторые идиомы ООП с эквивалентами Clojure.