我正在处理一个对话框,在该对话框中必须先满足几个规则,然后才能启用“确定”按钮。
当前,页面上的任何操作,例如输入数据或从下拉列表中选择一项(以及其他操作)都调用一个名为ProcessEvent()的函数-该函数处理所有逻辑,并启用或禁用OK按钮。
我的问题是我发现很难使规则简明易懂。
某些规则可以通过对话框上的其他操作来否定,而我现在得出的结论是if语句遍布各处,或者难以阅读,遵循和扩展。
下面的代码是问题的简化,但很好地演示了此问题。我如何更好地处理此问题(如果可能)
bool CWorkstation::ProcessEvent(void)
{
UpdateData();
CharCount = GetDlgItemInt(IDC_CharCount, NULL, FALSE); //get latest
if ( IsDlgButtonChecked(IDC_USEDBNAME))
{
if (!IsDlgButtonChecked(IDC_MAXDBNAME))
{
EnableNext(TRUE);
}
}
if (IsDlgButtonChecked(IDC_MAXDBNAME) && CharCount)
{
if (IsDlgButtonChecked(IDC_USEXMLNAME))
{
if ( PrefixName.IsEmpty() )
{
EnableNext(FALSE);
}
else
{
EnableNext(TRUE);
}
}
}
if (IsDlgButtonChecked(IDC_USEXMLNAME) && PrefixName.GetLength() > 1)
{
EnableNext(TRUE);
}
if ( IsDlgButtonChecked(IDC_WSAUTONAME) || IsDlgButtonChecked(IDC_RENAMEIFDUP))
{
// TRACE("IDC_WSAUTONAME is Checked\n");
if ( IsDlgButtonChecked(IDC_USEXMLNAME) && PrefixName.GetLength() > 1 )
{
if ( IsDlgButtonChecked(IDC_IDC_USESHORTNAME) )
{
EnableNext(TRUE);
}
else if ( IsDlgButtonChecked(IDC_USELONGNAME) )
{
EnableNext(TRUE);
}
else
{
EnableNext(FALSE);
}
}
if ( !IsDlgButtonChecked(IDC_USEPREFIX) )
{
if ( IsDlgButtonChecked(IDC_IDC_USESHORTNAME) || IsDlgButtonChecked(IDC_USELONGNAME) )
{
EnableNext(TRUE);
}
}
return false;
}
}
最佳答案
我会将if/else语句拆分为多个函数,并对发送给EnableNext的参数执行&=。您应该只调用一次EnableNext。
因此,例如:
// in CWorkStation::ProcessEvent
bool enableNext = true; // start with true
enableNext &= Condition1(); // of course pick better names than Condition1
enableNext &= Condition2(); // this is just for an example
EnableNext(enableNext);
其中Condition1()可能是:
bool Condition1()
{
return (IsDlgButtonChecked(IDC_USEDBNAME)
&& !IsDlgButtonChecked(IDC_MAXDBNAME));
}
等等。
这里发生的是enableNext变量以true开头。然后,每个执行的&=表示如果任何ConditionX()函数返回false,则enableNext将最终为false。如果所有条件都为真,则最后将为真。