我和我的一位同事就以下最佳实践问题进行了讨论 大多数函数/方法都是从一些参数检查开始的。
我提倡以下样式,避免嵌套。
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;
您更喜欢哪一个?为什么?
答案 0 :(得分:12)
我个人更喜欢第一种风格,因为我觉得它在我们可以称之为“错误情况”和“方法逻辑”之间提供了一些逻辑分离。在方法的开头有一个定义良好的块,用于评估和处理输入中的任何错误,然后方法的其余部分都是该方法实际应该做的事情。
我认为这是微观层面上某种关注点的分离。
答案 1 :(得分:5)
只要样式在代码库中是一致的,这两种样式中的任何一种都适合我。
答案 2 :(得分:2)
如果是两次检查,那么其中一种确实可以,一旦你添加更多,选项1很快就会变得越来越可取!
答案 3 :(得分:1)
我更喜欢在函数开头执行所有输入参数验证,并且仅在那里执行return
。因此,大多数时候我更喜欢第一种方法。如果只有一个嵌套级别,那么我可能会选择第二个选项。
答案 4 :(得分:0)
我通常更喜欢的第二个,除非整个函数体将包含在X个if
语句中。如果是这样,我会选择第一个选项。
答案 5 :(得分:0)
我更喜欢第一个。 5298529357的凹痕水平只是让我神经紧张。
除此之外,当你马上回来时,很明显(参数一是丑陋)是一个错误。
答案 6 :(得分: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;
至少对我来说:)
编辑:对不起,误解了这个问题。我投票给第一个,不喜欢深度筑巢。答案 7 :(得分:0)
在我看来,这只取决于您需要的错误检查类型
例如,如果参数1为ugly
,但在以下代码中,您可以设法将其状态更改为pretty
,第二种方法更可取。
但是,如果错误致命且无法处理,则应立即返回
这里有第三种选择,第二种风格最适合,当你想将所有错误收集到一个连贯的错误信息中时。
第二种方式不应该首先检查有效性,而是检查无效性
至于个人喜好,我会对第一种风格更开心。
答案 8 :(得分: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;