6

编写如下所示的多条件检查最易读/最好的方法是什么?

我能想到的两种可能性(这是 Java,但语言在这里真的无关紧要):

选项1:

   boolean c1 = passwordField.getPassword().length > 0;
   boolean c2 = !stationIDTextField.getText().trim().isEmpty();
   boolean c3 = !userNameTextField.getText().trim().isEmpty();

   if (c1 && c2 && c3) {
      okButton.setEnabled(true);
   }

选项 2:

   if (passwordField.getPassword().length > 0 &&
         !stationIDTextField.getText().trim().isEmpty() &&
         !userNameTextField.getText().trim().isEmpty() {
      okButton.setEnabled(true);
   }

我不喜欢选项 2 的地方是换行,然后缩进变得很痛苦。我不喜欢选项 1 的一点是,它什么都不创建变量,并且需要查看两个地方。

所以你怎么看?还有其他选择吗?

4

7 回答 7

27
if (HasPassword() && HasStation() && HasUserName())
  okButton.setEnabled(true);


bool HasPassword() {
 return passwordField.getPassword().length > 0;
}

等等

于 2009-04-28T17:05:15.760 回答
6

请注意,选项 1 不允许短路行为。也就是说,您在评估第一个条件的结果之前计算所有条件的值。

于 2009-04-28T17:09:12.050 回答
4

我会修改选项 1,以便您使用真正有意义的变量名。也就是说,将“c2”的名称更改为“stationIDIsEmpty”之类的名称(并将 NOT 移动到条件中)。这样,条件是可读的,而不必来回浏览每个变量。

所以我的代码可能看起来像:

boolean enteredPassword = passwordField.getPassword().length > 0;
boolean stationIDIsEmpty = stationIDTextField.getText().trim().isEmpty();
boolean userNameIsEmpty = userNameTextField.getText().trim().isEmpty();

if (enteredPassword && !stationIDIsEmpty && !userNameIsEmpty) {
   okButton.setEnabled(true);
}
于 2009-04-28T17:03:24.670 回答
3

我投票支持 Chris Brandsma 的回答。

但只想提一下我对选项 1 的主要问题是你正在失去 && 的好处。使用选项一,虽然我认为它更具可读性,但您正在处理可能不需要的比较。

于 2009-04-28T17:09:43.360 回答
1

就个人而言,我喜欢第二种方式,因为我发现使用这种方式可以使条件句的谓词清晰。也就是说,通过正确执行该方法,您可以通过“验证”它来使条件易于理解(无论您是否真的说它是无关紧要的)。

也就是说,使用您的第二个选项,很明显您的条件大致翻译为:“如果密码长度大于零,并且 stationIDTextField(修剪)不为空,并且 usernameTextField(修剪)不为空,那么……”

于 2009-04-28T17:05:40.687 回答
1

我更喜欢以下内容:

if (passwordField.getPassword().length > 0
    && ! stationIDTextField.getText().trim().isEmpty()
    && ! userNameTextField.getText().trim().isEmpty())
{
    okButton.setEnabled(true);
}

使用这种编码风格,我完成了两件事:

  • 我可以很容易地看到 if 的每一行额外的行都是条件的一部分,因为 && (或 ||) 在开头。
  • 由于下一行的 { ,我可以很容易地看到 if 语句在哪里结束。
于 2009-04-28T17:06:49.373 回答
1

Option1 是应用重构“ Replace temp with Query ”的首选。原因是有人可以在变量初始化和检查和更改代码行为之间填充代码。或者检查可能使用过时的值。在初始化和检查之间对文本字段进行了更新。

所以我的尝试是

if (GetPasswordLength() > 0 
   && FieldHelper.IsNotEmpty(stationIDTextField) 
   && FieldHelper.IsNotEmpty(userNameTextField) 
{
   okButton.setEnabled(true);
}

FieldHelper 是一个具有公共静态方法的类(在 C# 中也称为实用程序类/静态类)

于 2009-04-28T17:08:57.077 回答