Windows не позволит Вам перетащить от одного окна до другого, если только одно из тех окон будет работать как Администратор.
Вы запускаете Visual Studio как Администратор?
Короче говоря: Visual Studio Выполнения как Не Администратор .
Существуют очень старые «формализмы» для попытки инкапсулировать чрезвычайно сложные выражения, которые оценивают многие, возможно, независимые переменные, например, «таблицы решений»:
http://en.wikipedia.org/wiki/Decision_table
Но я присоединюсь к собранию здесь, чтобы поддержать упомянутые идеи о разумном использовании тернарного оператора, если возможно, определение наиболее маловероятных условий, которые, если они соблюдены, позволят вам прервать остальную часть оценки, исключив их сначала, и добавить ... обратное этому ... попытаться исключить наиболее вероятные условия и состояния, которые могут позволить вам обойтись без тестирования «второстепенных» дел.
Предложение Мириам (вверху) завораживает, даже элегантно, как «концептуальное искусство»; и я на самом деле собираюсь попробовать это, пытаясь «ограничить» свое подозрение, что это приведет к коду, который будет труднее поддерживать.
Моя прагматическая сторона говорит, что здесь нет универсального ответа в отсутствие довольно конкретного примера кода и полного описания условий и их взаимодействия.
Я фанат «установки флага»: это означает, что каждый раз, когда мое приложение переходит в какой-то менее распространенный «режим» или «состояние», я устанавливаю логический флаг (который может быть даже статическим для класса): для меня это упрощает написание сложных вычислений if / then else позже.
лучше всего, Билл
Хороший вопрос. «Условная сложность» - это запах кода. Полиморфизм - ваш друг.
Условная логика невинна в младенчестве, когда ее просто понять и содержать в несколько строк кода. К сожалению, он редко стареет хорошо. Вы внедряете несколько новых функций и внезапно ваша условная логика становится сложной и обширной. [Джошуа Керевский: Рефакторинг под шаблоны]
Одна из самых простых вещей, которую вы можете сделать, чтобы избежать вложенных блоков 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
Другие ценные методы рефакторинга , связанные с условными выражениями, включают Декомпозицию условных выражений , Заменить условное условие на посетитель , Шаблон спецификации и Обратное условие .
Я большой поклонник тернарного оператора, который многие люди не замечают. Он отлично подходит для присвоения значений переменным в зависимости от условий. как это
foobarString = (foo == bar) ? "foo equals bar" : "foo does not equal bar";
Попробуйте эту статью для получения дополнительной информации.
Это не решит все ваши проблемы, но это очень экономично.
Просто. Возьмите тело if и сделайте из него метод.
Это работает, потому что большинство операторов if имеют форму:
if (condition):
action()
В других случаях, более конкретно:
if (condition1):
if (condition2):
action()
упрощается до:
if (condition1 && condition2):
action()
Я знаю, что это не тот ответ, который вы ищете, но без контекста на ваши вопросы очень трудно ответить. Проблема в том, что способ рефакторинга такой вещи на самом деле зависит от вашего кода, от того, что он делает, и от того, чего вы пытаетесь достичь. Если бы вы сказали, что проверяете тип объекта в этих условных выражениях, мы могли бы выдать такой ответ, как «использовать полиморфизм», но иногда вам действительно просто нужны некоторые операторы if, а иногда эти операторы могут быть преобразованным во что-то более простое. Без образца кода трудно сказать, к какой категории вы относитесь.
Много лет назад инструктор сказал мне, что 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 в один метод, чтобы он не испортил другой код.
Если вся цель состоит в том, чтобы присвоить другое значение некоторой переменной в зависимости от состояния различных условных выражений, я использую оператор ternery.
Если предложения If Else выполняют отдельные функциональные блоки. а условия сложные, упрощаются путем создания временных логических переменных для хранения истинного / ложного значения сложных логических выражений. Эти переменные должны иметь подходящие названия, чтобы представить бизнес-смысл того, что вычисляется сложным выражением. Затем используйте логические переменные в синтаксисе If else вместо сложных логических выражений.
Не ответ 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 может найти гораздо больше;
Иногда я ловлю себя на том, что инвертирую условие, за которым следует return
; несколько таких тестов подряд могут помочь уменьшить вложенность if
и else
.
попробуйте использовать шаблоны, такие как стратегия или команда
В простых случаях у вас должна быть возможность обойтись базовой функциональной декомпозицией. Для более сложных сценариев я с большим успехом использовал Шаблон спецификации .