1

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

(以 Android 代码片段为例)

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

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

4

3 回答 3

2

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

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(...),只是使用不同的资源名称。

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

于 2013-10-04T14:53:22.410 回答
1

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

player.setName(User.getName());

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

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

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

于 2013-10-04T14:54:22.943 回答
0

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

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

于 2013-10-04T16:15:15.993 回答