编写多条件检查的最可读/最佳方法是什么,如下所示?
我能想到的两种可能性(这是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,我不喜欢的是,它无需创建变量,需要查看两个位置。
那你觉得怎么样?任何其他选项?
答案 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);
}
通过这种编码风格,我完成了两件事:
答案 6 :(得分:1)
Option1是应用重构“Replace temp with Query”的主要选择。原因是有人可以填充变量之间的代码,并且检查并更改代码的行为。或者可能使用陈旧值进行检查。在初始化和检查之间对文本字段进行了更新。
所以我的尝试就是
if (GetPasswordLength() > 0
&& FieldHelper.IsNotEmpty(stationIDTextField)
&& FieldHelper.IsNotEmpty(userNameTextField)
{
okButton.setEnabled(true);
}
FieldHelper是一个带有公共静态方法的类(在C#中也称为Utility类/ Static类)