【问题标题】:Most readable way to write simple conditional check编写简单条件检查的最易读的方法
【发布时间】:2009-04-28 17:00:35
【问题描述】:

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

我能想到的两种可能性(这是 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 的一点是,它什么都不创建变量,并且需要查看两个地方。

那你怎么看?还有其他选项吗?

【问题讨论】:

  • 现代的 ide 都有自动识别工具,那为什么要装呢?

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


【解决方案1】:
if (HasPassword() && HasStation() && HasUserName())
  okButton.setEnabled(true);


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

等等

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我会修改选项 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);
      }
      

      【讨论】:

        【解决方案4】:

        我投票支持 Chris Brandsma 的回答。

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            我更喜欢以下:

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

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

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

            【讨论】:

              【解决方案7】:

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

              所以我的尝试是

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-01-04
                • 1970-01-01
                • 1970-01-01
                • 2015-06-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多