Красная или синяя?
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.
ОО подход делает код понимаемым (прим. пер.: поддерживаемым) по средствам инкапсуляции движущихся частей (прим. пер.: изменяемого состояния). ФП делает код поддерживаемым по средствам минимизации изменяемого состояния.
А такой стиль не является ОО, т.к. не инкапсулирует "двигающиеся части" (состояние, структуру User в данном случае).
ООПный код был бы примерно такой:
val rs = usersTable.findUser(id)
val user = User(rs)
user.resetPassword()
user.saveTo(db)
Поэтому единственный способ сделать такой код поддерживамым - это ФП (а дизайн - ООД).
И положа руку на сердце, ваши сервисы - это неймспейсы чистых функций, или пакеты процедур с побочками? Мои всё ещё как правило - пакеты процедур. Где-то гайдлайн такой, где-то инфраструктуры нет, а где-то это тупо быстрее и привычнее.
Но в последнее время проекты с удачно сложившимися звёздами, мне удаётся сделать в ФП-стиле. И оно того стоит.
А какую таблетку выбираете вы?:)