在模块中有多个代理是否可以?例如,我正在创建一个游戏,我需要一个游戏状态的包装器以及用户状态的包装器。一个例子:
defmodule TicTacToe do
def start_game do
Agent.start_link(..., name: Moves)
Agent.start_link(..., name: Users)
end
end
文档中的示例显示单个Agent.start_link
,这使我认为不应该只有一个代理。
答案 0 :(得分:3)
虽然拥有尽可能多的Agent
s(它们仍然是erlang的gen_server
是绝对合法的,但在这种特殊情况下,没有必要使用两个代理。< / p>
经验法则是“不要产生多余的服务器。”
一张带有:moves
和:users
键的地图就足够了:
@doc """
Starts a new single agent for both moves and users.
"""
def start_link do
Agent.start_link(fn -> %{moves: %{}, users: %{}} end)
end
@doc """
Gets a move by `key`.
"""
def get_move(key) do
Agent.get(&get_in(&1, [:moves, key]))
end
在这里,我们使用深层地图挖掘Kernel.get_in/2
。这是可取的方式,因为只要你编写健壮的应用程序,就应该关注崩溃时的数据一致性,并且更容易只关注一个Agent
,而不是保持其中许多一致。