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

0 投票する
1 に答える
624 参照

delphi - トランザクション動作を取得するためのコマンドのスタックの実装-Delphi

データベースに対して複雑なスクリプトを実行するためのツールを作成する必要があります。

いくつかの理由で、DBのトランザクション動作に依存することはできませんが、独自のトランザクションシステムを実装する必要があります。

私が試しているアプローチは、コマンドパターンの助けを借りています(私の場合はもっと複雑です、ここでは議論のために簡略化されたバージョンを置きます):

アクションのセットを作成します。すべてのアクションに対して、「実行」および「元に戻す」SQLステートメントを渡します。例:

準備の呼び出しは次のようになります。

だからどういうわけか私は非常に小さな変更を加えています(単一の単純な行の挿入、単一の行の更新など)、すべての変更に対して「元に戻す」は非常に明白です。

コマンドオブジェクトのスタックを(おそらくTObjectStackコレクションを使用して)準備し、Executeメソッドを一度に1つのコマンドで呼び出し、実行時にFExecutedをTrueに設定して、コンポーネントをディスクに保存します。

ですから、私がやりたいのはすべてのスクリプトを実行することですが、何かがうまくいかない場合を管理したいと思います。

何か問題が発生した場合は、最後から最初にUndoメソッドを呼び出すまでのすべてのコマンドを実行したいと思います。もちろん、これを行う前に、コンポーネントをディスクから復元できる必要があります(障害がハードウェア障害である場合、障害がすでにメモリにスタックを持っている別の理由である場合、undo1コマンドを簡単に呼び出すことができます時間)。

注:DBトランザクションの動作に依存できない主な理由は、大きなBLOBも挿入する必要があり、すべてのBLOBがインターネットからダウンロードされてから挿入されるため、すべてをコミットしたいため、トランザクションを永久に開いたままにすることはできません。データベースへの小さな変更。私がblobで行うことは、1つをダウンロードし、それを挿入し、次にダウンロードし、それを挿入することです...

だから私の質問は:私のオブジェクトをディスクに永続化する方法を提案できますか?私はDelphi2009を持っているので、1つのオプションは、TInterdacedPersistentを作成し、コンポーネントをストリーミングしてからファイルに保存することです。とにかく、この方法では、余分な複雑さを伴う多くのファイルがありますが、単一のファイルが望ましいです。提案してもらえますか?

編集:Delphi 2009ではTObjectStackにバグがあることに気づきました(Popは正しいタイプを返さない)ので、TObjectStackでも同じことができます。

0 投票する
1 に答える
1514 参照

java - CGLibとシリアル化

私がやりたいのは、コマンドパターンを実装するクラスをシリアル化して、後で実行できるようにすることです。すべての世界で、匿名クラスをシリアル化したいと思います(これに関する問題を認識しています)

少し複雑なのは、私が春の環境にいて、シリアル化する匿名クラスがCGLibによってプロキシされるクラスで定義されていることです。

私の最初の試み:

たとえば、storeJobはオブジェクトをシリアル化し、後で使用できるように保存します。失敗するのはこの部分です。このためのコードは含まれていませんが、これは単なるObjectOutputStream呼び出しです

TestServiceクラス全体をシリアル化する必要があることを認識しています。問題は、ラップされてCGLibプロキシがスローされ、このプロキシがシリアル化可能を実装していないことです(これはシリアル化できないと思います)。

どんな助けでも大歓迎です。

0 投票する
1 に答える
750 参照

oop - コマンド パターンの取り消し/やり直し: 私のアプローチに問題はありますか?

アプリケーションで元に戻す/やり直しをサポートするコマンド パターンを実装しようとしています。データは非常に密接に結びついているため、元に戻したいオブジェクトの一部を変更すると、ダウンストリームの結果が生じます。私の主な関心事は、ダウンストリーム コマンドを実行するコードをどこに置くべきかということです。例えば:

私が知る限り、このようなものは問題なく機能しますが、実行コードの大部分が実際にどこに行くべきかについて頭を悩ませることはできません。hierarchyObject には、後続のすべてのコマンドを追加する .changeLocation() メソッドが必要ですか、それとも上記のようにコマンド自体に含める必要がありますか? 私が考えることができる唯一の違いは、上記の例では、MoveObjectCommand を呼び出して後続の変更を処理する必要があるのに対し、別の方法ではコマンドを必要とせずに呼び出して同じ方法で処理することができるということです (マイナスの結果をもたらす可能性があります)。元に戻す/やり直しの手順を追跡するため)。私はこれを考えすぎていますか?どこに、なぜそれを配置しますか (明らかに、この例はすべての角度にヒットするわけではありませんが、コマンド パターンに関する一般的なベスト プラクティスはありますか?)。

0 投票する
1 に答える
46 参照

algorithm - コレクションを変更せずに変更コマンドを取得する

おそらく非常に不適切な名前のタイトルですが、とにかく...

階層データ セットでコマンド パターンを使用しています。したがって、基本的には、実際にデータを変更せずに行われる変更を記述するオブジェクトを返すメソッドが必要です。たとえば、次のようになります。

オブジェクト 1 -> オブジェクト 2 -> オブジェクト 3

オブジェクト 1 を移動すると、オブジェクト 2 が変化し、それによってオブジェクト 3 が変化します。これらは相互に依存しているためです。そのため、階層コレクションを再帰的に調べて、コレクションを実際に変更せずにオブジェクト 1 を移動するために必要な変更を収集するメソッドが必要です。再帰の途中で Object1.Location のようなものを使用できると便利ですが、すでに変更が予定されている可能性があるため、確実に使用することはできません。

