2010-10-08 34 views
1

如果一个函数内部进行了所有正确的检查,我应该在调用它之前检查一切,还是更好?安全冗余被认为是一种好的做法吗?保险是好还是不好的方式?

例子(一种类似C#的伪代码的使用按引用参数传递):

 

doSomething(vector v) { 
    ...; 
    v.clear; 
    useCleanVector(v) 
} 

useCleanVector(vector v) { 
    if(!v.isClean) v.clear; 
    ... 
} 
 
+3

真的取决于你正在写什么样的软件。 – 2010-10-08 01:52:38

+4

这个问题对于一个很好的答案来说太笼统了......也许你可以给出一些代码示例? – 2010-10-08 01:54:14

+0

这与函数式编程有什么关系? – 2010-10-08 02:24:28

回答

0

我会说这是不好的形式。不可怕的形式,但同一种形式,导致此:

v.clear(); // clear the vector to be safe. 
v = v2; 

如果你的方式是通过在功能让它重现这已经是一个函数里,那么你就不能节省时间的代码第一名。如果每次调用某个函数都有相同的前导码,则违反了DRY概念。

最好理解该函数检查的内容以及它没有做什么并相应地使用它。

+0

我不认为这是他的意思。他的意思是像调用函数时检查函数参数的有效性一次,并且一旦它进入它就好像 – 2010-10-08 01:57:28

+0

@Pekka。但从数学逻辑的角度来看,就像@JoshD所说的那样。 – Ivan 2010-10-08 02:00:35

+0

@Ivan是的,但你的函数可能会在以后的* *不执行第一个检查的环境中使用。在这种情况下,第二个检查*可能有意义(这也可能是不必要的,真的取决于你的项目) – 2010-10-08 02:02:19

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); } 
+0

+1。只要文档能清楚地说明在什么情况下功能将会做什么,一大部分不确定性就会消失 – 2010-10-08 02:00:47

0

是的,你应该总是在执行的范围内该级别所需要的检查。

原因?当n个月后有人进来时,他们不会按照最后一个项目调用函数。确保每个函数本身都受到保护,这将有助于缓解愚蠢的错误,或者更糟的是,难以追踪的错误。

+0

虽然这取决于支票的价格。如果代码是有据可查的,那么严格可能会超出必要的范围 – 2010-10-08 02:00:12

+0

我认为这样做很重要,但恐怕在某些情况下甚至会引入难以追踪的错误。 – Ivan 2010-10-08 02:02:10

+0

@ Ivan不是如果你的函数有很好的文档记录,并且每一个调用该函数的实例都是根据该文档编写的。文档是关键 - 如果它很好,可以根据它编写代码,并相信它会提供预期的输入 – 2010-10-08 02:04:23

1

有冗余(通常很好),并且有重复你自己。

借用Josh的例子,如果函数Foo保证它清除一个向量,没有理由事先清除它。信任并验证您的API提供的保证。另一方面,即使你确信数据访问表面完全抵御任何恶意活动(你检查了每个过程前后的条件!),但没有理由将该表面暴露给非法用户。找到你的瓶颈,并确保它们的安全,以防万一你的代码更深入地存在你还不知道的漏洞。

相关问题