以下を改善する
- GenServerを直接呼び出さなければいけない
- サーバープロセスの名前を覚えておく必要がある
改善策は以下の通り
- GenServerの呼び出しをラップする関数を用意する
- start_link
- next_number
- increment_number
- サーバーにモジュール名と同じ名前を付ける
goh@goh% iex -S mix
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Compiling 1 file (.ex)
warning: function init/1 required by behaviour GenServer is not implemented (in module Sequence.Server).
We will inject a default implementation for now:
def init(args) do
{:ok, args}
end
You can copy the implementation above or define your own that converts the arguments given to GenServer.start_link/3 to the server state.
lib/sequence/server.ex:1
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
> Sequence.Server.start_link 123
{:ok, #PID<0.131.0>}
> Sequence.Server.next_number
123
> Sequence.Server.next_number
124
> Sequence.Server.increment_number 100
:ok
> Sequence.Server.next_number
225
OTP GenServerは、メッセージハンドリングを抽象化したElixirのプロセス
- メッセージループが定義されている
- 状態の変数を管理している
- メッセージループはサーバーモジュール内で定義したコールバック関数を呼び出す
- 詳しいトレースを提供する
APIをモジュール関数でラップすることで、インターフェースと実装が分離された