我正在处理一个对话框,在该对话框中必须先满足几个规则,然后才能启用“确定”按钮。

当前,页面上的任何操作,例如输入数据或从下拉列表中选择一项(以及其他操作)都调用一个名为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。如果所有条件都为真,则最后将为真。

10-06 10:51