Вложенные операторы if, else - PullRequest
       13

Вложенные операторы if, else

7 голосов
/ 08 сентября 2011

У меня очень запутанный код с 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 ]

13 голосов
/ 08 сентября 2011

Это не боров производительности.Отличный пост в блоге о том, как исправить эти распространенные проблемы: Сглаживающий код стрелки .

3 голосов
/ 08 сентября 2011

Я вижу здесь некоторую смесь в проверке.Попробуйте переместить одни поля из других и проверить их отдельно, что-то вроде этого:

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

При таком подходе вы всегда будете говорить пользователю, что он сделал неправильно, и ваш код намного проще.1004 *

Больше информации от Блог Джеффа

2 голосов
/ 08 сентября 2011

Один из способов заключается в рефакторинге путем инкапсуляции сложных условий следующим образом:

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

и последующего использования этих свойств "фасада условия"

0 голосов
/ 08 сентября 2011

Вы можете определять свои собственные предикаты или обобщенные функции со значимыми именами и включать в них свою логику.

Вот пример кода для некоторых предикатов:

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<> для написания небольших блоков ваших условий с использованием лямбда-выражений - это сэкономит место и сделает ваш код более читабельным.

0 голосов
/ 08 сентября 2011

Небольшой рефакторинг облегчает чтение для моих глаз.Я удалил лишние скобки и объединил несколько операторов 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();
}
0 голосов
/ 08 сентября 2011

Используйте оператор return, чтобы остановить выполнение блока.

Например,

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

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