問題タブ [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.

0 投票する
8 に答える
400 参照

java - データベースの前にデータを処理するためのアプリケーション設計

Excel ファイル (および csv ファイル) に大量のデータのコレクションがあります。データはデータベース (mysql) に配置する必要があります。ただし、データベースに入る前に処理する必要があります。たとえば、列 1 が列 3 より小さい場合、列 2 に 4 を追加します。情報が永続化される前に、従わなければならない規則がかなりあります。

このタスクを達成するために従うべき良い設計は何でしょうか? (Java を使用)

その他の注意事項

このプロセスは自動化する必要があります。手動でデータを変更する必要がないという意味で。これは、1 行あたり 15 列の情報を持つ数千行のデータのことです。

現在、私は一種の一連の責任設計をセットアップしています。ルールごとに 1 つのクラス (Java)。1 つのルールが完了すると、次のルールが呼び出されます。

より詳しい情報

通常、データ シートごとに約 5000 行あります。この大きな入力は頻繁に発生するわけではないため、速度は大きな問題ではありません。

私はドロールを検討しましたが、タスクがドロールに十分に複雑であるかどうかはわかりませんでした.

ルールの例:

  1. すべての通貨 (特定の列のデータ) に通貨記号を含めることはできません。

  2. カテゴリ名は統一する必要があります (例: book case = bookcase)

  3. エントリー日に将来の日付を指定することはできません

  4. テキスト入力には [AZ 0-9 \s] のみを含めることができます

など。
さらに、情報の列が無効な場合は、処理が完了したときに報告する必要があります (または処理を停止する可能性があります)。

私の現在のソリューションは機能します。ただし、改善の余地があると思うので、どのように改善できるか、または他の人が同様の状況にどのように対処したかについての理想を探しています.

私は (非常に簡単に) drools を使用することを検討しましたが、drools を利用できるほど作業が複雑であるかどうかはわかりませんでした。

0 投票する
2 に答える
893 参照

design-patterns - Chain of Responsibilty パターンに関する既知の「落とし穴」は何ですか?

私は現在のプロジェクトで責任の連鎖パターンを頻繁に使用していることに気づきました (私にとっては 3 回が多い)。解決策について少し熱狂しすぎたのではないかと思っています。具体的には、Apache Commonsチェーン プロジェクトを使用しています。そのため、これまでのところ、アプリ ロジックの複雑で交換可能な多数の部分が、よりまとまりのある組織化された全体に簡素化されていることに非常に感銘を受けました。しかし、このプロジェクトに参加した新しい人々の中には、「それを理解する」のに苦労しているように見える人もいます。それについてあなたの経験は何ですか?その実装でどのような問題に遭遇しましたか?

これまでのところ、私が気づいた唯一の問題は、閉じる必要があるオブジェクトを処理しようとしているときです。これらのオブジェクトを Context クラスに格納すると、チェーンの実行が完了したときに苦労します。コマンドの代わりにフィルターを使用してこれを回避できましたが、close ステートメントはオブジェクトがインスタンス化された場所から非常に離れていることが多いため、少し直感的ではないようです。

いずれにせよ、このパターンについて私より経験のある開発者の意見を聞きたいです。

前もって感謝します。

0 投票する
6 に答える
4421 参照

c++ - 巨大なスイッチステートメントを何に置き換えますか?

いくつかのテンプレート ファイルを解析するコードがあり、プレースホルダーが見つかると、それを値に置き換えます。何かのようなもの:

コードでは、パーサーがそれらを見つけて、次の関数を呼び出します。

元のプレースホルダーを戻り値に置き換えます。

実際には、これはダミーの Web ページではなく、多数 (50 以上) の異なるプレースホルダーが発生する可能性があります。

私のコードは C++ ですが、この問題はどの言語にも存在すると思います。それは、アルゴリズムと OO 設計に関するものだと思います。唯一の重要なことは、動的/評価済みのコードが必要なかったとしても、これをコンパイルする必要があるということです。

Chain of Responsibility パターンの実装について考えましたが、状況があまり改善されないようです。

更新: また、別のスレッドのこのコメントについても心配しています。私はそれを気にする必要がありますか?

0 投票する
2 に答える
1336 参照

c# - Ninject でデコレータを使用して一連の責任を宣言するにはどうすればよいですか?

Ninject でデコレータを使用して一連の責任を宣言したいと思います。

誰もそれをやったことがありますか?

ありがとう。

0 投票する
10 に答える
30539 参照

oop - デコレーターよりも責任の連鎖を使用する必要があるのはなぜですか?

Chain of Responsibilityパターンを読んだところですが、デコレータよりもその使用を好むシナリオを想像するのに苦労しています。

どう思いますか?CoRにはニッチな用途がありますか?

0 投票する
4 に答える
5971 参照

java - 一連の責任とクラスのリストの利点は何ですか?

最近、私は別のプログラマーと、「if」ステートメントでいっぱいの巨大な (1000 行) メソッドをリファクタリングする最善の方法について話し合っていました。

コードは Java で書かれていますが、この問題は C# などの他の言語でも発生する可能性があると思います。

この問題を解決するために、彼は一連の責任パターンを使用することを提案しました。彼は、ベースの「Handler」クラスを持つことを提案しました。次に、「Handler1」、「Handler2」などは「Handler」を拡張します。
次に、ハンドラーには「getSuccessor」メソッドがあり、null (チェーンの最後の場合) またはチェーンの次のハンドラーを返します。
次に、「handleRequest(Request)」関数が Request を処理するか、それをチェーンの次のチェーンに渡します。前の解決策がどれも機能しない場合は、null を返すか、例外をスローします。
チェーンに新しいハンドラを追加するために、コーダーはチェーンの最後の要素に移動し、新しい要素があることを伝えます。何かを行うには、チェーンの最初の要素で handleRequest を呼び出すだけです。

この問題を解決するために、別のアプローチを使用することを提案しました。
前の方法と同じように、「Handler1」、「Handler2」を含む基本「Handler」クラスも必要です。
ただし、「getSuccessor」メソッドはありません。代わりに、ハンドラーのリスト (Vector、ArrayList、またはこの場合に最適なもの) を持つ Collection クラスを使用します。
handleRequest 関数は引き続き存在しますが、呼び出しを次のハンドラーに伝達しません。リクエストを処理するか、null を返すだけです。
リクエストを処理するには、次を使用します

または、コードの重複を防ぐために、「parseRequest(request)」メソッドをコレクション クラスに追加することもできます。新しいハンドラーを追加するには、コレクション コンストラクター (または static{} ブロック、または同等のもの) に移動し、単純にコード「addHandler(new Handler3());」を追加します。

このアプローチでは、責任連鎖のどのような利点が欠けていますか? どの方法が最適ですか (最適な方法があると仮定して) ? なんで?各設計方法が引き起こす潜在的なバグや問題は何ですか?

コンテキストが必要な人のために、元のコードは次のようになります。

0 投票する
2 に答える
254 参照

c# - 複雑なオブジェクトをフィルタリングするものをどのようにテストしますか

関連する 7 つのフィールドを持つ永続オブジェクトがあります。

フィールドは、ここにリストされている値の数を保持できます。

これは、121600 個の固有オブジェクトの可能性です。

テスト対象のコードは、フィールドの値に基づいて特定の数のこれらのオブジェクトを取得し、別のシステムで使用するためにそれらをビンに入れる多数のフィルターです。ビンのデポジットは簡単で、テスト済みで、適切に機能します... フィルタリングが機能していないだけです。カバーされていない多くのエッジケースがあり、多くのオブジェクトがまったく選択されるべきではないときにビンに配置されているか、またはその逆です。

全体として、一連の責任で動作する 9 つのフィルターがあり、各フィルターはビンがいっぱいになるまでオブジェクトをビンに入れ、その時点でチェーンが終了します。チェーンの最後のフィルターは単に「フィルター」であり、管理者に電子メールを送信して、オブジェクトが不足していることを知らせます (つまり、チェーンがこのフィルターに達した場合、ビンはいっぱいではなく、何かを行う必要があります)。見られる)。

