Контекст
Расскажу про ужасный паттерн, который разгребаю уже в третьем проекте. Что самое ужасное, он попадается в Кложе. Вы, наверное, слышали, что в Кложе только пони и радуга, там не отцветает жасмин и не смолкает пение птиц? На самом деле в ней так быдлокодят, что тушите свет.
Речь о паттерне “контекст”. Это когда через приложение прокидывается мапа, в которой:
- текущий запрос
- текущие пользователь, сессия, токен
- подключение к базе
- подключение к Эластику
- подключение к кешу
- прочитанные файлы-справочники, например классификаторы, валюты и прочее
- переменные среды
- настройки логирования
- подключение к очереди задач
- еще миллион разных ключей
Эта мапа гуляет по стектрейсу, при этом каждый участник что-то оттуда читает или складывает свое барахло. Увидев в коде ctx или context, нужно отматывать на три экрана вверх, чтобы понять, кто и что туда сложил.
Случайный принт этой мапы убивает Емакс, потому что он захлебывается в выхлопе и попытке его распарсить. Знаю как обойти, но все же.
Отдельные гении оборачивают мапу в атом, чтобы она стала мутабельной! В результате ищи-свищи, кто поправил это поле по всему стеку вызовов.
Вот прямо сейчас, дорогая редакция: человек кладет в контекст подключение к базе. Ниже по стеку он берет подключение из контекста, открывает в нем транзакцию и снова кладет в контекст поверх старого, чтобы все, кто ниже, работали с транзакционным подключением. Такая схема ломается в два счета, что я и сделал, а затем два дня искал, почему посыпались данные в базе…
Интересно, что в Кложе есть библиотеки Component, Integrant и Mount для управления системой компонентов. У каждой плюсы и минусы, но выбрать есть из чего — не говоря о том, что некоторые ребята пишут свои менеджеры систем. Но найдется умник, который скажет — это скучно, джава-вей, давайте через мапку прокидывать.
Другими словами, человек не знает, как организовать зависимости между компонентами. Он выбирает самое глупое решение — хранить все в одном месте — и маскирует провал рассказами о простоте и докладами Рича Хикии.
Словом, знайте — в проектах на Кложе много любительского быдлокода. Порой я жалею, что нет фреймворка уровня Джанги, где все прибито гвоздями и за шаг в сторону — расстрел. Глядишь, hammock driven-девелоперы чему-нибудь подучились.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter
gvoropaev, 24th Jun 2024, link
Правильно ли я понимаю, что в идеальном решении функции из низкоуровневых модулей должны запрашивать у менеджера компонентов свои зависимости (подключения, курсоры etc)?
На первый взгляд кажется, что можно сделать проще, если при вызове этих функций в них эти зависимости передавать явно.
Ivan Grishaev, 24th Jun 2024, link
Не совсем понял ваш комментарий. В идеальном решении стояние делится на компоненты, и каждый компонент включается в нужном порядке. Если одному компоненту нужен другой, это описано в зависимостях. Компонент можно передать в функцию, а можно и функцию сделать компонентом, который замкнут на зависимостях.
gvoropaev, 25th Jun 2024, link
Понятно, спасибо за развернутое объяснение 👍🏻