0

OPが編集。
私のプログラムは、多くのクリーンアップと再構築を必要としています。

別の投稿で、MFC DocView フレームワークを離れて、WinProc とメッセージ ループの方法に移行することについて質問しました (略して何と呼ばれますか?)。現時点では、Doc View にあるものをクリーンアップし、後で非 MFC に変換する必要があると考えています。My Document クラスには現在、ほとんど役に立たないものがあります。

開始する場所は InitInstance() 関数 (以下に投稿) だと思います。
この部分では:

POSITION pos=pDocTemplate->GetFirstDocPosition();
CLCWDoc *pDoc=(CLCWDoc *)pDocTemplate->GetNextDoc(pos);
ASSERT_VALID(pDoc);
POSITION vpos=pDoc->GetFirstViewPosition();
CChildView *pCV=(CChildView *)pDoc->GetNextView(vpos);

これは私には奇妙に思えます。私は 1 つのドキュメントと 1 つのビューしか持っていません。GetNextDoc() と GetNextView() を使用して逆方向に進んでいるように感じます。ばかげた類推を使用しようとすること。手に本を持っているようなものですが、本のタイトルがどのページにあるかを調べるには、その索引を調べなければなりません。自分のコードを恥ずかしく思うのはうんざりです。修正または安心、あるいはその両方が必要です。:)

また、すべてのアイテムは順不同です。それらをより標準的で、構造化された、または簡単な順序に並べ替えたいと思います。

すべての提案を歓迎します!

BOOL CLCWApp::InitInstance()
{
 InitCommonControls();
 if(!AfxOleInit())
  return FALSE;

    // Initialize the Toolbar dll. (Toolbar code by Nikolay Denisov.)
 InitGuiLibDLL(); // NOTE: insert GuiLib.dll into the resource chain

 SetRegistryKey(_T("Real Name Removed"));

 // Register document templates
 CSingleDocTemplate* pDocTemplate;
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CLCWDoc),
  RUNTIME_CLASS(CMainFrame),
  RUNTIME_CLASS(CChildView));
 AddDocTemplate(pDocTemplate);

 // Parse command line for standard shell commands, DDE, file open
 CCmdLineInfo cmdInfo;
 ParseCommandLine(cmdInfo);

 // Dispatch commands specified on the command line
 // The window frame appears on the screen in here.
 if (!ProcessShellCommand(cmdInfo))
 {
  AfxMessageBox("Failure processing Command Line");
  return FALSE;
 }

 POSITION pos=pDocTemplate->GetFirstDocPosition();
 CLCWDoc *pDoc=(CLCWDoc *)pDocTemplate->GetNextDoc(pos);
 ASSERT_VALID(pDoc);
 POSITION vpos=pDoc->GetFirstViewPosition();
 CChildView *pCV=(CChildView *)pDoc->GetNextView(vpos);
 if(!cmdInfo.m_Fn1.IsEmpty() && !cmdInfo.m_Fn2.IsEmpty())
 {
  pCV->OpenF1(cmdInfo.m_Fn1);
  pCV->OpenF2(cmdInfo.m_Fn2);
  pCV->DoCompare(); // Sends a paint message when complete
 }
 // enable file manager drag/drop and DDE Execute open
 m_pMainWnd->DragAcceptFiles(TRUE);

 m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
 m_pMainWnd->UpdateWindow(); // paints the window background

 pCV->bDoSize=true; //Prevent a dozen useless size calculations

 return TRUE;
}

ありがとう

4

1 に答える 1

5

あなたのプログラムが何をするかを知らずに、あなたに良い提案をするのは難しい. 私はいくつかの一般的な意見しかありません:

  • あなたInitInstanceは私にとって非常にめちゃくちゃに見えません。これは、少しカスタム コードが含まれている標準的なものです。
  • また、アプリケーション クラスから最初のビューを取得するための見苦しい構造 (チェーン GetDocTemplate -> GetDoc -> GetView) は、私の知る限り標準です。私は実際に別の方法を知りません。別のメソッドに移動することを考えるかもしれませんがCChildView* CLCWApp::GetFirstView()、1 か所でのみ必要な場合は、それは表面的なものにすぎません。

ビューが 1 つしかない場合、何をしていて、どのデータを Document クラスと View クラスに配置するかは、意味論的な問題です。(これは SDI アプリケーションであるため、ドキュメントは 1 つしかありません)。技術的な観点からは、多くの場合両方が可能です。しかし、(おそらく) 以降の複数のビューへの拡張に対応し、ドキュメント/ビュー アーキテクチャの標準パターンに従うには、いくつかの経験則があります。

  • 存在し、表示方法や表示方法に依存しない意味を持つデータ (ドキュメント ファイル、データベース ハンドルなど) は、ドキュメント クラスに属します。あなたが何をしているのかわかりませんがpCV->OpenF1(cmdInfo.m_Fn1) ... and so on、ファイルやファイル名、または何らかの方法でデータにアクセスするために使用されるパラメーターのようなものであればOpenF1、ドキュメントクラスのメソッドの方が良いかもしれません。
  • あらゆる種類のデータ処理または基になるデータの変更を行うメソッドもドキュメント クラスに属します。
  • ドキュメントを特定の方法で表示するためにのみ必要なデータとメソッドは、ビュー クラスに属します (たとえば、選択したフォント、色など)。
  • 反対に: ドキュメントで開くビューの数が固定されている場合、ビュー固有のデータをドキュメントに入れることは間違いではないかもしれません。特に、これらのビュー パラメータを永続化したい場合はそうです。例としては、いくつかの統計データ (ドキュメント) を含むファイルと、2 つのビュー (1 つはデータをグリッド テーブルとして表示し、もう 1 つは円グラフとして表示) を持つ分割フレームです。テーブルには、列の順序と幅を説明する「ビュー データ」があり、円グラフには、円の部分の色と凡例の位置などを構成するデータがあります。ユーザーがドキュメント ファイルを開いたときに、最後に表示されたビュー構成を確実に取得したい場合は、これらのビュー パラメーターをどこかに保存する必要があります。私の意見では、これらのパラメーターをドキュメントにも保存することは間違っていたり悪い設計ではありません。
  • アプリケーションでドキュメントのビューを無制限に動的に開くことができ、それらのビューがアプリケーションが実行されている限り一時的なものに過ぎない場合、すべてのビュー構成パラメーターをビュー クラスに直接格納する方が自然に思えます。それ以外の場合、ドキュメントでは、あらゆる種類の動的データ構造を管理し、ビューとこのデータ構造のエントリ (配列内のインデックス、またはマップ内のキーなど) の間の関係を確立する必要があります。
  • ドキュメントまたはビュー クラスにデータを配置するかどうか疑問がある場合は、ドキュメントを優先しますGetDocument()。ビュー クラスには、メンバーを取得したり、ドキュメントのメソッドを呼び出したりするための簡単なアクセサーが常にあるからです。ビューからドキュメントにデータを取得するには、ビューのリストを反復処理する必要があります。(覚えておいてください: Doc-View は、SDI アプリケーションであっても 1 対 n の関係です。)

ほんの数セント。

于 2010-03-23T21:18:56.980 に答える