处理GUI应用程序中的复杂规则(C++或C#)

Can*_*rse 4 c++ user-interface logic mfc

我在一个对话框上工作,在启用确定按钮之前必须满足几个规则.

目前,页面上的任何操作(例如输入数据或从下拉列表中选择项目(以及其他内容))都会调用一个名为ProcessEvent()的函数 - 此函数处理所有逻辑,并启用或禁用"确定"按钮.

我的问题是我发现难以使规则简洁易懂.

一些规则可以通过对话框上的另一个操作来否定,我现在最终得到if else语句到处或者难以阅读和跟随和扩展.

下面的代码是问题的简化,但很好地证明了这一点.如何更好地处理这个问题(如果可能的话)

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;


            }

        } 
Run Code Online (Sandbox Code Playgroud)

Jer*_*ell 6

我会将你的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);
Run Code Online (Sandbox Code Playgroud)

Condition1()可能是:

bool Condition1()
{
    return (IsDlgButtonChecked(IDC_USEDBNAME) 
         && !IsDlgButtonChecked(IDC_MAXDBNAME));
}
Run Code Online (Sandbox Code Playgroud)

等等.

这里发生的是enableNext变量以true开头.然后,每个&=你这意味着如果任何ConditionX()函数返回false,则enableNext将结束为false.如果所有条件都成立,那么最​​终才会成立.