だから私の問題はこれです:これらのフィルターをテストするにはどうすればよいですか? 一連の for ステートメントを使用して、一意のタイプのオブジェクトを 1 つずつ作成できます。

しかし、結果のコレクションからどのオブジェクトを適切にフィルタリングする必要があるか (フィルタリングされたオブジェクトのコレクションであっても) を手動で見つけようとするのは非常に困難です (可能であれば、最初にフィルターを作成したときに簡単に解決できたはずです)。

次のようなことを言っているため、要件に誤りがあることは承知しています。

しかし、結果は非常に多くのエッジケースを示しているため、その特定のケースを含めるように変更するたびに、他の何かが壊れてしまい (そうでないことを確認するための回帰テストはありません)、チェーンのどこにあるかを見つけるのは困難です特定の問題が発生しました。

編集>フィルターを個別にテストしようとしていますが、次のことを前提としています。

フィルター 1 は、121600 個の可能なオブジェクトのうち 500 個を取得します (フィルターの基準に従って)。私は、たとえば、100 (完全な推測) のオブジェクトをつかむべきではないことを発見しています。さまざまな理由があります。知るためには、他のシステムのユーザーと一緒にそれぞれを調べて、各フィルターの結果セットが正しいかどうかを知る必要があります。それとは逆のことも頭に残っています... つかむべきだったのに、つかめなかったすべてのオブジェクトはどうですか。

