Я прочитал несколько комментариев здесь и в других местах, в которых говорилось, что словарь процессов Erlang был плохой идеей и должен умереть. Обычно, как новичок в 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}
кортежей. Более того, некоторые функции могут иногда не иметь сообщений для отправки.
Как я уже сказал ранее, я новичок в Erlang. Может быть, кто-нибудь с большим опытом подскажет мне лучший путь. Есть один? Подходит ли в этом случае словарь процесса?