嵌套'if' - 'else'语句

时间:2011-09-08 13:03:03

标签: c# switch-statement if-statement

如果检查它的话,我的代码对于if - else非常混乱。分支和嵌套分支的数量非常大(如果是 - 否则超过20,否则也是嵌套的)。它使我的代码更难以阅读,并可能是一个性能损失。我的应用程序检查它从用户获得的很多条件,因此应用程序必须始终检查不同的情况,例如:

如果文本框文本不为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();
                }
            }

这只是正在进行的检查的一小部分。其中一些是功能,一些是输入验证。

有没有什么方法可以让它更具可读性而不是性能损失?

6 个答案:

答案 0 :(得分:13)

这不是一场表演生猪。关于如何解决这些常见问题的精彩博文是 Flattening Arrow Code

答案 1 :(得分:3)

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

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's blog

的更多信息

答案 2 :(得分:2)

一种方法是通过以下列方式封装复杂条件来重构:

public bool DateRangeSpecified
{
  get 
  {
    return (datePickerStart.SelectedDate != null) 
           && 
           (datePickerEnd.SelectedDate != null)
           && StartInt != 0 && EndInt != 0; 
  }
}

然后使用这些“条件外观”属性

答案 3 :(得分:0)

使用return语句停止执行块。

例如,

void Test()
{
    if (StartInt==0 || EndInt==0)
    {
        return;
    }

    if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null)
    {
        MessageBox.Show("Please Choose Dates");
        return;
    }
}

答案 4 :(得分:0)

一些轻微的重构让我更容易阅读。我删除了无关的括号并合并了多个真正只是AND逻辑的IF语句。

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

答案 5 :(得分:0)

您可以使用有意义的名称定义自己的谓词或泛型函数,并将逻辑封装到这些中。

以下是一些谓词的代码示例:

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表达式编写条件的小块 - 它既可以节省空间,又可以使代码更具人性化。< / p>