これは、テストではなく、要件の収集に問題があるのではないかと考え始めています。

0 投票する
3 に答える
226 参照

php - これはPHPで可能ですか?

次の PHP スニペットを検討してください。

このように Available() メソッドを呼び出すことはできますか (Available メソッドが呼び出されない場合は true または false のみを返します)?

はいの場合、どのように?

編集:これでうまくいきますか?

前もって感謝します!

PS : このスニペットは切り詰められているため、それだけで意味を成すとは思わないでください。

0 投票する
3 に答える
6654 参照

c# - C# - パイプライン スタイルのイベント モデル

ASP.NET Web Apps では、イベントは特定の順序で発生します。

簡単にするために、 ロード => 検証 => ポストバック => レンダリング

そのようなパイプライン スタイルのイベントを開発したいとします。

例 :

イベント 1 [「観客が集まっています」、皆さん { イベント 2 とイベント 3 信号が来るまでお待ちください }]

イベント 1 がタスクを完了した後

イベント 2 [ { イベント 2、イベント 3 "聴衆が集まった! 私の仕事は終わった } ]

イベント 2 は、そのタスクを実行するために制御を引き継ぎます

イベント 2 [「視聴者がログインしています」イベント 3 シグナルが出るまでお待ちください]

イベント 2 がタスクを完了した後

.....

イベント 3 [「Jon skeet によるプレゼンテーションが終了しました :)」]

非常に基本的な例で、誰でも説明できますが、これをどのように設計できますか?

0 投票する
3 に答える
322 参照

design-patterns - 特定のポイントでコードを挿入できるようにする設計パターン

開発者が実行の特定の時点でコードを拡張できるようにしようとしています。

私の具体的な例は、データベース トランザクション ラッパーです。ラッパーは、開発者から抽象化したい多くの詳細を処理し、いくつかのプロジェクトで使用されています。

ただし、各プロジェクトには、トランザクション中に自動的に実行したい特定のことがあります。各プロジェクトがコードを実行するために設定できるインターセプト ポイントを追加したいと考えています。

たとえば、データベースの各テーブルには、レコードが変更されるたびに更新される入力日フィールドがあります。ただし、多くのレコードが処理されても (テーブル A の 4 つのレコード、テーブル B の 1 つのレコードなど)、トランザクションのすべての日付が同じである必要があります。

私の考えでは、インターセプト ポイント「TransactionStarting」、「TransactionStarted」、「StatementExecuting」、「StatementExecuted」などを定義し、コンテキスト オブジェクトを各ポイントに渡します。

次に、プロジェクトは、「TransactionStarted」ポイントで現在の日付を格納し、「StatementExecuting」ポイントで各オブジェクトの EnteredDate プロパティを更新するクラス「EnteredDateManager」を定義できます。

これを web/app.config ファイルに設定して、複数の傍受クラスを登録できるようにしたいと考えています。複数のクラスが登録されている場合は、登録された順序で起動する必要があります。

イベントを上げるだけだと思っていたのですが、順番を大事にしたいです。また、異なるポイント間で状態を共有できるようにしたいと考えています。上記の例では、EnteredDate プロパティが TransactionStarted ポイントで設定され、StatementExecuting ポイントで使用されます。

これは責任の連鎖パターンですか? AOP? ASP.Net パイプラインの仕組みに近いようですが、イベントを使用しており、私の知る限り、順序付けは保証されていません。

どんな方向性/例も素晴らしいでしょう。

ありがとう