嵌套& # 39;如果# 39;& # 39;其他# 39;语句
本文关键字:语句 其他 如果 嵌套 | 更新日期: 2023-09-27 18:08:03
我有代码,这是非常混乱的if
- else
如果检查它正在做。分支和嵌套分支的数量相当大(超过20个if - else if和嵌套)。这会使我的代码更难阅读,而且可能会成为性能的"肥猪"。我的应用程序检查从用户那里得到的很多条件,所以应用程序必须一直检查不同的情况,例如:
如果文本框文本不为0,继续下一个…
if ((StartInt != 0) && (EndInt != 0))
{
然后这里检查用户是否选择了日期:
if ((datePickerStart.SelectedDate == null) || (datePickerEnd.SelectedDate == null))
{
MessageBox.Show("Please Choose Dates");
}
在这里,如果日期选择器不为空,则继续执行代码…
else if ((datePickerStart.SelectedDate != null) && (datePickerEnd.SelectedDate != null))
{
// CONDITIONS FOR SAME STARTING DAY AND ENDING DAY.
if (datePickerStart.SelectedDate == datePickerEnd.SelectedDate)
{
if (index1 == index2)
{
if (StartInt == EndInt)
{
if (radioButton1.IsChecked == true)
{
printTime3();
}
else
{
printTime();
}
}
这只是正在进行的检查的一小部分。有些是功能性的,有些是用于输入验证的。
是否有任何方法使其更具可读性和更少的性能消耗?
这不是一个性能问题。关于如何解决这些常见问题的博文是扁平化箭头代码。
我在这里看到一些混合验证。尝试从其他字段中移动一个字段,并分别验证它们,如下所示:
if (StartInt == 0 || EndInt == 0)
{
MessageBox.Show("Please Choose Ints");
return;
}
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null)
{
MessageBox.Show("Please Choose Dates");
return;
}
在这种方法中,您总是会告诉用户他做错了什么,并且您的代码要简单得多。
来自Jeff博客的更多信息
一种方法是通过以下方式封装复杂的条件进行重构:
public bool DateRangeSpecified
{
get
{
return (datePickerStart.SelectedDate != null)
&&
(datePickerEnd.SelectedDate != null)
&& StartInt != 0 && EndInt != 0;
}
}
,然后使用这些"condition facade"属性
稍微的重构使我的眼睛更容易阅读。我删除了多余的括号,并合并了多个IF语句,这些语句实际上只是and逻辑。
if (StartInt == 0 || EndInt == 0)
return;
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null)
{
MessageBox.Show("Please Choose Dates");
return;
}
if (datePickerStart.SelectedDate != null
&& datePickerEnd.SelectedDate != null
&& datePickerStart.SelectedDate == datePickerEnd.SelectedDate
&& index1 == index2
&& StartInt == EndInt)
{
if (radioButton1.IsChecked == true)
printTime3();
else
printTime();
}
您可以使用有意义的名称定义自己的谓词或泛型函数,并将逻辑封装到这些谓词或泛型函数中。
下面是一些谓词的代码示例:
public Predicate<DateTime> CheckIfThisYear = a => a.Year == DateTime.Now.Year;
public Func<DateTime, int, bool> CheckIfWithinLastNDays = (a, b) => (DateTime.Now - a).Days < b;
现在您可以轻松地在代码中编写
if (CheckIfThisYear(offer) && CheckIfWithinLastNDays(paymentdate,30)) ProcessOrder();
考虑使用泛型委托,如Func<>
和Delegate<>
来使用lambda表达式编写条件的小块——它既节省了空间,又使您的代码更易于阅读。
使用return
语句停止块的执行。
void Test()
{
if (StartInt==0 || EndInt==0)
{
return;
}
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null)
{
MessageBox.Show("Please Choose Dates");
return;
}
}