合并功能以获得更简洁的代码?

Posted

技术标签:

【中文标题】合并功能以获得更简洁的代码?【英文标题】:Consolidating functions for cleaner code? 【发布时间】:2011-06-14 13:37:14 【问题描述】:

不要被长度关闭...我不认为这是一个太难的问题。

语言: C++

开发环境: Microsoft Visual C++

使用的库: MFC

问题:我正在创建一个包含多个“页面”的大型首选项对话框。其中许多要求用户指定文件路径。现在,用户将单击该按钮,它将跳转到 OnCommand()。这将验证该命令是否来自一个按钮,然后跳转到 Browse() 函数,它将确定按下了哪个按钮。最后,它将调用 FileDialog() 来启动文件选择器,然后返回文件路径,将其分配给正确的变量,并将其附加到正确的编辑控件。

我正在尝试将所有这些“打开文件”按钮合并到一个类或函数中,但我不确定实现它的最佳方法。我希望它是干净的,这样我就不必为它提供特定的 ID(2001、2002、...)。

现在,这三个函数(如下)在我的每个文件中......这很混乱且不必要。我想要一个名为 OpenFile.cpp 的文件或包含处理打开文件的必要函数的文件,并将所选路径附加到正确对话框中的正确文本框中。

BOOL FSC_3DPersp::OnCommand(WPARAM wParam, LPARAM lParam)

  if (HIWORD(wParam) == BN_CLICKED)
  
    Browse(LOWORD(wParam));
    return TRUE;
  
return CWnd::OnCommand(wParam, lParam);

//

CString OpenFile::FileDialog(CWnd* wnd, int uiID) // dialog from which the call came and the ID of the edit control where the path is going

  CFileDialog dlg(
      TRUE // Open = TRUE, Save = FALSE
    , NULL //filename extension
    , "" // initial filename
    , OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST // flags
    , "" // filter
    , wnd // parent window
  ); 

  if (dlg.DoModal() == IDOK)
  
    CEdit *Display;
    CString path = dlg.GetPathName();
    Display = reinterpret_cast<CEdit *>(GetDlgItem(uiID));
    Display->SetWindowText((LPCTSTR)path);
    return path;
  

//

void FSC_3DPersp::Browse(UINT uiID)

 switch(uiID)
 
 case IDC_BUTTON1: 
    m_strPersTexture = FileDialog(this, 2004);
    break;
 case IDC_BUTTON2:
    m_strSkyFront = FileDialog(this, 2005);
    break;
 case IDC_BUTTON3:
    m_strSkyRight = FileDialog(this, 2006);
    break;
 case IDC_BUTTON4:
    m_strSkyBack = FileDialog(this, 2007);
    break;
 case IDC_BUTTON5:
    m_strSkyTop = FileDialog(this, 2008);
    break;
 case IDC_BUTTON6:
    m_strSkyLeft = FileDialog(this, 2009);
    break;
 case IDC_BUTTON7:
    m_strSkyBottom = FileDialog(this, 2010);
    break;
 


头文件定义:

afx_msg CString FileDialog(CWnd* wnd, int uiID);
afx_msg void Browse(UINT uiID);
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);

那么如何调整参数以将它们全部三个放在一个文件中,我将如何引用它们?如果我这样做了,我觉得我需要在 OnCommand() 函数中添加一个额外的参数,但我认为我做不到。

提前感谢您的帮助!

~乔恩

【问题讨论】:

其他定义的签名是什么样子的?如果它们是相同的,将它们全部合并到一个单元中应该不会带来很多问题。 @phresnel 你是指头文件中的定义吗?我会在上面添加它们。 我的意思是,如果所有编译单元中的“函数重定义”都相同,那么合并它们应该不是什么大问题。 @phresnel 他们应该都是一样的。我只是不确定如何传递“调用”的对话框的 ID,以便知道按下了哪个按钮,因此需要附加哪个编辑控件。 【参考方案1】:

使用CMFCEditBrowseCtrl 或COXBrowseFileEdit(或其他类似的类)代替普通的编辑控件怎么样? 这些类创建带有“浏览”按钮的编辑框,单击该按钮时,会自动打开文件选择对话框并将所选文件设置为编辑控件文本。

【讨论】:

嗬,这要容易得多,而且我认为会节省很多时间。谢谢! 或者使用公开GetFileName() 方法的CEditCButton 实现您自己的CWnd 派生控件。

以上是关于合并功能以获得更简洁的代码?的主要内容,如果未能解决你的问题,请参考以下文章

合并声明行以获得唯一值

有没有一种更简洁的方法来获得第一次出现的东西?

github上测试服出现bug,如何回滚并获得合并之前的分支

如何在 AppBar 中包装子小部件以获得更大的子高度和 Flutter 中的填充

生成组合的虚拟按键以获得 â、ó、ć 等更复杂的字符

当在VSTS中更新目标分支时,是否可以获得PR以重新启动合并?