【问题标题】:Simplify conditional expression简化条件表达式
【发布时间】:2017-06-19 20:37:33
【问题描述】:

是否可以重写下面的表达式,使(foo) 只出现一次?就目前而言,这并不可怕,但是这些对(foo) 的重复调用使代码难以阅读。

(cond
 (a
  (x)
  (foo))
 (b
  (y)
  (foo))
 (else
  (z)
  (bar)))

【问题讨论】:

    标签: scheme conditional


    【解决方案1】:

    我不确定这在技术上是“回答你的问题”,但我不同意重复调用 foo 会使代码“难以阅读”。事实上,我会声称它们使阅读变得更容易。具体来说,在重构版本中,您有带有尾随代码的条件分支(对 foo 的调用)。这意味着,作为一名读者,我在阅读条件句时必须记住,稍后会发生更多事情。更重要的是,查看重构代码中的foo,我们无法确定在此之前执行了哪些代码;原版没有这个问题。

    当大块代码重复时,会使代码难以阅读和脆弱。当像这里一样重复单个调用时,通常会使代码更易于阅读,尤其是在函数具有有意义的名称时。

    在这里,让我为你重新缩进:

    (cond
      [a (x)
         (foo)]
      [b (y)
         (foo)]
      [else (z)
            (bar)])
    

    【讨论】:

      【解决方案2】:

      如果(foo) 的意思是复杂的,我建议:

      (let ()
        (define (f) (foo))
        (cond
          (a     (x) (f))
          (b     (y) (f))
          (else  (z) (f))))
      

      (let ((f (lambda () (foo))))
        (cond
          (a     (x) (f))
          (b     (y) (f))
          (else  (z) (f))))
      

      【讨论】:

      • 不应该只是(let ((f foo)) ...吗?
      • 视情况而定。如果 a 和 b 有影响 foo 的副作用,那么你会得到不同的结果。
      • 我明白了。我倾向于忘记副作用,因为我自己从不使用它们。
      【解决方案3】:

      不一定更具可读性:)但这会起作用。

      (cond ((or a b) ((cond (a (x)) (b (y))) (foo)) (else (z) (bar)))
      

      【讨论】:

        【解决方案4】:

        是的,

        (cond 
          ((cond
             (a
              (x)
              #t)
             (b
              (y)
              #t)
             (else
              (z)
              #f)) (foo))
          (else (bar)))
        

        这不会引入额外的测试,以防ab 是复杂的表达式。

        【讨论】:

          【解决方案5】:

          另一种选择:

          (let ((myfoo (lambda (x) (x) (foo))))
            (cond (a (myfoo x))
                  (b (myfoo y))
                  (else (z) (bar))))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-27
            • 2016-07-13
            相关资源
            最近更新 更多