Было бы плохо по нескольким причинам:
- В этом нет необходимости - в JavaScript мы делаем это для использования простых карт в качестве Java-подобных объектов. В Clojure, если вы действительно хотите это сделать, вы можете использовать реальный объект Java через взаимодействие Java.
- Независимо от того, помещаете ли вы функции в карты или используете настоящий объект Java, вы занимаетесь объектно-ориентированным программированием в языковой среде, которая была разработана для функционального программирования. Первое, что вызывает беспокойство, это то, что ваш код не поместится в . Это выглядело бы странно, неуклюже и, возможно, даже слишком сложно в Clojure. На данный момент я не говорю, что ООП - это обязательно плохо, просто лучше писать ООП на языках, разработанных для него.
- Наиболее важный момент против такого стиля кодирования состоит в том, что ООП-подобная программа неизбежно будет полагаться на объекты, которые имеют некоторое состояние, и их функции-члены (вроде методов), которые изменяют это состояние. Если вы используете состояние, то ваши функции не чисты, и вы не можете использовать все функциональные возможности, такие как простое распараллеливание.
Короче говоря, если вы используете Clojure для выполнения ООП, вы будете только раздражены. Вы можете сделать ООП легче на тоннах других языков, как, например, Groovy. Если вы хотите использовать Clojure, сделайте это функциональным способом.
До сих пор я писал, чтобы не делать это и почему бы не сделать это. Теперь вы можете спросить меня: Итак, как мне писать функции в Clojure?
Напишите функции, которые принимают вашу структуру данных (то есть карту, список, объект ... что угодно) в качестве параметра. Итак, вместо:
foo.bar();
Вы бы определили это так:
(defn bar [foo]
;stuff
)
И назовите это так:
(bar foo)
Теперь для чистой функции bar
, foo
объект не изменяется после оценки функции, и у вас нет общего состояния объекта, о котором стоит беспокоиться, если вы решите распараллелить свой код, что вы бы если бы вы делали вещи ООП способом.
Кроме того, это может выглядеть как небольшая разница, но обратите внимание, что определение функции bar
является сущностью, полностью независимой от структуры данных foo
. Кроме того, foo
содержит только данные, а не поведение - все поведение находится в функции. Такое разделение дает вам гораздо большую свободу при кодировании.