【问题标题】:Is it bad practice to embed method parameter expressions?嵌入方法参数表达式是不好的做法吗?
【发布时间】:2013-10-04 14:51:15
【问题描述】:

在方法参数中使用嵌入表达式构造代码通常被认为是不好的做法吗?应该声明变量吗?

(以安卓代码sn-p为例)

((EditText)view.findViewById(R.id.fooEditText))
  .setText(
    someExpression
      ? getResources().getString(R.string.true_expression_text)
      : getResources().getString(R.string.false_expression_text)
  );

我个人认为它看起来不错,但我只是想知道这是否被认为令人反感:)

【问题讨论】:

    标签: java code-structure


    【解决方案1】:

    我几乎肯定会以多种方式简化这一点:

    EditText editText = (EditText) view.findViewById(R.id.fooEditText);
    String resourceName = someExpression ? R.string.true_expression_text
                                         : R.string.false_expression_text;
    editText.setText(getResources().getString(resourceName));
    

    在一个语句中完成所有操作会使阅读变得更难并且更难调试,IMO。请注意,我在这里也删除了重复项,但使用您在条件运算符的两个操作数中调用 getResources().getString(...) 的事实,只是使用不同的资源名称。

    我对原始代码的主要不满是在强制转换的结果上调用一个方法 - 除了其他任何内容之外,它还引入了比您需要的更多的括号,这通常令人困惑。

    【讨论】:

      【解决方案2】:

      我会说这取决于情况,例如。

      player.setName(User.getName());
      

      没关系,但是,像下面这样的火车失事......

      player.setName(getGroup().getUsers().get(0).getName());
      

      我想说这是不好的做法,在Clean Code by Bob Martin 中提到了关于火车残骸的危险。 @Jon Skeet 提到的重复调用也是使用变量而不是方法调用的另一个原因。

      【讨论】:

      • 我什至不会把后一个代码称为火车残骸。它仍然明显比问题中的代码简单。
      • 我同意它比 OP 提到的代码要简单得多(尤其是由于三元运算符),我只是把它作为一个简单的例子。
      • 我想我可能只需要买那本书。
      【解决方案3】:

      “排斥”这个词是你的,但它确实描述了我的反应。我无法专注于这个语句在做什么,因为它有一个 if 语句、一个搜索,并且在它开始之前发生了至少 5 次取消引用。

      我发现三元运算符特别有害,因为在解析其他所有内容时,我必须在脑海中保留两组不相交的状态。有些人更喜欢简洁而不是局部变量(我不是其中之一),但嵌入在其他语句中的三元运算符(或任何其他分支)特别不受欢迎。如果你因为喜欢复杂的语句而忽略了 Clean Code 的其余部分或类似的作品,至少将条件分开。

      【讨论】:

        猜你喜欢
        • 2022-01-11
        • 1970-01-01
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        • 2019-02-12
        • 2011-08-22
        • 1970-01-01
        • 2014-11-01
        相关资源
        最近更新 更多