Вложенные операторы if с 3 различными параметрами


У меня есть блок кода ниже. В allDone() метод в нижней части должны выполняться, только если allCompleted == верно. Он должен работать через каждый из инструкции для тестирования.

  • allCompleted: это начинается, как верно, поэтому ниже логика работает правильно.

  • запустите*.Проверено: это основано на флажок в форме. Этот блок должен работать только если установлен этот параметр.

  • УМК: это универсальный строковую переменную, о другую часть кода (не показано здесь), была выполнена успешно. Если его успешного выполнения этой строке будет написано "готово".

После этих вариантов, если все включить (запустить*.Проверено == истинных) методов вернулись к УМК* строку как "сделано" (все это проверено и успешного выполнения), то allCompleted должна быть правда в конце так allDone() запускается.

Если один включен метод возвращает значение false (ошибка где-то или иначе не вернуться "готово"), то allDone() метод не должен работать и код будет продолжать, пропуская последнюю если (allCompleted) заявление.

bool allCompleted = true;

if (runPart1.Checked)
    if (cmdPart1 == "done")
        allCompleted = ((allCompleted)? true : false);
    else
        allCompleted = false;

if (runPart2.Checked)
    if (cmdPart2 == "done")
        allCompleted = ((allCompleted) ? true : false);
    else
        allCompleted = false;

if (runPart3.Checked)
    if (cmdPart3 == "done")
        allCompleted = ((allCompleted) ? true : false);
    else
        allCompleted = false;

if (runPart4.Checked)
    if (cmdPart4 == "done")
        allCompleted = ((allCompleted) ? true : false);
    else
        allCompleted = false;


if (allCompleted)
    allDone();

Так что если в любое время в одну из частей включено не код будет просто двигаться дальше.

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

Редактировать: также, каждый раз, когда одна из частей завершается, выполняется этот метод, поэтому он будет работать несколько раз будучи ложным в конце, до последнего работает и все остальные "сделали" в этом случае он должен завершения и запуска allDone().



8388
11
задан 3 февраля 2011 в 08:02 Источник Поделиться
Комментарии
5 ответов

Ладно, вот как я хотел бы уменьшить дублирование кода (если я правильно понимаю условия):

Редактировать: Оригинал:

bool runCompleted(bool checked, string done)
{
if( ( checked && done == "done" ) || !checked )
return true;
else
return false;
}

Новая версия, основанных на отзывах Джерри:

bool runCompleted(bool checked, string done)
{
return !checked || done == "done";
}

Тогда в ваш код:

if(    runCompleted(runPart1.Checked, cmdPart1 )
&& runCompleted(runpart2.Checked, cmdPart2 )
&& runCompleted(runpart3.Checked, cmdPart3 )
&& runCompleted(runpart4.Checked, cmdPart4 )
)
allDone();

11
ответ дан 3 февраля 2011 в 09:02 Источник Поделиться

Другие дают вам рефакторинг идей, поэтому я просто сосредоточусь на одной инструкции в ваш исходный код, который повторяется 4 раза.

allCompleted = ((allCompleted) ? true : false); 

Посмотри на это. Вы проверяете allCompleted. Если значение true, ты ставишь его в true. Если это не правда, ты ставишь его в false. Вы настраиваете его на то, что он уже находится в каком-то не-понятный образ. Вы вполне могли бы переписать это как ниже и имеют точно такой же смысл.

allCompleted = allCompleted ? allCompleted : allCompleted;

Упростить это

allCompleted = allCompleted;

А затем упростить , что покинуть его вовсе.

if(runPart1.Checked)
if (cmdPart1 != "done")
allCompleted = false;

Код может быть достаточно сложна. Постарайтесь не добавлять дополнительные сложности, включая код, который может быть неочевидной в том, что он вообще ничего не делает!

16
ответ дан 3 февраля 2011 в 10:02 Источник Поделиться

allCompleted = true;
allCompleted &= (!runPart1.Checked || cmdPart1 == "done"));
allCompleted &= (!runPart2.Checked || cmdPart2 == "done"));
allCompleted &= (!runPart3.Checked || cmdPart3 == "done"));
allCompleted &= (!runPart4.Checked || cmdPart4 == "done"));

if (allCompleted) {
allDone();
}

Вот такой старт - не больше контекста, я не знаю, что еще можно сделать. Отредактирую позже других идей.

Редактировать: возможно, идея для вас, чтобы попробовать:

interface RunPart {
public boolean doAction();
}

И для код действий:

ArrayList CheckActions = new ArrayList();

if (RunPart1.Checked)
CheckActions.add(new RunPart1());

if (RunPart2.Checked)
CheckActions.add(new RunPart2());

if (RunPart3.Checked)
CheckActions.add(new RunPart3());

if (RunPart4.Checked)
CheckActions.add(new RunPart4());

foreach (RunPart runPart in CheckActions) {
allCompleted &= part.doAction();
}

if (allCompleted) {
allDone();
}

Все RunParts нужно реализовать RunPart интерфейс. Это сделает его немного легче, чтобы добавить больше действия в будущем. Не уверен, если это практично для вас или нет, но здесь это.

3
ответ дан 3 февраля 2011 в 09:02 Источник Поделиться

Потяните этот кусок кода в отдельный метод, если его уже нет, а потом просто сделать:

if (runPart1.Checked && (cmdPart1 != "done")) return;
if (runPart2.Checked && (cmdPart2 != "done")) return;
if (runPart3.Checked && (cmdPart3 != "done")) return;
if (runPart4.Checked && (cmdPart4 != "done")) return;

allDone();

Это не С. Мы не должны бояться раннего возвращения.

2
ответ дан 11 февраля 2011 в 05:02 Источник Поделиться

Я очень большой нуб в C#, поэтому, пожалуйста, простите меня, если это ужасное решение, но как насчет использования массивов?

bool allCompleted = true;
String[] commands = { cmdPart1, cmdPart2, cmdPart3, cmdPart4 };
CheckBox[] checkBoxes = { runPart1, runPart2, runPart3, runPart4 };

// ensure commands.Length == checkBoxes.Length
for (int i = 0; i < checkBoxes.Length; i++)
if (checkBoxes[i].Checked && commands[i] != "done")
allCompleted = false;

0
ответ дан 3 февраля 2011 в 09:02 Источник Поделиться