如果一个函数在里面进行了所有正确的检查,我应该在调用之前检查所有内容,还是最好不要?安全冗余被认为是一种好的做法吗?
示例(在一种类似C#的伪代码中,通过引用参数传递):
doSomething(vector v) {
...;
v.clear;
useCleanVector(v)
}
useCleanVector(vector v) {
if(!v.isClean) v.clear;
...
}
答案 0 :(得分:4)
最重要的是,您以明显的方式记录您的先决条件和特殊情况。这样的事情似乎很明智。
/**
* precondition : id must be the id of a flarg.
*
* myfunc will return -1 if value is outside the valid 0-10 range.
*/
int myfunc( int id, int value );
这让我可以编写类似这样的代码
int flarg_id = ...
if (! is_flarg( flarg_id ) ) { printf("Bad flarg"); exit(1); }
int value = ...
int rv = myfunc( flarg_id, value );
if( rv == -1 ) { printf("Bad value"); exit(1); }
答案 1 :(得分:1)
有冗余(通常很好),并且重复自己。
借用Josh的例子,如果函数Foo
保证它清除向量,则没有理由事先清除它。信任并验证您的API提供的保证。
另一方面,即使您确信数据访问界面完全抵御任何恶意活动(您自己检查了条件前后的每个程序!),也没有理由将该表面暴露给未经授权的用户。找到你的瓶颈,并保护这些瓶颈,以防更深层次的代码存在你还不知道的漏洞。
答案 2 :(得分:0)
我说这是糟糕的形式。不是很糟糕的形式,而是导致这种形式的同一种形式:
v.clear(); // clear the vector to be safe.
v = v2;
如果你的方式是重现已经在函数中的代码,那么你首先要把它放在函数中来节省时间。如果对函数的每个调用具有相同的前导码,则违反DRY概念。
最好了解函数检查的内容以及不执行的操作,并相应地使用它。
答案 3 :(得分:0)
是的,您应该始终在该范围内执行所需的检查。
原因?当有人在n个月之后进来时,他们不会按照功能调用到最后一项。确保每个功能本身都受到保护将有助于缓解愚蠢的错误,或者更糟糕的是,这些错误很难被追踪。