2016-08-13 3 views
1

エリクサーでクロスカッティングの問題を実行する方法は何ですか?ユーザーが電子メールを購読していないかどうかを確認したいとします。電子メール送信機能が実行される前にそれを行うことは可能でしょうか? Elixirのドキュメントでは、他の関数のインターリーブについては何も見つかりません。before_filterのように、スタンドアローンのElixirアプリケーションと同じです。通知、マーケティング、トランザクションなど、複数のメールが送信される可能性があります。これらの機能のそれぞれに手動でチェックすることはあまりにも不可欠です。エリクサーの方がいいですか?エリクサー - クロスカッティングの関心事

+0

これは私の意見ではありますが、ユーザを受け入れ、購読しているかどうかをチェックし、そうであれば電子メールを送信するという機能を持つ特別なモジュールを書くことができると思います。それで、あなたが必要としている場所であれば、このモジュールを使うことができます。このように明示的になり、コールバックの魔法をあなたに残すことはありません。 – JustMichael

+0

@JustMichael - 繰り返しはありませんか?私はモジュールも考えていますが、その電子メールモジュールのすべての機能が同じことをする必要があるため、すべての機能で同じことをチェックすることはDRYの原則には従いません。また、私は別の選択肢を見ていますエリクサーは、言語を学ぶことを試みている間に提供します – sat

+0

ドライ原則は法律ではありません - 良いガイドラインです。繰り返しを避けることができないこともあります。コードを繰り返さないことは大きな目標ですが、読みやすく保守可能なコードも重要です。それに、AOPがこれをどのように成し遂げたと思いますか?これを行うためにコードを繰り返さないと思いますか?それはただの視界から隠されているだけです。 –

答えて

0

レールでは、before_filterを使用すると、実際にはデザインが不良になります。そのようにコード化する方が簡単だと分かっていますが、しばらくするとコードベースが成長し、それらのコールバックにさらにロジックを追加し、それらの制御を緩めるようになります。

単純な関数を使用してコールバックなしで同じことを行うことができ、コントロールを避けて推論することができます。

は、あなたが複数のメール送信機能

defmodule Mailer do 
    def send_email1(params) do 
    # do work 
    end 

    def send_email2(params) do 
    end 

    # ... 
end 

代わりのあなたは、単に右それらの機能のそれぞれにコードを追加することができますいくつかの並べ替えのbefore_filterを追加することがありますモジュールがあるとしましょうか?それは、何が起こっているのかを簡単に理解するのが簡単です。

defmodule Mailer do 
    def send_email1(params) do 
    if can_send?(params) do 
     # do work 
    end 
    end 

    # ... 
end 

ロジックが重複しています。まあ...チェックロジックを新しい関数に移すことができ、少なくともこれらの各関数からifを削除することができます。しかし、新しい抽象化を作成して共有論理を維持することもできます。

defmodule Mailer do 
    def send_email(email_name, params) do 
    if can_send?(params) do 
     do_send_email(email_name, params) 
    end 
    end 

    defp do_send_email("email1", params) do 
    # do work 
    end 
    # ... 
end 

これは、コールバックを使用する任意の方法よりも簡単なコードです。あなたはそれを支配します。また、共有ロジックを追加または変更したり、必要に応じて条件ロジックを追加するのは簡単です。

0

エリクシルのmodule attributesを使用して、テールコール最適化関数呼び出しの連鎖を開始するのが好きです。これにより、コールバックをすべて1か所で簡単に宣言できます。

関連する問題