嵌套& # 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();
                }
            }

这只是正在进行的检查的一小部分。有些是功能性的,有些是用于输入验证的。

是否有任何方法使其更具可读性和更少的性能消耗?

嵌套& # 39;如果# 39;& # 39;其他# 39;语句

这不是一个性能问题。关于如何解决这些常见问题的博文是扁平化箭头代码

我在这里看到一些混合验证。尝试从其他字段中移动一个字段,并分别验证它们,如下所示:

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;
    }
}