我是Erlang的新手,我正在尝试构建一个简单的游戏服务器(学习目的)。
我有一个客户端控制器(主管),它创建了多个客户端处理程序(gen_server)。我还有一个游戏控制器(主管),可以创建多个游戏处理程序(gen_server)。
然后,一个游戏处理程序(游戏表)将与几个客户端处理程序(玩家)进行通信。我创建这样的客户端处理程序:
client_handler.erl:
start_link(ClientId, UniqueId) ->
ClientHandlerId = utils:create_id(?MODULE, UniqueId), //client_handler_0
State = #state{client_id = ClientId, client_handler_id = ClientHandlerId},
gen_server:start_link({global, ClientHandlerId}, ?MODULE, State, []).
game_handler.erl:
start_link(ClientHandlerId, GameId, UniqueId) ->
GameHandlerId = utils:create_id(?MODULE, UniqueId), //game_handler_0
State = #state{client_handler_id = ClientHandlerId, game_id = GameId, game_handler_id = GameHandlerId},
gen_server:start_link({global, GameHandlerId}, ?MODULE, State, []).
我的问题是我想在client_handler和game_handler之间进行讨论,而他们都不知道他们的内部结构。现在我用:
client_handler.erl:
gen_server:cast(game_handler_0, {make_move, MoveData}).
这很有效。但是,我想使用:
client_handler.erl:
game_handler_0:make_move(MoveData)
因此,我可以为每个模块构建单独的API:仅使用-export函数。这可能吗?
祝你好运, xqtr
编辑:错字
答案 0 :(得分:-1)
是的,以这种方式抽象出实施细节被视为良好做法。只需将cast
调用移至game_handler.erl
中的函数,例如:
make_move(UniqueId, MoveData) ->
GameHandlerId = utils:create_id(?MODULE, UniqueId),
gen_server:cast(GameHandlerId, {make_move, MoveData}).
并导出make_move/2
。 (或者可能忘记UniqueId
,并将GameHandlerId
直接传递给make_move
函数。)