Красная или синяя?

January 22, 2021

Меня тут осенило. Возьмём вот такой кусочек кода на кложуре (чисто функциональном языке):

(def users-service (new-users-service conn))
(my-app.users/reset-password usersService user)

Здесь переменная users-service биндится на какое-то значение возвращаемое функцией new-users-service, которая на вход получает некий conn, а потом вызывается функция reset-password из неймспейса my-app.users с параметрами users-service и user.

А потом сделаем несколько трансформаций.

Вжух, переносим скобку, меняем def на val и добавляем =:

val users-service = new-users-service(conn)
my-app.users/reset-password users-service(user)

Вжух, меняем кебаб на камел кейс:

val usersService = newUsersService(conn)
my_app.users/resetPassword usersService(user)

Вжух, меняем неймспейс на объект:

val usersService = UsersService(conn)
usersService.resetPassword(user)

И вишенка, на торте, чтобы по СОЛИДнее было:

val usersService: UsersService = UsersServiceImpl(conn)
usersService.resetPassword(user)

Знакомый код? Если у вас бэк на спринге, то готов поставить тыщу, что у вас где-то есть com.my_company.my_app.services.UserService🙂.

При том:

OO makes code understandable by encapsulating moving parts. FP makes code understandable by minimizing moving parts.


ОО подход делает код понимаемым (прим. пер.: поддерживаемым) по средствам инкапсуляции движущихся частей (прим. пер.: изменяемого состояния). ФП делает код поддерживаемым по средствам минимизации изменяемого состояния.

Майкла Фэзерса, https://twitter.com/mfeathers/status/29581296216?lang=en

А такой стиль не является ОО, т.к. не инкапсулирует "двигающиеся части" (состояние, структуру User в данном случае).

ООПный код был бы примерно такой:

val rs = usersTable.findUser(id)
val user = User(rs)
user.resetPassword()
user.saveTo(db)

Поэтому единственный способ сделать такой код поддерживамым - это ФП (а дизайн - ООД).

И положа руку на сердце, ваши сервисы - это неймспейсы чистых функций, или пакеты процедур с побочками? Мои всё ещё как правило - пакеты процедур. Где-то гайдлайн такой, где-то инфраструктуры нет, а где-то это тупо быстрее и привычнее.

Но в последнее время проекты с удачно сложившимися звёздами, мне удаётся сделать в ФП-стиле. И оно того стоит.

А какую таблетку выбираете вы?:)