2016-12-18 69 views
0

模塊中有多個代理可以嗎?例如,我正在創建一個遊戲,我需要一個遊戲狀態的包裝以及用戶狀態的包裝。舉個例子:單個模塊中有多個代理

defmodule TicTacToe do 

    def start_game do 
    Agent.start_link(..., name: Moves) 
    Agent.start_link(..., name: Users) 
    end 

end 

在文檔中的示例顯示一個Agent.start_link這讓我覺得不應該有一個以上的代理。

回答

3

雖然根據需要有儘可能多的Agent是絕對合法的(它們仍然是erlang的gen_server),但在這種特殊情況下不需要兩個代理。

經驗法則是「不產生多餘的服務器。」

地圖,一次按鍵: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,而不是讓它們保持一致。