一个方法有两个几乎相同的if条件;是否可以优化代码

本文关键字:条件 if 是否 代码 优化 方法 一个 两个 | 更新日期: 2023-09-27 17:58:12

我有一个使用MDIWindows Form项目。我有一个方法负责保存打开的任何可编辑表单中的数据,并且该方法用于不同的事件。但我也在父窗体before close事件中使用它,在该事件中,我需要检查所有打开的MDIchild,如果其中有可编辑窗体,并且如果有,则要求保存。除此之外,我只关心ActiveMdiChild是否可编辑,并要求仅为其保存。

以下是完成这项工作的方法:

protected void AskForSaveBeforeClose(object sender)
{
    //Get the active child
    BaseForm activeChild = this.ActiveMdiChild as BaseForm;
    //Casting to MainForm return null if the sender is child form
    Form mainForm =  sender as MainForm;
    //If the before close event comes from the parent loop all forms 
    if (mainForm != null)
           {
        foreach (BaseForm f in MdiChildren)
        {
            if (f.isEditable == true)
            {
                if (MessageBox.Show("To Do Do You Want To Save from MainForm " + f.Text, "Status",
                         MessageBoxButtons.YesNo,
                         MessageBoxIcon.Information) == DialogResult.Yes)
                {
                    f.Save();
                }
            }
        }
           }
    //if the event is not from the parent's before close just ask for the active child 
    else if (mainForm == null && activeChild != null)
    {
        if (activeChild.isEditable == true)
        {
            if (MessageBox.Show("To Do Do You Want To Save from AC ", "Status",
                      MessageBoxButtons.YesNo,
                      MessageBoxIcon.Information) == DialogResult.Yes)
            {
                activeChild.Save();
            }
        }
    }
}

BaseForm是一个每个人都继承的表单,甚至是父表单。目前我已经完成了将代码放在一个方法中,所以现在我只调用这个方法,但让我困扰的是,这两个部分几乎完全相同,但我仍然不知道如何优化逻辑。

一个方法有两个几乎相同的if条件;是否可以优化代码

通过使用函数。将这些代码放入一个函数中,根据需要进行参数化。

方案:

void askToSave (Baseform f) {
    if (f.isEditable == true)
    {
        if (MessageBox.Show("To Do Do You Want To Save from MainForm " + f.Text, "Status",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Information) == DialogResult.Yes)
        {
            f.Save();
        }
    }
}

你可以去掉if语句的嵌套:

    if (f.isEditable == true && 
        MessageBox.Show("To Do Do You Want To Save from MainForm " + f.Text, ....

这是因为&&(像||一样)是短路运算符,这意味着只要条件被篡改,从左到右,其余的操作数就不会求值。

您还可以创建集合,循环使用该集合。

protected void AskForSaveBeforeClose(object sender) {   
    //Get the active child
    BaseForm activeChild = this.ActiveMdiChild as BaseForm;
    //Casting to MainForm return null if the sender is child form
    Form mainForm =  sender as MainForm;
    //Create collection to loop through
    List<BaseForm> formsToCheck = new List<BaseForm>();
    if (mainForm != null && MdiChildren != null && MdiChildren.Any())
        formsToCheck.AddRange(MdiChildren);
    if (mainForm == null && activeChild != null)
        formsToCheck.Add(activeChild);
    // Only check editable forms
    formsToCheck = formsToCheck.Where(f => f.IsEditable).ToList();
    // Loop through forms
    foreach (BaseForm f in formsToCheck) {
        var fromText = "MainForm " + f.Text;
        if (f == activeChild)
            fromText = "AC";
        if (MessageBox.Show("To Do Do You Want To Save from " + fromText, "Status",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Information) == DialogResult.Yes) {
            f.Save();
        }       
    }
}

您可以将有效表单收集到List中,其中T可以是实现业务逻辑所需的所有内容的接口(也许List本身就足够了)。元素(表单)应该添加到此列表中,然后在随后的循环中,您可以遍历此列表,显示消息框并在需要时保存。最坏的情况是,据我所知,你的清单只包含主要表格。