エリキシル剤で同じ機能を共有するデザインパターンは何ですか?エリキシル剤で同じ機能を共有するためのデザインパターンは何ですか?
たとえば、 私は、構造を「取得」し、構造を別の形式に「変換」し、それをいくつかのストレージに「プッシュ」するアプリを持っています。 私は、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(Book for 3、Article 3、Post for 3)モジュールを持つことができました。
類似の機能のビットを抽出し、それを使用するモジュール間で共有するにはどのようなオプションが必要ですか。
おそらく、初期化段階でパラメータを渡すか、9つのモジュールしか持たず、リファクタリング機能を別のモジュールに渡して構成することができます。ベストプラクティスは何ですか?
これは、正確に何が共通しているのか、また9つの機能/モジュール間でデータの構造に特有なものが分からなければ、少し難解です。実際のコードを含めることはできますか? – Dogbert
@Dogbert私は可能な限り明示しようとしましたが、実際のコードはあまりありませんが、 "共通"なものを示す例を追加しました。ありがとうございました! –