Методы упрощения ужасного вложенный, если еще деревья в C#

Windows не позволит Вам перетащить от одного окна до другого, если только одно из тех окон будет работать как Администратор.

Вы запускаете Visual Studio как Администратор?

Короче говоря: Visual Studio Выполнения как Не Администратор .

6
задан rudnev 24 October 2009 в 20:35
поделиться

11 ответов

Существуют очень старые «формализмы» для попытки инкапсулировать чрезвычайно сложные выражения, которые оценивают многие, возможно, независимые переменные, например, «таблицы решений»:

http://en.wikipedia.org/wiki/Decision_table

Но я присоединюсь к собранию здесь, чтобы поддержать упомянутые идеи о разумном использовании тернарного оператора, если возможно, определение наиболее маловероятных условий, которые, если они соблюдены, позволят вам прервать остальную часть оценки, исключив их сначала, и добавить ... обратное этому ... попытаться исключить наиболее вероятные условия и состояния, которые могут позволить вам обойтись без тестирования «второстепенных» дел.

Предложение Мириам (вверху) завораживает, даже элегантно, как «концептуальное искусство»; и я на самом деле собираюсь попробовать это, пытаясь «ограничить» свое подозрение, что это приведет к коду, который будет труднее поддерживать.

Моя прагматическая сторона говорит, что здесь нет универсального ответа в отсутствие довольно конкретного примера кода и полного описания условий и их взаимодействия.

Я фанат «установки флага»: это означает, что каждый раз, когда мое приложение переходит в какой-то менее распространенный «режим» или «состояние», я устанавливаю логический флаг (который может быть даже статическим для класса): для меня это упрощает написание сложных вычислений if / then else позже.

лучше всего, Билл

4
ответ дан 8 December 2019 в 04:30
поделиться

Хороший вопрос. «Условная сложность» - это запах кода. Полиморфизм - ваш друг.

Условная логика невинна в младенчестве, когда ее просто понять и содержать в несколько строк кода. К сожалению, он редко стареет хорошо. Вы внедряете несколько новых функций и внезапно ваша условная логика становится сложной и обширной. [Джошуа Керевский: Рефакторинг под шаблоны]

Одна из самых простых вещей, которую вы можете сделать, чтобы избежать вложенных блоков if, - это научиться использовать Защитные предложения .

double getPayAmount() {
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
};  

Еще одна вещь, которую я обнаружил, довольно упрощает ситуацию ну, и который делает ваш код самодокументируемым, это Объединение условных выражений .

double disabilityAmount() {
    if (isNotEligableForDisability()) return 0;
    // compute the disability amount

Другие ценные методы рефакторинга , связанные с условными выражениями, включают Декомпозицию условных выражений , Заменить условное условие на посетитель , Шаблон спецификации и Обратное условие .

8
ответ дан 8 December 2019 в 04:30
поделиться

Я большой поклонник тернарного оператора, который многие люди не замечают. Он отлично подходит для присвоения значений переменным в зависимости от условий. как это

foobarString = (foo == bar) ? "foo equals bar" : "foo does not equal bar";

Попробуйте эту статью для получения дополнительной информации.

Это не решит все ваши проблемы, но это очень экономично.

2
ответ дан 8 December 2019 в 04:30
поделиться

Просто. Возьмите тело if и сделайте из него метод.

Это работает, потому что большинство операторов if имеют форму:

if (condition):
   action()

В других случаях, более конкретно:

if (condition1):
   if (condition2):
      action()

упрощается до:

if (condition1 && condition2):
   action()
4
ответ дан 8 December 2019 в 04:30
поделиться

Я знаю, что это не тот ответ, который вы ищете, но без контекста на ваши вопросы очень трудно ответить. Проблема в том, что способ рефакторинга такой вещи на самом деле зависит от вашего кода, от того, что он делает, и от того, чего вы пытаетесь достичь. Если бы вы сказали, что проверяете тип объекта в этих условных выражениях, мы могли бы выдать такой ответ, как «использовать полиморфизм», но иногда вам действительно просто нужны некоторые операторы if, а иногда эти операторы могут быть преобразованным во что-то более простое. Без образца кода трудно сказать, к какой категории вы относитесь.

2
ответ дан 8 December 2019 в 04:30
поделиться

Много лет назад инструктор сказал мне, что 3 - это магическое число. И когда он применил это-else утверждения, он предположил, что если мне нужно больше трех if, тогда я, вероятно, должен использовать вместо этого оператор case.

   switch (testValue)
   {
      case = 1:
         // do something
         break;
      case = 2:
         // do something else
         break;
      case = 3:
         // do something more
         break;
      case = 4
         // do what?
         break;
      default:
         throw new Exception("I didn't do anything");
   }

Если вы вкладываете if в выражения глубиной более трех, вам, вероятно, следует принять это как знак того, что есть лучший способ. Вероятно, как предложил Avirdlg, разделив вложенные операторы if на 1 или несколько методов. Если вы чувствуете, что застряли с несколькими операторами if-else, я бы обернул все операторы if-else в один метод, чтобы он не испортил другой код.

2
ответ дан 8 December 2019 в 04:30
поделиться

Если вся цель состоит в том, чтобы присвоить другое значение некоторой переменной в зависимости от состояния различных условных выражений, я использую оператор ternery.

Если предложения If Else выполняют отдельные функциональные блоки. а условия сложные, упрощаются путем создания временных логических переменных для хранения истинного / ложного значения сложных логических выражений. Эти переменные должны иметь подходящие названия, чтобы представить бизнес-смысл того, что вычисляется сложным выражением. Затем используйте логические переменные в синтаксисе If else вместо сложных логических выражений.

1
ответ дан 8 December 2019 в 04:30
поделиться

Не ответ C #, но вы, вероятно, захотите сопоставить с образцом. При сопоставлении с образцом вы можете взять несколько входных данных и одновременно сопоставить все из них. Например (F #):

let x=
  match cond1, cond2, name with
  | _, _, "Bob"     -> 9000 // Bob gets 9000, regardless of cond1 or 2
  | false, false, _ -> 0 
  | true, false, _  -> 1
  | false, true, _  -> 2
  | true, true, ""  -> 0 // Both conds but no name gets 0
  | true, true, _   -> 3 // Cond1&2 give 3

Вы можете выразить любую комбинацию, чтобы создать совпадение (это только царапает поверхность). Однако C # не поддерживает это, и я сомневаюсь, что это произойдет в ближайшее время. Между тем, есть несколько попыток попробовать это на C #, например здесь: http://codebetter.com/blogs/matthew.podwysocki/archive/2008/09/16/functional-c-pattern-matching.aspx . Google может найти гораздо больше;

1
ответ дан 8 December 2019 в 04:30
поделиться

Иногда я ловлю себя на том, что инвертирую условие, за которым следует return ; несколько таких тестов подряд могут помочь уменьшить вложенность if и else .

1
ответ дан 8 December 2019 в 04:30
поделиться

попробуйте использовать шаблоны, такие как стратегия или команда

0
ответ дан 8 December 2019 в 04:30
поделиться

В простых случаях у вас должна быть возможность обойтись базовой функциональной декомпозицией. Для более сложных сценариев я с большим успехом использовал Шаблон спецификации .

0
ответ дан 8 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: