[elixir! #0074] 從 child_spec 看回調模式

回調(callback)是編程中常常會用到的一種模式,在 elixir 中咱們一般經過假定一個些模塊裏面包含了一些符合特定函數簽名的函數定義,或者說這個模塊實現了某種 behaviour,來進行回調編程。這種編程模式的好處是能夠將回調的實現模塊進行升級或者替換,而不改變回調的函數簽名,從而不破壞調用者的代碼。編程

在 Supervisor 啓動時,咱們須要提供 children 模塊的列表,這裏其實也能夠使用回調:child_spec/1 來實現。咱們來測試一下:設計模式

defmodule O1 do

  # 咱們僞裝啓動了一個進程
  def fake_start(arg) do
    IO.puts("Starting with arg: #{inspect(arg)}!")
    {:ok, self()}
  end

  # 這裏是兩個 Child 的模塊,都實現了 `child_spec/1` 回調
  defmodule Alice do
    def child_spec(arg) do
      %{
        id: __MODULE__,
        start: {O1, :fake_start, [arg]}
      }
    end
  end

  defmodule Carl do
    def child_spec(arg) do
      %{
        id: __MODULE__,
        start: {O1, :fake_start, [arg]}
      }
    end
  end

  def test do
    children = [
      # 第二個元素便是傳給啓動函數的參數
      {Alice, "hi"},
      # 默認的參數是 `[]`
      Carl
    ]

    Supervisor.start_link(children, strategy: :one_for_one)
  end
end

運行一下,能夠看到 Supervisor 啓動成功。回調編程是一種簡單且被普遍應用的設計模式。在 erlang 和 elixir 中,更是被應用到了極致。函數

iex(5)> O1.test
Starting with arg: "hi"!
Starting with arg: []!
{:ok, #PID<0.345.0>}
相關文章
相關標籤/搜索