最可读的方式来编写简单的条件检查

时间:2009-04-28 17:00:36

标签: language-agnostic coding-style conditional-statements

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

我能想到的两种可能性(这是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,我不喜欢的是,它无需创建变量,需要查看两个位置。

那你觉得怎么样?任何其他选项?

7 个答案:

答案 0 :(得分:27)

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


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

答案 1 :(得分:6)

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

答案 2 :(得分: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);
}

答案 3 :(得分:3)

我投票支持Chris Brandsma的回答。

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

答案 4 :(得分:1)

就个人而言,我喜欢第二种方式,因为我发现使用这种方式可以使条件的预测清晰。也就是说,通过正确完成该方法,您可以通过“对其进行”整理来使条件易于理解(无论您实际上是否说它都是无关紧要的)。

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

答案 5 :(得分:1)

我更喜欢以下内容:

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

通过这种编码风格,我完成了两件事:

  • 我可以很容易地看到if的每个额外行都是条件的一部分,因为&& (或||)在beggining。
  • 由于{在下一行。
  • ,我可以很容易地看到if语句的结束位置

答案 6 :(得分:1)

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

所以我的尝试就是

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

FieldHelper是一个带有公共静态方法的类(在C#中也称为Utility类/ Static类)