Я прочитал несколько комментариев здесь и в других местах, предполагая, что словарь процессов Эрланга был плохой идеей и должен умереть. Обычно, как новичок в Erlang, я бы просто избегал этого. Однако в этой ситуации другие мои варианты не очень хороши.
У меня есть главная диспетчерская функция, которая выглядит примерно так:
dispatch(State) ->
receive
{cmd1, Params} ->
NewState = do_cmd1_stuff(Params, State),
dispatch(NewState);
{cmd2, Params} ->
NewState = do_cmd2_stuff(Params, State),
dispatch(NewState);
BadMsg ->
log_error(BadMsg),
dispatch(State)
end.
Очевидно, мои имена более значимы для меня, но в этом суть. В глубине функции, вызываемой функцией, вызываемой функцией do_cmd2_stuff (), я хочу отправлять сообщения всем своим пользователям, рассказывая им о том, что я сделал. Для этого мне нужно получить список пользователей с того места, куда я отправляю сообщения. Список пользователей нелегко придерживаться глобального состояния, поскольку это всего лишь одна структура данных, представляющая единственный блок данных, над которым я работаю.
На мой взгляд, у меня есть пара неприятных вариантов, кроме использования словаря процессов. Я могу отправить список пользователей через все различные уровни функций до самого нижнего уровня, который выполняет вещание. Это неприятно, потому что все мои функции получают параметр, независимо от того, заботятся ли они об этом или нет.
В качестве альтернативы, я мог бы заставить все функции do_cmdN_stuff()
вернуть сообщение для отправки. Это тоже не очень хорошо, так как отправка сообщения может быть не последней вещью, которую я хочу сделать, и она загромождает моего диспетчера кучей {Msg, NewState}
кортежей. Кроме того, некоторые функции могут не иметь сообщений для отправки.
Как я уже говорил ранее, я очень плохо знаком с Эрлангом. Может быть, кто-то с большим опытом может указать мне на лучший путь. Есть один? Подходит ли словарь процессов в этом случае?