在elixir中共享相同功能的設計模式是什麼?在elixir中共享相同功能的設計模式是什麼?
例如, 我有一個應用程序「採取」結構,「轉換」結構爲不同的格式,並「推」到某些存儲。 我有3個結構,通過這條管道,有3個轉換規則和3個存儲。
項目使用gen_stage
包,它有如下結構:
(book) |producer| -> |transformer| -> |indexer|
(article)|producer| -> |transformer| -> |indexer|
(post) |producer| -> |transformer| -> |indexer|
每一級是一個單獨的模塊,即Book.Producer,Book.Transformer,Book.Indexer。
階段在同一垂直線上做相同的東西但與不同的實體。即Book.Producer採取從數據庫書籍,Article.Producer採取從數據庫物品等
的「從數據庫中以」片是相當普遍的,並在所有的管道,可以重複使用,即
alias Experimental.GenStage
defmodule Books.Producer do
use GenStage
def start_link do
GenStage.start_link(__MODULE__, [], name: __MODULE__)
end
def init([]) do
{:producer, []}
end
def handle_demand(demand, processed) when demand > 0 do
events = Repo.all Book
{:noreply, events, processed ++ events}
end
end
變換器對由數據庫產生的實體運行一個函數。索引器將變壓器記錄推入另一個存儲器。
在一個有很多重複的幼稚方法中,我可以在所有這些步驟中完成9個(書3個,文章3個,Post 3個)模塊。
我有什麼選擇來提取類似功能的位並在使用它的模塊之間共享它。
也許我可以通過在初始化階段傳遞參數來配置它,或者只是仍然有9個模塊,但重構函數到另一個模塊中。最佳做法是什麼?
如果不知道9個函數/模塊之間的數據結構究竟是什麼共同的以及特定的結構,這有點難以回答。你能否包含一些實際的代碼? – Dogbert
@Dogbert我試圖儘可能的明確,沒有太多真實的代碼,但我添加了一個例子來說明什麼是「常見」。謝謝! –