Как лучше кодировать эту вложенную условную структуру? - PullRequest
0 голосов
/ 19 февраля 2019

Я бы использовал R в качестве примера:

# x is an object
# condA(x), condB(x) and condC(x) evaluate x and return TRUE or FALSE
# The conditions must be evaluated in the following orders.
#   For e.g., when validating for an random object being a number larger than 5,
#   you always need to evaluate whether it is numeric first,
#   only after which can you evaluate whether it is larger than 5.
#   Trying to evaluate both at once will cause an error if it is non-numeric.
# process1() and process2() are two different procedures
# modify1() is a modifier for x
if (condA(x)) {
  if (condB(x)) {
    x %<>% modify1
    if (condC(x)) {
      process1()
    } else {
      process2()
    }
  } else {
    process2()
  }
} else {
  if (cond(C)) {
    process1()
  } else {
    process2()
  }
}

Таким образом, мне нужно указывать каждый из процессов более одного раза и повторять этап вычисления condC (x), что я чувствую неуклюже, делаятак.Любое предложение для более элегантного способа кодирования этой структуры, так что мне нужно упомянуть каждый из process1 () и process2 () только один раз, не нарушая порядок вычислений, как указано в приведенном выше коде?


Дополнительная информация: Полагаю, это общий вопрос, но, возможно, пример может облегчить обсуждение ... Допустим, необходима модификация, если condB(x) оценивает TRUE.

  • condA() равно is.character()
  • condB() равно exists()
  • condC() равно is.data.table()
  • modify1() равно get()

Таким образом, если x является символом, он должен представлять имя объекта, существование которого затем проверяется, а затем преобразуется в указатель объекта.Если x не символ, он должен указывать на целевой объект.Целевой объект (на который указывает x) затем проверяется, чтобы увидеть, является ли он data.table.Если да, process1(), в противном случае process2().

1 Ответ

0 голосов
/ 19 февраля 2019

Длинная версия:

boolean A = condA(x);
boolean B = false;
boolean C = false;

if (A) {
    B = condB(x);
}

if (A && B || !A) {
    C = condC(x);
}

if (C) {
    process1();
} else {
    process2();
}

Короткая версия:

boolean A = condA(x);
boolean B = A && condB(x);
boolean C = (A && B || !A) && condC(x);

if (C) {
    process1();
} else {
    process2();
}

PS: Я не уверен насчет языка R, но выше моя идея.

...