問題タブ [chain-of-responsibility]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - wpf イベントと一連の責任パターン
wpf からのルーティング イベントには、一連の責任パターンと共通点がありますか?
私はこれをグーグルで検索しましたが、これについて話している人は誰もいません:S、ルーティングされたイベントはそのパターンの実装であるとは思いますが
wpf - WPF で使用されるパターン
私は約 1 年前から WPF に深く関わってきました。多くのことが新しく、頭を悩ませることが時々あります。
同時に、GOF Design Patterns の本を読み直しています。
あるパターンがまさに WPF 機能で使用されているパターンであることに気付いたので、何度か途中でやめました。そのような認識が私を襲ったときはいつでも、関連する WPF の原則に対する理解が大きく飛躍したように感じます。それは一種のアハ効果のようなものです。
また、関連するパターンを説明するドキュメントが非常に優れているため、たとえば Prism を理解するのがはるかに簡単になったことにも気付きました。
だからここに私の「質問」があります(努力のようなものです):
私たち全員が WPF をよりよく理解するのを助けるために、WPF の設計パターンを「見つけた」人が簡単な説明をしてくれると助かります。
私が見つけた非常に明白な例の 1 つは、ルーティング イベントです。
子コントロールによってイベントが検出され、ハンドラーが指定されていない場合、イベントが最終的に処理されるか、親が見つからなくなるまで、親に渡されます。
ウィンドウ内にある StackPanel 内にあるボタンに画像があるとしましょう。ユーザーが画像をクリックすると、イベントはそれによって処理されるか (処理コードが指定されている場合)、いずれかのコントロールが処理するまで「バブル」します。したがって、各コントロールはこの順序で反応する機会を得ます。
- 画像
- ボタン
- スタックパネル
- 窓
コントロールがそれを処理すると、バブリングは停止します。
これは簡単な説明です。より正確な説明については、WPF の文献を参照してください。
この種の機能は、"チェーン オブ レスポンシビリティ デザイン パターン" を表しています。これは、要求が要求である場合、責任チェーンに沿って渡され、その中の各オブジェクトにそれを処理する機会を与えることを示しています。リクエストの送信者は、誰がそれを処理するのか分からないため、分離が保証されます。詳細な説明については、リンクをたどってください。
ここでの目的は、この (一見 10 年以上前の) アイデアがどのようにして現在のテクノロジに組み込まれたかを示し、別の見方を提供することです。
最初はこれで十分だと思います。ここでさらに多くの類似点が収集されることを願っています。
乾杯、トルステン
design-patterns - これはパイプライン、責任の連鎖、または他の何かでしょうか?
私は、パイプラインと責任の連鎖の奇妙な融合のように見えるマルチプロセスアーキテクチャを構築しています。基本的に、私はキューによってリンクされたハンドラーのチェーンを持っています。各ハンドラーは、入力データを表すオブジェクトを受け取り、それを次のハンドラーに転送して作業を開始できるようにし、そのデータで何かできるかどうかを判断します。
あるステップが次のステップに実際には依存しないため、これをパイプラインと呼ぶことができるとは思いません。また、1つのハンドラーが他のハンドラーによるそのデータの処理を阻止できないため、これは従来の責任の連鎖ではないようです。このアーキテクチャを文書化するのに役立つこのデザインの名前はありますか?それとも、「責任のパイプライン」のようなものと呼ぶ必要がありますか?
design-patterns - Composite + ChainofResponsibilityの例
誰かがデザインパターンCompositeとChainofResponsibilityを一緒に使用する実際的な例を挙げられますか?
ありがとう
c# - C#デリゲートとの責任の連鎖
私の理解の目的で、Chain-Of-Responsibilityパターンを実装しました。
質問
責任の連鎖を断ち切ることなく、デリゲートとイベントを適用してコードを書き直すにはどうすればよいですか?
java - Java での instanceof の回避
「instanceof」操作のチェーンを持つことは、「コードの匂い」と見なされます。標準的な答えは、「ポリモーフィズムを使用する」です。この場合、どうすればよいでしょうか?
基本クラスにはいくつかのサブクラスがあります。それらのどれも私の管理下にはありません。同様の状況は、Java クラスの Integer、Double、BigDecimal などにも当てはまります。
私は NumberStuff などを制御できます。
数行で済むところに多くのコード行を使用したくありません。(時々、Integer.class を IntegerStuff のインスタンスに、BigDecimal.class を BigDecimalStuff のインスタンスにマッピングする HashMap を作成します。しかし、今日はもっと単純なものが必要です。)
私はこのような単純なものが欲しいです:
しかし、Java はそのようには機能しません。
書式設定時に静的メソッドを使用したいと思います。私が書式設定しているものは複合であり、Thing1 には配列 Thing2 を含めることができ、Thing2 には Thing1 の配列を含めることができます。次のようにフォーマッターを実装したときに問題が発生しました。
はい、私は HashMap を知っており、もう少しコードを修正することもできます。しかし、「instanceof」は比較すると非常に読みやすく、保守しやすいようです。シンプルだけど臭くないものってありますか?
2010 年 5 月 10 日に追加された注:
新しいサブクラスが将来追加される可能性が高く、既存のコードでそれらを適切に処理する必要があることがわかりました。その場合、クラスが見つからないため、クラスの HashMap は機能しません。最も具体的なものから始まり、最も一般的なもので終わる一連の if ステートメントは、結局のところ、おそらく最適です。
chain-of-responsibility - 責任パターンの連鎖: 相互に依存するハンドラーを持つことは良い習慣ですか?
私はこのシナリオを持っています: 私は一連のクエリ ハンドラーを持っています。キャッシュが応答できない場合、または応答が古い場合はキャッシュをクエリし、応答が見つからない場合はデータベースにアクセスします。回答が再び古くなっている場合は、リモート Web サービスにクエリを実行してください。
しかし、これがこのパターンを使用する正しい方法であるかどうかはわかりません。ワークフローはほぼ固定されており、キャッシュとデータベース ハンドラーは次のステップの戻り結果に依存してレコードを更新するためです。
ruby - Ruby における責任の連鎖と alias_method の問題
ポリモーフィック オブジェクトの Ruby と ActiveRecord で一連の責任パターンを実装しようとしています。いくつか問題があります。
- alias_method しようとすると、メソッドが定義されていないというエラーが表示されることがあります。
- エイリアス化された関数 (original_method) が original_method を呼び出すメソッドを呼び出す無限チェーンの束を取得します。これは、既に上書きされているメソッドにエイリアスを付けると、本質的に「original_method」をエイリアス化されたメソッドのコピーにするためかどうか疑問に思っています。
- 私は現在、「連鎖」のような関数に、定義されたすべてのメソッドを含む Setting のサブクラスを返させることでこれを回避していますが、クラス内の alias_method に非常に多くの問題があった理由に興味があります。
次に例を示します。
次に、Setting オブジェクトがあります。
c# - C# - ステータスなどの変更があった場合、オブジェクトは履歴オブジェクトの作成を担当する必要がありますか?
これは何よりもアーキテクチャ/ベスト プラクティスに関する質問なので、遠慮なく 2 セント追加してください。タイトルにステータスを記載したことは知っていますが、これはオブジェクトの基本的なプロパティに当てはまります。以下のアカウントの例は、私の質問をステータスよりも少しよく示すのに役立つと思います.
サンプルの Account オブジェクトを次に示します。
ここで、トランザクションがこのオブジェクトに追加されるたびに履歴を保持し始めたいとしましょう。
このレベルでは、通常、アカウント オブジェクトに履歴イベントのコレクションを追加し、次のように AddTransaction() メソッド内に履歴イベントを作成するコード行を追加します。
次の部分は、問題が発生し始めるところです。一括転記を行いたいとします。この一括転記でどのアカウントが変更されたかの記録を、レポートのようなもののために、または後で元に戻す必要がある場合に保持したいとします。だから私はこのようなオブジェクトを作成します。
ここから、上記のサンプル コードでは処理できないため、これを処理するためのいくつかの異なるオプションが表示されます。
1) AddTransaction() メソッドを呼び出してアカウントのリストをループし、HistoryGroup に関連付けられた履歴レコードを作成するサービス タイプ オブジェクト内に関数を作成します。
2) 追加するトランザクションとともに、ある種の HistoryManager オブジェクトを AddTransaction メソッドに渡します。次に、関数は履歴マネージャーを使用してレコードを作成できます。
わかりました、この投稿は十分に長いです。私が十分に明確でない場合は、私に知らせてください。ご入力いただきありがとうございます。