Каков наилучший способ структурировать оператор if для двух условий с действием для каждого и действием для обоих? - PullRequest
1 голос
/ 04 мая 2011

Когда у меня есть два условия, с действием для каждого условия и действием для обоих условий, если оно истинно,

Иногда я делаю это

if (cond1 or cond2)
    if (cond1)
        do act 1
    if (cond2)
        do act 2
    do always

Иногда я делаю это

if (cond1)
    do act 1
    do always
if (cond2)
    do act 2
    do always

Но я действительно хотел бы сделать это

if (cond1)
    do act 1
or if (cond2)
    do act 2
then
    do always

Существует ли последний метод в каком-либо языке или есть предпочтительный метод для обработки этой ситуации?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 04 мая 2011

Я бы предложил следующее:

if (cond1)
    do act 1
if (cond2)
    do act 2
if (cond1 or cond2)
   do always
1 голос
/ 04 мая 2011

Предпочитайте то, что не включает в себя дублирующий код, насколько это возможно.

Эта альтернатива может быть наиболее гибкой, с минимальным дублированием:

var := false

if (cond1)
    do act 1
    var := true

if (cond2)
    do act 2
    var := true

if (var)
    do always

Возможно, вы обнаружите, что существует большевремя, когда вы хотите установить var, или что с течением времени растет число «если», которые вы хотите «всегда делать».Этот способ позволяет избежать «сложных» и / или утверждений.

1 голос
/ 04 мая 2011

Если вам это действительно нужно, и неудобно извлекать общие вещи в другую функцию, вы можете использовать такой макрос (непроверенный, Common Lisp):

(defmacro cond-any (clauses)
  (let ((any-clause (gensym "any")))
    `(let ((,any-clause nil))
       (cond ,@(mapcar (lambda (clause)
                         (if (eq (first clause) :any-after)
                             (setf any-clause (rest clause))
                             (append clause any-clause)))
                       clauses)))))

Это дает вам возможностьчтобы сделать это:

(cond-any (:any-after do-always)
          (cond1 do-1)
          (cond2 do-2))

Ключевое слово :any-after затем означает «если какое-либо из следующих условий выполнено, добавьте это после его части».

0 голосов
/ 04 мая 2011

Несколько Если операторы приводят к большему потреблению времени, поскольку каждый из них оценивается отдельно. Чтобы избежать этого, используйте если еще, если лестница, чтобы сократить время. Мое предложение: -

if(cond1 AND cond2)
       do act 1
       do act 2
       do always
else if (cond1 OR cond2)
       if(cond1)
           do act 1
       else
           do act 2 
       do always

Во всех ваших решениях количество сравнений составляет минимум 2. Но в данном конкретном решении минимум равен 1. Так что в идеале это должно быть наилучшим образом.

0 голосов
/ 04 мая 2011
return unless (cond1 or cond2)
if (cond1)
    do_act 1
if (cond2)
    do_act 2
do_always
...