この種の「その場での」変更を行う必要があるアルゴリズムなどはたくさんあるように感じます。CS を専攻していない私は、この種のことをあまり学ばなかったので、「解決策」を見つけるためにどの検索語を検索すればよいかさえわかりません。私の問題の直接的な解決策はおそらくないことを認識しているため、解決策を引用符で囲みますが、脳をクランキングさせるためにこれが行われたいくつかの良いガイドライン/例を探しているだけです.

この種のことが行われている実際の例を誰かが提供できますか? 前もって感謝します。

0 投票する
1 に答える
431 参照

undo - 繰り返されるコマンドを元に戻す - やり直す

したがって、元に戻す/やり直しは通常、コマンド パターンによって実装されることがわかります。ただし、コマンドが x 回繰り返されることを意図している場合、x 回元に戻すことはユーザーにとって面倒です。

たとえば、「int num」があり、キーボードで「+」を押すと、プログラムは「++num」を実行します。ユーザーが「+」を押して num を 0 から 50 に増やした場合、ユーザーは元に戻したいのですが、ユーザーが 1 回元に戻すことができるようにするにはどうすればよいですか? num は 0 に戻ります。

一連の繰り返しコマンドを処理できるように元に戻す方法を実装するには?

前もって感謝します!

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

java - ストラテジーパターンとコマンドパターンの違い

ストラテジーパターンコマンドパターンの違いは何ですか?また、Javaでいくつかの例を探しています。

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

testing - クラス爆発につながるコマンドパターン

コマンド パターンを使用すると、使用しない場合よりも常にクラス数が大幅に増加するようです。関連するコードのチャンクを別々のクラスで一緒に実行していることを考えると、これは非常に自然なことのように思えます。10 個または 12 個のコマンド サブクラスを作成しなくても、そうでなければ 6 個または 7 個のクラスしか使用しない小さなプロジェクトと見なすことができたとしても、それほど気になりません。通常の 7 クラスのプロジェクトに 19 程度のクラスを用意するのは、ほとんど間違っているように思えます。

もう 1 つ気になるのは、コマンドのサブクラスをすべてテストするのが面倒だということです。最後のいくつかのコマンドを実行した後、まるで動きが遅くなり、機敏ではなくなったかのように、だるさを感じます。

これは聞き覚えがありますか?私はそれを間違っていますか?このプロジェクトの後半で敏捷性を失ったと感じており、数日前の速度で継続的に実装およびテストする方法が本当にわかりません。

0 投票する
1 に答える
794 参照

java - コマンド パターンとオブザーバー パターンを適切に組み合わせるオブジェクト指向の GUI 設計はどれですか?

Command と Observer のパターンを適切に組み合わせたオブジェクト指向の GUI 設計はありますか?

私の Java GUI は、コマンド パターンとオブザーバー パターンを次のように組み合わせようとします。

  • クライアントはコマンドレシーバーのオブザーバーです (入力 GUI 画面やダイアログなど)。
  • 呼び出し元はクライアントのインスタンス変数です
  • クライアントの update() メソッドはコマンド受信者の入力を受け取り、適切なコマンドで呼び出し元を更新します

この実装で不快に感じているのは、update() メソッドが膨大な数の条件付き if ステートメントで構成されていることです。

例えば

Command パターンを使用して GUI イベントを効果的かつ効率的に処理する適切な方法は、現時点ではわかりません。オブザーバー パターンはその有用なパートナーですか?

0 投票する
1 に答える
4888 参照

java - コマンド パターン - パラメータ

分散クライアント/サーバー環境でコマンド パターンを使用しようとしています。基本的に、レシーバーの「実行」メソッドはさまざまなパラメーターを取る必要がありますが、各コマンド クラスには、レシーバーの基本的な機能について何も明らかにしない統一された「実行」メソッドが必要であると読みました。

私の質問は、コマンド クラスを介してスイッチから別のレシーバーに呼び出しパラメーターを渡すにはどうすればよいですか? 簡単なJavaの例を持っている人はいますか? 何も見つからないようです

本当にありがとうございました。

0 投票する
1 に答える
1664 参照

java - このシナリオのコマンド パターンは? アドバイス

こんばんは。コマンドパターンを読んでいて、それが私が構築したいものに適しているかどうか疑問に思っています。

基本的に、サーバーとのソケット接続を形成するクライアントがあります。私のサーバーには、クライアントがメソッドを呼び出す必要があるクラス「foo」が1つあります。

foo には、クライアントが呼び出す 5 つのメソッドがあるとします。サーバー上でデマーシャリングされたオブジェクトをマーシャリングするという過ちを過去に犯しました。次に、オブジェクト内の変数をチェックし、switch ステートメントを使用して、サーバー ロジックはどのアクションを呼び出す必要があるかを判断できます。

これを避けたいので、コマンドパターンが役立つと思います。しかし、サーバー上の「foo」クラスの例では、foo で呼び出されるメソッドごとにコマンド クラスを作成する必要がありますか? クライアントからサーバーに送信されるクラスはコマンド クラスである必要がありますか? この場合、必要な受信機は 1 つだけですか? - foo クラス?

'foo' クラス名について申し訳ありません。具体的なクラス名はまだありません!

よろしくお願いします