IMHO - オブザーバーは、私は彼らがそう考える理由の数を通過します
を吸います。これは一般的にbefore_xまたはafter_xメソッドの使用にも当てはまります。これは一般的なObserverのより細かい例です。
は難しい、適切なユニットテスト通常
を書くためにあなたはユニットテストを書くとき、あなたは機能の特定の部分をテストしているします。しかし、オブザーバーをテストするには、イベントをテストするためにイベントをトリガーする必要があります。時にはそれはまったく不便です。
など。オブザーバをbefore_saveに接続してコードをトリガするには、モデルを保存する必要があります。これは、あなたが永続性ではなくビジネスロジックをテストしていることを考えると、テストするのは難しいことです。保存したものを模倣すると、トリガーが機能しないことがあります。あなたがそれを保存させると、あなたのテストは遅くなります。
状態
オブザーバーはテストが困難になる傾向があるという事実に続き必要、オブザーバーはまた、国家の多くを必要とする傾向があります。その理由は、オブザーバーのロジックがさまざまな「ビジネスイベント」を区別しようとしているためであり、そうする唯一の方法はオブジェクトの状態を見ることです。これはテストで多くのセットアップを必要とするため、テストが難しく、面倒で問題になります。
意図しない結果
間違いなく、あなたはちょうどあなたが複数の観測をフックすることができますので、あなたはさまざまな動作をトリガすることができるもの見当がつかないことを経験しています。これは意図しない結果につながります。統合/システムテスト(ゆっくりとしたフィードバック)によってのみ取り上げることができます。あなたのオブザーバーを追跡することも、あまり面白くありません。
注文仮定の問題
観察者がで蹴ることがある。あなたはそれがキックオフされることだけが保証されている保証はありません。ビジネスルールの一部として暗黙の注文がある場合、オブザーバーは間違っています。
が悪いの設計につながるオブザーバーをフックして、物事を追加する貧しいデザインに
をリードしています。それは、保存したり、削除したり、イベントを作成したりするのに便利ですが、理解しづらいこともあります。例えば。ユーザーを保存すると、ユーザーの詳細を更新しているか、新しいアカウント名を追加している可能性があります。あなたがオブジェクトに対して特に行うことができることを知ることは、メソッドと意味のあるアクションベースの名前を持つ理由の一部です。すべてがオブザーバーであれば、これは失われ、すべてがイベントに応答しています。そして、観測ロジック内では、どのビジネスイベントに属するイベントを区別しようとする傾向があります。
オブザーバが素晴らしい場所がいくつかありますが、通常は例外です。コールバックを介して暗黙的にロジックをエンコードするのではなく、明示的にできることを移植する方がはるかに優れています。
、(ビジネスロジック)の配列である[ユースケース](http://webuild.envato.com/blog/a-case-for-use-cases/)を使用することを検討すべき手順実行される。独自のユースケースをロールするのは難しくありませんが、いくつかのまともな宝石もあります。 [solid_use_case(https://github.com/mindeavor/solid_use_case)または[USE_CASE(https://github.com/cjohansen/use_case) – Dennis