为两个条件构造一个 if 语句的最佳方法是啥,每个条件都有一个动作,并且两者都有一个动作?

Posted

技术标签:

【中文标题】为两个条件构造一个 if 语句的最佳方法是啥,每个条件都有一个动作,并且两者都有一个动作?【英文标题】: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

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

谢谢。

【问题讨论】:

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

【讨论】:

我不喜欢这个。逻辑并不简单,大量代码是重复的,并且通常较大的代码大小会比您保存的一个比较更具吸引力......

以上是关于为两个条件构造一个 if 语句的最佳方法是啥,每个条件都有一个动作,并且两者都有一个动作?的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 中构造视图层次结构的最佳方法是啥?

在 if 语句中格式化多个“或”条件的最佳方法

针对IF语句测试范围值数组的最佳方法

ifelse语句if条件可以为空吗

c语言闰年的判断编程是啥?

C#:如果一个类有两个构造函数,这些构造函数共享一些代码的最佳方式是啥? [复制]