а доставка сообщения не магия?🤷🏻♂️в эрланге весь слой межпроцессного взаимодействия - это сплошная магия, спрятанная от глаз, и вроде все только довольны.
Я хочу знать, что последовательные запуски сервиса приведут к одинаковому результату при том же конфиге. Если там внутре неонка, это может приводить к магии.
Я хочу знать, что последовательные запуски сервиса приведут к одинаковому результату при том же конфиге. Если там внутре неонка, это может приводить к магии.
а чт заставляет думать, что результаты могут быть разными?
ну, или если обнаружит две и более реализации генсервера, то не взлетит с ошибкой "слишком много вариантов для внедрения зависимости, я не знаю что делать" :D
ну так если ты сказал "я буду юзать реализацию поведения А" и сам же дал доступ к двум резным реализациям, то на этой же конфигурации ты будешь гарантированно получать состояние неопределенности и ошибку =)
Если нужно уметь переключаться между реализациями, пусть это лежит в конфиге и дергается через apply, например.
практика показывает, что не нужно. нужен простой механизм "вынуть реализацию А и на ее место впихнуть реализацию Б не затронув код-потребитель", а совместное использование двух разных реализаций это уже какая-то в общем случае дичь
в моём понимании, есть существенная разница между глобальной настройкой (compile time, application env) и динамической передачей поведения в запускаемый код.
Каждому вызову gen_server:start_link мы указываем свой модуль и стартовые данные, а вот логгер мы настраиваем глобально.
Нельзя указать свою имплементацию логгера для конкретного этого ген-сервера
> нужен простой механизм "вынуть реализацию А и на ее место впихнуть реализацию Б не затронув код-потребитель"
Вот этот механизм — это конфигурация, которая затем превращается в apply(ConfiguredM, function, Args). Не вижу необходимости придумывать что-то ещё. Если уж совсем нужно быстро, то можно написать рантайм-генерацию быстрого маппер-модуля, но сомневаюсь что это даст какой-то ощутимый выигрыш, а магии добавит.
есть интерфейс А есть реализация интерфейса А код-потребитель использует сущность, реализующую интерфейс А, которую получит при помощи механизма di в какой-то момент времени выясняется, что существующая реализация интерфейса А полна фатальных недостатков и ее решено переписать создается вторая версия реализации интерфейса А первая версия выпиливается и выбрасывается в мусор в коде-потребителе ничего менять не приходится, потому что новая версия будет все так же найдена механизмом di и внедрена везде, где нужен интерфейс А
совместное и одновременное использование двух реализаций интерфейса А обычно не требуется и не нужно
есть интерфейс А есть реализация интерфейса А код-потребитель использует сущность, реализующую интерфейс А, которую получит при помощи механизма di в какой-то момент времени выясняется, что существующая реализация интерфейса А полна фатальных недостатков и ее решено переписать создается вторая версия реализации интерфейса А первая версия выпиливается и выбрасывается в мусор в коде-потребителе ничего менять не приходится, потому что новая версия будет все так же найдена механизмом di и внедрена везде, где нужен интерфейс А
совместное и одновременное использование двух реализаций интерфейса А обычно не требуется и не нужно
как-то так
кажется, ты сейчас смешиваешь код потребителя, у которого внутри написано: Logger:log() и код той системы, которая как раз передаст значение переменной Logger