2009-04-28 81 views
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有自动识别工具,为什么botter? – fbinder 2009-04-28 17:02:47

回答

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


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

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); 
} 
1

就个人而言,我喜欢的第二种方式,因为我发现,使用这种方式可以使条件句的预测明确。也就是说,用这种方法做得很好,你可以通过“修正”它来使条件变得容易理解(不管你是否真的说它是无关紧要的)。

也就是说,使用第二个选项,变得很清楚您的条件转换大致如下:“如果密码长度大于零,并且stationIDTextField(trimmed)不为空,并且usernameTextField(trimmed)为不为空,那么......”

1

我更喜欢以下内容:

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

有了这个编码风格我完成两两件事:

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

选项1适用于重构'Replace temp with Query'。原因是有人可以在变量之间填入代码并进行初始化并检查并更改代码的行为。或者检查可能是用陈旧的值进行的。在初始化和检查之间已经对文本字段进行了更新。

所以我在此尝试将

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

FieldHelper是公共静态方法(也称为C#中的实用工具类/静态类)

6

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

3

我投了Chris Brandsma的回答。

但只是想提到我与选项1有关的主要问题是您正在失去& &的好处。使用选项一,尽管我认为它更具可读性,但您可能不需要时正在处理比较。

+1

请参阅http://en.wikipedia.org/wiki/Short-circuit_evaluation – 2009-04-28 17:21:15