PhotoshopスタイルのGUIデザイン
-
05-07-2019 - |
質問
Photoshopなどのツールには、クリックできるツール(ペン、ブラシなど)があります。ツールをクリックすると、選択したツールに応じて、そのツールを使用してペイント、消去などを行うことができます。
OO設計でどのように実装するのが最適か疑問に思っています。どのツールが選択されているかを常に把握しているGUIManagerのみを考えることができ、Canvas(描画領域)がマウスクリックまたはマウスドラッグを検出すると、GUIManagerにどのツールが選択され、そのツールの動作を適用するかを尋ねます。
クラスレベルの詳細(または時間がない場合は詳細)で、考えられるソリューションを誰もが説明します。
解決
正確に例を示した状態パターンをご覧ください。
ただし、実際にはGUIの問題ではなく、この問題をモデル化する方法へのオブジェクト指向のアプローチです。 GUIは実際にはこれに関与しません。
他のヒント
すべてのグラフィック要素がおそらく選択したGUIの共通の基本クラスから派生しているという意味を除いて、OOの原則が実際にこれに影響するかどうかはわかりません。
画面メニューの階層を必要とするアプリケーションの複雑さの量à la photoshopはおそらく、構成と継承と機能スタイルとあなたが望むものの違いを小さくするでしょう。
ただし、異なるスタイルを使用してプログラムを2回作成する意欲がある場合、結果を確認するのは興味深いかもしれません。 OOスタイルはまだ完全に定量化されていない方法で重要であると考えていますが、さまざまなプログラミングスタイルのランキングは、現時点では実際の答えのない未解決の質問です。
このための1つのアイデアは、ツールクラスを持つことです。これをC ++のような擬似コードでスケッチするだけです:
class Tool
{
public:
// Keep a pointer to the "document", i.e. some representation of the
// image you are editing
Tool(Document *pDoc);
// Process mouse events -- this need to be overridden to execute
// the appropriate behaviour depending on the concrete type of tool
virtual void OnMouseEvent(const MouseEvent &e) = 0;
// and so on
};
次に、この抽象ツールクラスを継承して、アプリケーションに必要な具体的なツールを提供します。特定のツールが選択されると、対応するツールオブジェクトをインスタンス化し、どこかに記憶します。ウィンドウは、現在アクティブなツールオブジェクトにマウスイベントを転送し、選択されたツールに対して適切な処理を行います。
これは、ヨハネスが参照する状態パターンの実装です。