2012-05-21 2 views
3

У меня есть приложение с красным полем, которое имеет сложный метод. CC равен 14. Операторы if проверяют параметры приложения и генерируют соответствующий встроенный SQL.Уменьшить циклическую сложность проверки настроек

E.G. Этот оператор if проверяет настройки. настройки - это настраиваемый код, DTO с несколькими bool (неbool?).

 string conditions = " AND ("; 

     List<string> conditionStrings = new List<string>(); 

     if (settings.AlwaysIncludeCommonResults && settings.SelectedCommonLabs.Count > 0) 
     { 
      string common = " (Table.Name in ("; 
      for (int i = 0; i < settings.SelectedCommonLabs.Count; i++) 
      { 
       common += string.Format("'{0}'", settings.SelectedCommonLabs[i]); 
       if (i < settings.SelectedCommonLabs.Count - 1) 
        common += ", "; 
      } 
      common += ")) "; 
      conditionStrings.Add(common); 
     } 

     if (settings.AlwaysSelectLast24HoursResults) 
     { 
      string last24 = " (DateDiff(hh, Table.PerformedDtm, GetDate()) < 24) "; 
      conditionStrings.Add(last24); 
     } 

Я не знаю, что делать, чтобы упростить эту логику bool. Нуль сливается? ... Я не знаю, что это сделает это лучше. Этот шаблон появляется несколько раз в том же методе. Поэтому я надеюсь повторно использовать ответ несколько раз, чтобы уменьшить общий CC и повысить удобочитаемость. Что ты предлагаешь?

ОБНОВЛЕНО
После принятия решения, чтобы вырвать первую проверку, добавляет дополнительную логику методы.

+3

Это выглядит и кажется неправильным ... Почему код должен тратить время на создание сложного оператора SQL, если результаты не будут возвращены? – Alex

+0

@alex - Согласовано. Я должен разорвать это на более высоком уровне. Этот метод все еще должен существовать (помните, что существует больше таких операторов, например, если запрос имеет реальные условия. Поэтому любые предложения по улучшению этого типа логики по-прежнему полезны. –

+0

Мне было бы любопытно увидеть другие части этого метода. Возможно, есть другое место, где вы можете просто * не * выполнять проверки, а не пытаться их исправить. Нелегко исправить сложную последовательность, не видя ее вообще. – Alex

ответ

1

Я бы начать с сокращения кода немного:

string common = " (Table.Name in ("; 
      for (int i = 0; i < settings.SelectedCommonLabs.Count; i++) 
      { 
       common += string.Format("'{0}'", settings.SelectedCommonLabs[i]); 
       if (i < settings.SelectedCommonLabs.Count - 1) 
        common += ", "; 
      } 
      common += ")) "; 
      conditionStrings.Add(common); 

может быть сжат:

string common = " (Table.Name in ("; 
//if SelectedCommonLabs is a collection of strings, LINQ your way through it 
common += string.Join(", ", settings.SelectedCommonLabs.ToList().Select(lab => string.Format("'{0}'",lab))); 
common += ")) "; 
conditionStrings.Add(common); 

Но я согласен, это не очень хороший код, чтобы начать с.

+1

Вот почему Я говорю, что встроенный SQL - это зло. Не потому, что сама технология не читается, потому что вещи, которые разработчики склонны делать с технологией, являются злыми. –

+0

Согласовано 101% также могут возникнуть проблемы с впрыском – Alex

+0

Оригинал был только длинным намотчиком Присоединиться. Хорошая работа, конвертирующая этот метод! - P.Brian.Mackey 17 минут назад –

Смежные вопросы