Skip to content

Latest commit

 

History

History
51 lines (39 loc) · 1.61 KB

16.5.md

File metadata and controls

51 lines (39 loc) · 1.61 KB

16.5 インターフェースの整理

以下を改善する

  • 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をモジュール関数でラップすることで、インターフェースと実装が分離された