Я бы использовал 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()
.