問題タブ [command-pattern]
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.
c# - コマンド パターンの醜い経験: OOP のポイントはありますか?
システムにコマンド パターンを実装しました。これは主に、いくつかの層があり、ロジックをリモートで「呼び出す」必要があるためです。
ご覧のとおり、私は基本的にメッセージを取得してメソッド呼び出しに変換し、それを別の層に送信されるメッセージに変換しています。
ここに何か問題があるように感じます。
最終的に MyObject をリファクタリングしてすべてのメソッドを削除し、メッセージを受け取って翻訳し、ディスパッチする単純な ProcessMessage メソッドに置き換えました。
これは、MyObject が「オブジェクト」ではなく、ほとんど単なる変換コードになったことを除けば問題ありませんでした...
単体テストを行うには、単純なメソッド呼び出しを行うのではなく、ProcessMessage() を呼び出し続ける必要があります。
「メッセージングと変換」対「メッセージ - >メソッド - >メッセージ」アプローチの間のこの戦いについての考えを探しています。明らかに、メッセージとメソッドは非常に密接に関連しています。
c# - C# でのコマンド パターンと複雑な操作
元に戻す/やり直しをサポートする必要があるプログラムを C# で作成しています。この目的のために、私は Command パターンに落ち着きました。tldr、ドキュメントの状態を操作するすべての操作は、ドキュメントの以前の状態と必要な変更を認識し、それ自体を実行/元に戻すことができる Command オブジェクトによって実行する必要があります。
単純な操作では問題なく機能しますが、ドキュメントの複数の部分に一度に影響を与える操作があります。同様に、Command オブジェクトは、元に戻す必要がある場合に備えて保持する必要があるすべての古い状態を認識できるほど十分にスマートでなければなりません。
問題は、パブリック インターフェイスを使用してすべての状態を公開すると、誰かがインターフェイスを直接呼び出そうとした場合に誤用される可能性があり、状態の破損につながる可能性があることです。私の直感では、これを行うための最もオブジェクト指向の方法は、特殊化された Command クラスを公開することです。ドキュメントの状態を直接操作できるようにするのではなく、そのドキュメントにアクセスできる Command オブジェクトを作成するようにドキュメントに要求するだけです。内部状態であり、元に戻す/やり直しを適切にサポートするのに十分なことが保証されています。
残念ながら、C# はフレンドの概念をサポートしていないため、ドキュメントの内部にアクセスできる Command クラスを作成することはできません。ドキュメント クラスのプライベート メンバーを別のクラスに公開する方法はありますか、または多くのドキュメントの内部を公開することなく、必要なことを行う他の方法はありますか?
wpf - WPF のスタンドアロン コマンド オブジェクト
WPFコマンドをスタンドアロンオブジェクトとして実装することは可能/実用的ですか? もしそうなら、これは通常どのように行われますか? 私がコマンドについて目にする例のほとんどは、通常、RoutedCommand、RoutedUICommand、または RelayCommand のような ICommand の他の実装を使用することを含みます。これらのコマンドが MVVM パターンで機能する方法は、プロパティを通じてこれらのタイプのコマンドのいずれかのインスタンスを公開することです。ViewModel 内では、コマンドのロジックが ViewModel のメソッドとして実装され、デリゲートとしてコマンド オブジェクトに渡されます。
私が理解している「古典的な」コマンド パターンは、各コマンドを OpenCustomerViewCommand などの独自のスタンドアロン オブジェクトとして実装することです。ロジックは独自のオブジェクトに完全にカプセル化されるため、アプリの他の部分で再利用できる可能性があります。たとえば、アプリのいくつかの場所から CustomerView を開くことができる場合、そのメソッドをコピーして各 ViewModel に貼り付けるのではなく、CustomerView にアクセスできる各 ViewModel で OpenCustomerViewCommand のインスタンスを単純に作成できると便利です。 、デリゲートを RelayCommand に渡します。私の理解が正しければ、Cut や Paste などの定義済みの ApplicationCommands はこのように動作します。
私には、ViewModel 内にロジックを提供する必要があるため、コマンド パターンの価値が少し低下するように思えます。この方法で実行することと、UI イベントのコマンド ハンドラーを実装するコード ビハインドを使用することとの主な違いを、私は本当に理解していないと思います。上記で説明したより古典的なアプローチよりも RoutedCommand パターンを使用する必要がある理由はありますか?
asp.net-mvc-3 - 実行前のコマンドの検証
私が現在構築しているシステムでは、コマンド パターンを使用して可能なすべての操作を実行します。私は CommandMessage と CommandHandler のアプローチを選択し、ロジックをデータから分離しました。これは今のところ問題なく動作しますが、検証という問題に遭遇しました。
コマンドが実行できるかどうかを実際に検証するにはどうすればよいですか?
現在、私はCanExecute(ICommandExecutionContext context)
on every コマンドを持っており、実行できるかどうかを判断する責任があります。ICommandExecutionContext
次に、各コマンドでAが型チェックされ、正しいコンテキスト型であるかどうかが確認され、その後、その情報によってコマンドがそのコンテキストで実行可能になるかどうかが確認されます。
ICommandService
名前、コンテキスト、およびメッセージに基づいて、コマンドを検証および実行できるにすべてがラップされます。それ以外にも、コマンド実行に関するイベントを発行し、権限チェックを実行します。
この問題は、UI (ASP.NET MVC 3 アプリケーション) に起因します。各ビューに有効なコマンドのみを表示したいのですが、本当に気に入った解決策を見つけることができませんでした。現在、私のコントローラーは、次のような具体的なコンテキストが与えられた場合に、コマンドを実行できるかどうかをコマンド サービスに尋ねます。
具体的なドメイン オブジェクトで機能する他の種類のコマンドについては、同じコマンド サービス メソッドを使用しますが、次のようにドメイン オブジェクト ID を渡す別のコンテキストを使用します。
あまりDRYではありませんが、上記は今のところ大丈夫だと思います。しかし、私が達成したいのは、CanExecute の結果に基づいて、アクション リンクを無効にすることです。
どうやってやるの?
各ビューのすべてのコマンド リンクを「ハードコード」することにしたので、コマンド名などのコレクションを渡す必要はありません。そのパスは難しすぎます (誰かが賢いアイデアを持っている場合を除きます ;)
私の現在のスタックは、NHibernate、Castle Windsor、ASP.NET MVC 3、AutoMapper で構成されています。
c# - キューに入れられたジョブを実行するためのコマンドおよびファクトリ設計パターンの使用
データベースから読み取ってスレッドを使用して並行して実行する必要があるデータベースにキューに入れられたジョブのリストがあり、それらの各ジョブを実行するためのコマンド クラスのリストがあり、すべて共通のインターフェイス (コマンド パターン) を実装しています。しかし、データベースから保留中のジョブを取得するときは、ジョブごとに次のような正しいコマンド オブジェクトをインスタンス化する必要があります (ファクトリ クラスで)。
上記のような大きな switch ステートメントを使用せずに、適切なコマンド オブジェクトを作成するより良い方法はありますか? または、キューに入れられたジョブを実行するための他のパターンはありますか?
解決策:このように解決しました(選択した回答に基づいて)。これにより、コマンド オブジェクトの遅延インスタンス化が行われます。
c# - コマンドパターンで実行されたメソッドの結果を取得する
現在、単純なテスト プロジェクトで Transaction Script パターン (Martin FowlerがCommand Patternを使用して説明した方法とまったく同じ) を実装しようとしています。すべて正常に動作します。問題は、指定したときに結果を取得する方法がわからないことですICommand インターフェイスから継承された具象クラスで実行されるメソッド。
私が持っている機能を明確にするために、いくつかのコードを示しましょう。ICommand インターフェイスから継承した単純な CalculateSalaryCommand クラスがあります
および CalculateSalaryTS という名前の単純なトランザクション スクリプト クラス
ご覧のとおり、具体的なコマンド クラスに のインスタンスを渡し、Execute メソッド内でそのインスタンスから操作を実行します。まあ、すべてがよさそうだ。しかし、整数でなければならない実行されたメソッドの結果を返すことができないという問題があります。この問題を処理するために、トランザクション スクリプト レイヤーにコードを追加することにしました。このコードは、各トランザクションがジェネリックITransactionResult
インターフェイスから継承する必要があります。次のようになります。
次に、CalculateSalaryTS クラスは次のようになりました。
使用法 :
この方法には独自の制限があることは承知していますが、この状況を処理するための別のアイデアを提供するまで、選択の余地はありません。
前もって感謝します。
design-patterns - Callback/Command vs EventListener/Observer パターン
私は非同期フレームワークを設計しようとしていますが、コールバック パターンとオブザーバー パターンの長所/短所について人々が考えていることを知りたいと思っていました。
私は、これらのパターンの両方を使用しているように見えるフレームワークを使用しています。EventListener パターンは、リスナーのリストがないため、一般的なパターンではありません。これは、リスナーの優先順位に関する独自のセマンティクスを持つ CompositeListener を作成することで簡単に実装できます。また、各リスナーへのイベントの配布を処理する方法 (各リスナーとシリアル通知に対して新しいスレッドを生成する方法など) もあります。(私は実際に、これは良い考えだと思います。これは、懸念事項を適切に分離し、標準のオブザーバー/リスナー パターンを改善したものだからです)。
それぞれをいつ使用すべきかについて何か考えはありますか?
なるほど。
c# - コマンドパターンとポリモーフィズムの実装
コマンドパターンを実装したい。私は次のものを持っています:
そしてプログラム:
それは期待どおりに機能します。私の問題は、State クラスを拡張したいときに始まります。
ここで、アクションは に変更を適用する必要がありますExtendedState
。ExtendedState
そこで、パラメーターとして受け取る 2 つの追加関数を持つ拡張アクションを作成すると考えました。
インターフェイスを実装する関数が冗長になるため、これは私がすでに気に入っていないことです。さらに、IAction ではなく、新しい型を使用する新しいExecute
関数を myに作成する必要があります(そうしないと、実装されていない関数が呼び出されます)。ExtendedState
私はそれが素敵なオブジェクト指向の方法でできると確信しています。あなたは私を助けることができます?目的は、拡張可能な State クラスと IAction インターフェイスを作成することです (ジェネリックかもしれませんが、私にはわかりません) State
。
c# - コマンドパターンパート-1のプログレスバーC#
EXT.NETにプログレスバーを実装する必要があります。トランザクションの処理と同じように、「処理」コマンドがあります。トランザクションと失敗および成功したトランザクションの総数を追跡する必要があります。例:「合計60のトランザクションがあります。12が失敗し、48が成功しました」)。
私の質問は、コマンドパターンを使用してこれを実装できますか?私はコードを求めていませんが、それが理にかなっているかどうか知りたいです。
これは、割り当てのためにいくつかのデザインパターンを実装する必要があるためです。
(http://en.wikipedia.org/wiki/Command_patternアプリケーションの1つはプログレスバーです)
PS:
コマンドパターンで実装されたプログレスバーの例を誰かが持っている場合は、気軽に投稿してください:P
java - C++ のように Java でコマンド パターンを使用するにはどうすればよいですか?
私は最近 C++ でゲームに取り組んでおり、コマンド パターンを実装してキーボード入力を管理し、宇宙船を制御していました。すべてのコマンドをインスタンス化するとき、宇宙船ポインターを各コンストラクターに渡して、すべてのコマンドが同じ宇宙船オブジェクトで動作するようにしました。
C++ では参照渡しができるため、このパターンは理にかなっていますが、Java ではすべてが値渡しです。Java で同じことを実装しようとすると、各コマンドが同じオブジェクトを指すようにするにはどうすればよいでしょうか?
私が見た Java で使用される Command パターンのすべての例では、各 Command のメンバー変数がコピーであるか参照であるかに違いはありません。