代码之家  ›  专栏  ›  技术社区  ›  JRL

编写简单条件检查的最具可读性的方法

  •  6
  • JRL  · 技术社区  · 15 年前

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

    备选案文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 回复  |  直到 14 年前
        1
  •  27
  •   Chris Brandsma    15 年前
    if (HasPassword() && HasStation() && HasUserName())
      okButton.setEnabled(true);
    
    
    bool HasPassword() {
     return passwordField.getPassword().length > 0;
    }
    

        2
  •  6
  •   Trent    15 年前

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

        3
  •  4
  •   Chad Birch    15 年前

    我将修改选项1,以便您使用的变量名实际上有意义。也就是说,将“c2”的名称更改为类似“stationisempty”的名称(并将NOT移到conditional中)。通过这种方式,条件语句是可读的,而不必来回查看每个变量。

    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
  •  3
  •   Crispy    15 年前

    我投票支持Chris Brandsma的答案。

        5
  •  1
  •   Paul Sonier    15 年前

    就我个人而言,我喜欢第二种方法,因为我发现使用这种方法可以使条件句的断言变得清晰。也就是说,通过正确地使用该方法,您可以通过“真实化”条件使其可理解(无论您是否实际说它都是无关的)。

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

        6
  •  1
  •   Gaston    15 年前

    我比较喜欢以下几点:

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

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

    • 我可以很容易地看到,由于&&(或| |)在乞讨处。
    • 我可以很容易地看到if语句的结尾,因为{位于下一行。
        7
  •  1
  •   Gishu    15 年前

    Option1是应用重构功能的首要选项 Replace temp with Query

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

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