2010-05-26 144 views
7

我和我的同事讨论了以下最佳实践问题。
大多数函数/方法都以一些参数检查开始。风格的if:嵌套或不嵌套

我主张以下风格,避免嵌套。

if (parameter one is ugly) return ERROR; 
if (parameter two is nonsense || it is raining) return ERROR; 
// do the useful stuff 
return result; 

他,谁来自更多的功能/逻辑编程背景,更喜欢下面的,因为它减少了从函数退出点的数量。

if (parameter one is ok) { 
    if (parameter two is ok && the sun is shining) { 
     // do the useful stuff 
     return result 
    } 
} 
return ERROR; 

您更喜欢哪一个?为什么?

+3

使用警卫条款的建议。检查Fowlers重构规则:http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html - 它将您的第二个(嵌套)转换为第一个(guard子句)。 – Konerak 2010-05-26 14:39:50

回答

0

第二个我通常更喜欢,除非整个函数体将包装在if语句的X号码。如果是这样,我会选择第一个选项。

5

只要样式在代码库中一致,这两种样式中的任何一种都可以。

0

我更喜欢第一个。 5298529357级别的缩进只是在我的神经上磨砺。

此外,当您立即返回时,很明显(参数一丑)是一个错误。

1

我更喜欢在函数的开始处进行所有输入参数验证,并且仅在那里执行return。因此,我更喜欢大多数时候的第一种方法。如果只有一层嵌套,那么我可能会选择第二个选项。

12

我个人更喜欢第一种风格,因为我觉得它提供了我们可以称之为“错误案例”和“方法逻辑”之间的逻辑分离。在该方法的开始有一个定义好的块,用于评估和处理输入中的任何错误,然后该方法的其余部分全部关于该方法实际应该做什么。

这是微观层面上的某种分离问题,我想。

0

最可读的风格是:

if (parameter one is ok) 
{ 
    if (parameter two is ok && the sun is shining) 
    { 
     // do the useful stuff 
     return result 
    } 
    else 
    { 
     // do other things 
    } 
} 
return ERROR; 

至少对我来说:)

编辑:对不起,误解了这个问题。我投第一,不喜欢深嵌。

2

在两次检查的情况下,或者确实没问题,一旦你添加更多,选项1快速变得越来越可取!

0

在我看来,它只取决于你需要的错误类型。
如果例如参数一是ugly但在下面的代码中,您可以设法将其状态更改为pretty第二种方法更可取。
但是如果错误是致命并且无法处理,您应该立即返回。
这里有第三种选择,其中第二种样式最适合,并且是当您想要将所有错误收集到一个连贯的错误消息。
第二种风格不应检查有效性,而应首先检查无效性。
至于个人喜好,我会更喜欢第一种风格。

0

我们的内部风格是为了避免多个return分,另外还限制嵌套的量,所以我可能会结合您的前置条件完整性检查一起做这样的事情:

result_t result = OKAY;  

// Sanity checks 
if ((parameter_one == ugly) || (parameter_two == nonsense) || (weather == raining)) 
{ 
    result = ERROR; 
} 
else 
{ 
    // do the useful stuff 
} 

return result;