一个方法有两个几乎相同的if条件;是否可以优化代码
本文关键字:条件 if 是否 代码 优化 方法 一个 两个 | 更新日期: 2023-09-27 17:58:12
我有一个使用MDI
的Windows 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
是一个每个人都继承的表单,甚至是父表单。目前我已经完成了将代码放在一个方法中,所以现在我只调用这个方法,但让我困扰的是,这两个部分几乎完全相同,但我仍然不知道如何优化逻辑。
通过使用函数。将这些代码放入一个函数中,根据需要进行参数化。
方案:
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本身就足够了)。元素(表单)应该添加到此列表中,然后在随后的循环中,您可以遍历此列表,显示消息框并在需要时保存。最坏的情况是,据我所知,你的清单只包含主要表格。