【问题标题】:Is it simpler to group tests or to keep them separate?将测试分组还是分开更简单?
【发布时间】:2010-09-02 18:48:27
【问题描述】:

我刚刚和一位同事讨论过,我们不同意以下哪个 sn-ps 更简单:

public boolean foo(int x, int y) {
    if (x < 0)
        return false;
    if (y < 0)
        return false;
    // more stuff below
}

public boolean foo(int x, int y) {
    if (x < 0 || y < 0)
        return false;
    // more stuff below
}

哪个更短很明显;很明显,它们的cyclomatic complexity 是相同的(因此对于“简单”的定义,它们当然是相同的)。

你的感受是什么,为什么?哪个更具可读性;哪个更容易调试?

【问题讨论】:

    标签: language-agnostic coding-style


    【解决方案1】:

    在您描述的完全通用的情况下,我会选择第二个,因为我讨厌重复代码。

    但在现实生活中,我会根据这两个测试是否相关来做出决定。

    例如

    if (user.isDisabled() || user.isSuspended())
        return false;
    

    这两个测试都是关于用户是否可以做某事。

    但是

    if (user.isDisabled())
        return false;
    if (catalog.isClosedForOrders()) 
        return false;
    

    一个测试是关于用户的,一个是关于系统的;当一个以后独立于另一个发生变化时,我会将它们分开以便于维护。

    【讨论】:

      【解决方案2】:

      嗯,很大程度上取决于我当时的心情。

      我认为最客观的考虑是 x 和 y 的相关程度。检查一个变量的高低范围——如果。检查一个字符串是否为 null,检查一个 int 是否为范围——两个 if。

      【讨论】:

        【解决方案3】:

        我会选择第二个,但有一个变化:

        public boolean foo(int x, int y) {
            if ((x < 0) || (y < 0))
                return false;
            // more stuff below
        }
        

        原因在于它遵循人类用自然语言表达它的方式(我们会说“如果两者中的任何一个是否定的,那么答案是'否'”而不是“如果第一个是是否定的,答案是“否”;如果第二个是否定的,答案也是“否””)。

        【讨论】:

          【解决方案4】:

          我认为这些风格暗示了不同的东西:

          if (x < 0)
              return false;
          if (y < 0)
              return false;
          

          表示如果x &lt; 0 完成某事,另一个如果y &lt; 0 完成某事。

          if (x < 0 || y < 0)
              return false;
          

          暗示如果任一条件为真,则完成一件事。

          所以这取决于实际的代码。显然,如果两个表达式都应执行相同的操作,则不会拆分语句,因为这会导致重复代码并且只会感觉错误

          【讨论】:

            【解决方案5】:

            更好的名字,那就真的很清楚了……

            public boolean foo(int x, int y) {
                var hasInvalidArgument = (x < 0 || y < 0);
            
                if (hasInvalidArgument)
                    return false;
            
                // more stuff below
            }
            

            你不需要看表达式...变量名告诉你测试是什么

            【讨论】:

              猜你喜欢
              • 2012-01-01
              • 1970-01-01
              • 2011-04-29
              • 1970-01-01
              • 2010-10-23
              • 2014-12-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多