1


0

ペイントプログラムインターフェイスのオブジェクト指向デザイン

私は絵画プログラムを書いています。 私の基本的なクラスは次のとおりです。

  class Workspace { Bitmap b; List undoList; }

  class Command { void execute(); }

  class ClearScreen extends Command

  class BlurEffect extends Command

  class View { Bitmap screen; }

  class Interface

ワークスペースオブジェクトは、プログラムの状態を表すビットマップを保持します。 Commandクラスは、ワークスペースの状態をリセットし、古いコマンドを再生することにより元に戻す機能を行うワークスペースでコマンドを実行するためのコマンドパターンを表します。 インターフェイスオブジェクトは、ユーザーからのボタンの押下をコマンドにリンクし、ビューはワークスペースの状態を画面ビットマップにレンダリングします。

私の問題は、コマンドを表現することです。 ClearScreenコマンドは簡単です。ビットマップを白で塗りつぶすようにワークスペースに指示するだけで、即座に実行されます。 BlurEffectコマンドはより複雑です。 blurは、画面をぼかす程度のパラメーターを取ります。実行には少し時間がかかる場合があり、ユーザーは通常、1つを選択する前にいくつかのぼかしパラメーターを試したいと思います(つまり、 コミットする前に、ぼかし効果がどのように見えるかをプレビューする必要があります)。 この種のプレビューをサポートするために上記を変更するにはどうすればよいですか?

私が思いつくことのできる最善の方法は、次のようなコマンドでCommandを拡張することです。

  class BlurCommand extends Command
  {
    void setBlurAmount(float x) ...

    // View can use this to render a preview to the
    // screen bitmap, where the workspace bitmap isn't modified in the process
    void preview(Workspace w, Bitmap b)

    void execute() // apply blur effect to workspace
  }

そのため、インターフェイスで「ぼかし」ボタンをクリックすると新しいBlurCommandオブジェクトが作成され、Viewの「画面のレンダリング」メソッドが「プレビュー」メソッドの呼び出しを開始して画面をレンダリングし、「実行」のみが呼び出されますユーザーがエフェクトを適用したいとき。

これは私がこれを行うことができる最もクリーンな方法ですか? Model-View-Controllerデザインに固執しようとしていますが、プレビュー動作が物事を複雑にしたくないのです。

3 Answer


0


はい。代わりに、ぼかしを適用し、操作がキャンセルされた場合は元に戻すか、パラメータが変更された場合は元に戻してやり直すことができます。 コマンドスタック全体の再生に時間がかかりすぎる場合は、ぼかしを適用する前にスナップショットを作成できます。


0


ペイントプログラムの現在の機能をテストする単体テストはありますか? 確かな設計に到達するのに本当に役立つと思うことの1つは、TDD(テスト駆動開発/設計)を使用することです。 「プレビュー」タイプのアクションをシミュレートするテストを作成し、そのテストに合格します。 既存のテストと新しいプレビューテストがすべて合格したら、アプリケーションコードがどのように見えるかを確認します。


0


これまでのデザインは見栄えがいいです。 私の意見は次のとおりです。blurコマンドで直面している問題は、今後このようなものが増えることを示す指標であるため、設計にこのようなコマンドを追加する必要があります。 したがって、コマンドの2つのサブクラス-FastCommand`と SlowCommand`を作成できます。 FastCommandには「doIt」メソッドと「undoIt」メソッドのみがあり、単に実行してコマンドスタックに追加します。 SlowCommandは、物事を行うための2段階のプロセス(プレビューとコミット)を持つ*非同期*コマンドである必要があります。 SlowCommandを初めて実行するときは実行する必要がありますが、コマンドスタックには追加しません。 代わりに、参照としてワークスペースに保管してください。 ユーザーが実際にアクションを確認したら、再度実行し(今回は実際に実行します)、コマンドスタックに移動します。

Viewクラスはおそらく必要ありません。

SlowCommandの実際の元に戻す/やり直しメカニズムについては、パフォーマンスと使用可能なメモリに基づいて最適なアプローチを決定できます。バッファーコピーを作成してから破棄するか、同じバッファーで逆アルゴリズムを実行します。 アプリケーションで両方の戦略を使用していることがわかった場合、コマンド内でhttp://www.oodesign.com/strategy-pattern.html[Strategy Pattern]を使用できます。