【问题标题】:What is the best way to structure an if statement for two conditions with an action each, and an action for both?为两个条件构造一个 if 语句的最佳方法是什么,每个条件都有一个动作,并且两者都有一个动作?
【发布时间】:2011-08-18 02:22:20
【问题描述】:

当我有两个条件时,每个条件都有一个动作,如果一个条件为真,两个条件都有一个动作,

有时我会这样做

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

最后一种方法是否存在于任何语言中,或者是否有处理这种情况的首选方法?

谢谢。

【问题讨论】:

    标签: logic conditional


    【解决方案1】:

    我建议如下:

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

    【讨论】:

      【解决方案2】:

      如果你真的需要这个,并且提取公共的很麻烦 东西到另一个函数,你可以使用这样的宏 (未经测试,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 则表示“如果有任何后续条件 是真的,将其附加在其 then 部分之后”。

      【讨论】:

        【解决方案3】:

        尽量选择不涉及重复代码的东西。

        这种选择可能是最灵活的,重复最少:

        var := false
        
        if (cond1)
            do act 1
            var := true
        
        if (cond2)
            do act 2
            var := true
        
        if (var)
            do always
        

        您可能会发现想要设置 var 的次数越来越多,或者随着时间的推移,您想要“始终执行”的“ifs”数量会增加。这种方式避免了“复杂”和/或语句。

        【讨论】:

          【解决方案4】:
          return unless (cond1 or cond2)
          if (cond1)
              do_act 1
          if (cond2)
              do_act 2
          do_always
          

          【讨论】:

            【解决方案5】:

            多个 If 语句会导致更多时间消耗,因为每个语句都是单独评估的。为避免这种情况,请使用 if else if 阶梯来减少时间。我的建议:-

            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 。所以理想情况下,这应该是最合适的。

            【讨论】:

            • 我不喜欢这个。逻辑并不简单,大量代码是重复的,并且通常较大的代码大小会比您保存的一个比较更具吸引力......
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-14
            • 2012-02-17
            • 1970-01-01
            • 2022-01-09
            • 2015-11-12
            • 2014-01-05
            相关资源
            最近更新 更多