最易读的编写简单条件检查的方法是什么?

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的原因是它为无用变量赋值,而且需要查看两个位置。
那么你觉得呢?还有其他选项吗?

1
现代IDE具有自动缩进工具,那为什么还要费力呢? - Fabio Vinicius Binder
7个回答

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


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

等等。


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

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

我投票支持Chris Brandsma的答案。

但是我想提一下Option 1的主要问题,那就是你失去了&&的好处。使用Option 1时,虽然我认为它更易读,但你可能会在不需要比较时进行比较处理。


1

我更喜欢以下内容:

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

通过这种编码风格,我可以实现两个目标:

  • 由于在开头使用了 &&(或 ||),因此我可以轻松地看到 if 语句的每一行额外条件。
  • 由于下一行有 {,因此我可以轻松地看到 if 语句的结束位置。

1

对于应用重构 '使用查询替换临时变量',Option1 是最佳选择。原因是在变量初始化和检查之间,有人可以插入代码并更改代码的行为。或者检查可能使用过期的值...在初始化和检查之间更新了文本字段。

因此,我的尝试是

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

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


1
个人而言,我喜欢第二种方式,因为我发现使用这种方式可以使条件语句的预测清晰明了。也就是说,用适当的方法可以通过“口头表达”使条件语句可理解(实际上是否说出来都不重要)。
也就是说,使用你的第二个选项,条件语句大致翻译为:“如果密码长度大于零,并且站点ID文本字段(修剪后)不为空,并且用户名文本字段(修剪后)不为空,则…”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接