1

私はErlangが初めてで、単純なゲームサーバーを構築しようとしています(学習目的)。

複数のクライアント ハンドラー (gen_server) を作成する 1 つのクライアント コントローラー (スーパーバイザー) があります。複数のゲーム ハンドラー (gen_server) を作成する 1 つのゲーム コントローラー (スーパーバイザー) もあります。

次に、1 つのゲーム ハンドラ (ゲーム テーブル) が複数のクライアント ハンドラ (プレイヤー) と通信します。次のようなクライアント ハンドラーを作成します。

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

編集:タイプミス

4

1 に答える 1

0

はい、そのように実装の詳細を抽象化することは良い習慣と考えられています。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渡します。)GameHandlerIdmake_move

于 2014-05-08T12:09:55.147 に答える