0

由 OP 编辑​​。
我的程序需要大量的清理和重组。

在另一篇文章中,我询问了离开 MFC DocView 框架并采用 WinProc & Message Loop 方式(简称什么?)。好吧,目前我在想我应该清理我在 Doc View 中的内容,也许以后再转换为非 MFC,这甚至是有意义的。我的 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);

这对我来说似乎很奇怪。我只有一个文档和一个视图。我觉得我正在使用 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()但好吧,只要您只在一个地方需要它,那只是装饰性的。

如果您只有一个视图,您正在做什么以及您在 Document 类和 View 类中放置哪些数据更像是一个语义问题。(无论如何,您只有一个文档,因为它是一个 SDI 应用程序。)。从技术角度来看,通常两者都是可能的。但是要对(可能)以后对多个视图的扩展开放并遵循文档/视图架构的标准模式,有一些经验法则:

  • 存在且具有独立于呈现和查看方式的意义的数据(文档文件、数据库句柄等)属于文档类。我不知道你做了什么pCV->OpenF1(cmdInfo.m_Fn1) ... and so on,但如果它是文件或文件名或用于以任何方式访问数据的参数,OpenF1可能是文档类的更好方法。
  • 对基础数据进行任何类型的数据处理或修改的方法也属于文档类
  • 仅以特定方式显示文档所需的数据和方法属于视图类(例如,选定的字体、颜色等)
  • 另一方面:如果您有固定数量的随文档打开的视图,则将视图特定数据放入文档中可能没有错,特别是如果您想让这些视图参数持久化。一个示例是包含一些统计数据的文件(您的文档)和具有两个视图的拆分框架:一个将数据显示为网格表,另一个显示为饼图。该表具有描述列的顺序和宽度的“视图数据”,例如,饼图具有配置饼块颜色和图例位置的数据。如果您想确保用户在打开文档文件时获得显示的最后一个视图配置,您必须将这些视图参数存储在某处。在我看来,将这些参数存储在文档中也不会是错误或糟糕的设计,
  • 如果您的应用程序允许为文档动态打开无限数量的视图,并且只要应用程序运行这些视图只是临时的,那么将所有视图配置参数直接存储在视图类中对我来说似乎更自然。否则,在文档中,您将需要管理任何类型的动态数据结构,并在视图和该数据结构中的条目(数组中的索引或地图中的键等)之间建立关系。
  • 如果您不确定是否在文档或视图类中放置任何数据,我更喜欢文档,因为您总是GetDocument()在 View 类中使用简单的访问器来检索成员或调用 Doc 的方法。要将视图中的数据提取到文档中,需要遍历视图列表。(请记住:Doc-View 是 1-n 关系,即使在 SDI 应用程序中也是如此。)

只需几美分。

于 2010-03-23T21:18:56.980 回答