1

これが非常に些細で明白なことではないことを願っています。
私が取り組んでいる同様のプログラムがいくつかあります。各プログラムでは、プロジェクトの保存について将来を実装する必要があります。私は次のデザインで来ました:

Project
 -- Program1Project
 -- Program2Project

基本クラス Project :

class Project
{
 public:
   void NewProject();
   void SaveProejct();
   void OpenProject();
 protected:
  virtual void New();
  virtual void Save();
  virtual void Open();
};

仮想関数は派生クラスで再実装されるため、特定のプログラムのみが実際にプロジェクトを保存する方法 (ディスクに保存するオブジェクト) を知っています。

また、新規保存またはプロジェクトを開く際に、ユーザーがプロジェクトを保存/開く場所を選択する [名前を付けて保存/開く] ダイアログが表示されます。たとえば、NewProject() は New メソッドに関して実装されます。

void Project::NewProject()
{
  1. // Show dialog for whether to save existing project
  2. // check whether the project was already saved
  3. // if yes, only overwrite the existing project
  4. // if no, show SaveAs Dialog
  5. // ...
  6. this->New();
}  

行 1 から 5 は、すべてのプログラムに必要なコードです。つまり、ダイアログが作成され、チェックが実行されるフローと順序は同じです。

ダイアログを作成する実際のコードを Project::New および Project::Open メソッドに配置する必要があるかどうかを考えていました。しばらく考えた後、Project クラスはモデル クラスであり、モデル クラスは GUI を作成すべきではないため、これは適切な解決策ではないと判断しました。したがって、1 行目から 5 行目までのコードを記述するのに最適な場所は、特定のプログラムの保存/開くボタンのイベント ハンドラーであると考えていました。しかし、それは、プログラムごとに複製する必要があることを意味します。

問題は、すべてのプログラムで同じになるダイアログの作成を、コードの複製を必要としない方法でプロジェクトを実際に保存/開くことからどのように分離する必要があるかということです。

4

2 に答える 2

4

GUI は、モデルと GUI の間ではなく、モデルを参照する必要があります。これにより、モデルと GUI の関係がほぼ解消されます。GUI をモデルから完全に解放する方法はありません。実装が GUI から隠されている場合でも、ある時点で何らかの依存関係が発生します。

于 2010-01-26T14:39:32.347 に答える
1

モデルとビューの間のコントローラーとして機能する別のクラスを作成できます。たとえば、コントローラーはプロジェクトのメンバーである可能性があり、1行目で呼び出すことができますthis->viewController->showDialog(callBackForYes, callBackForNo, callBackForCancel)

viewController クラスは、GUI を直接エコーアウトするか、さまざまな GUI コンポーネントにビュー クラスを使用できます。

于 2010-01-26T14:40:10.590 に答える