什么是最佳做法?
function A() {
if (someClassValue > 0) {
B();
}
}
function B() {
...do smth, you expect (someClassValue > 0)...
}
这里编码人员可能忘记在调用前检查条件,并运行系统不一致... 但是从逻辑的角度来看,调用者调用函数,因此他应该在调用函数时负责条件,另一方面,它容易出错
或
function A() {
B();
}
function B() {
if (someClassValue > 0) {
return;
}
...do smth...
}
从身体A的角度来看,这看起来可能具有误导性。
或
function A() {
if (someClassValue > 0) {
B();
}
}
function B() {
if (someClassValue > 0) {
return;
}
...do smth...
}
这是不必要的双重检查
什么是正确的做法?应该是函数检查要执行的条件,还是调用此函数的函数检查调用B的条件
答案 0 :(得分:4)
规则: 始终验证所有公开曝光的功能中的参数。
推论:没有必要在任何非公开曝光的函数中验证参数。这通常具有一些边际性能优势,但它也使您的代码保持清洁和易于阅读,特别是如果您遵循其他良好的设计模式并将面向公众的功能调用到合并的私有函数中以进行实际工作。
如果和仅,如果分析告诉您参数验证是您应用程序中的重要瓶颈,那么您应该关注最小化影响点并将其修剪到非绝对必要的地方。或者,您可以将它们保留用于调试版本并将其删除以用于发布版本,从而最大限度地降低性能影响,同时仍然实现其完整性检查的基本目的。但我必须说,我从来没有见过参数验证是一个瓶颈应用程序......
至于你上面的问题(我很容易忽略),只要你遵循上述规则,选择哪种风格并不重要。正如通常标记为coding-style的问题的情况一样,最重要的是选择一种风格并坚持使用 - 从长远来看,一致性是真正的赢家。
答案 1 :(得分:1)
它完全取决于您提供的公共API,以及特定函数是否可以信任其输入有效的必然结果。在防御性编码和编写清晰简洁的代码之间总是需要权衡。
B
是该公共API的一部分吗?如果是这样,我会说你通常不应该信任来自未知代码的输入(例如你的API的消费者),所以检查B
。
答案 2 :(得分:1)
这取决于你的程序,有时你需要检查所有条件,有时你不需要。如果构造函数保证所有数据成员的实例化,那么您只需要检查操作数据成员的数据的输入。因此,请确保检查接受更改数据成员的参数的函数是否为空值,但即使在那时它依赖于您正在使用的编程语言。
如果您想要更准确的答案,则需要更多信息。
答案 3 :(得分:0)
#2。你不能假设每个调用函数都会正确地进行检查。