免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

[函数] [讨论]判断参数正确性是调用函数的责任还是被调用函数的责任? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-01-06 18:45 |只看该作者
放在B里是不应该有一点异议的,理由两条
1)放在调用处,则会使对B的调用参数的判断代码分布在所有调用B的代码处,一旦B的定义被修改,那岂不是到处修改判断参数合法性代码么
2)几乎我看过的库都是将这部分放到函数的最前面的,如果参数达不到要求立即返回.

论坛徽章:
0
12 [报告]
发表于 2007-01-06 19:20 |只看该作者
个人愚见: 如果是对库的内部接口 assert 下吧, 这种错误, 往往是库实现bug, 但是给用户的接口, 如果无伤大雅, 千万不能随便抛出 assert ...不然如果是用户调用错误, 也会让人觉得是库的健壮性不好吧...

论坛徽章:
0
13 [报告]
发表于 2007-01-06 19:33 |只看该作者
原帖由 朱熹之 于 2007-1-6 18:44 发表
出于安全和稳定性的考虑,在被调用的函数中一定要对所有的输入进行检查!


也不一定,strcpy就是很好的例子。

论坛徽章:
0
14 [报告]
发表于 2007-01-06 19:38 |只看该作者
原帖由 langue 于 2007-1-6 17:34 发表
我认为遵循简单原则即可。

赞同
如果判断比较简单的话,应在被调用者中实现(优先考虑);如果判断越来比较复杂可以由调用者保证。
在健壮性、性能方面找个折衷点,考虑简单原则。
个人愚见

论坛徽章:
0
15 [报告]
发表于 2007-01-06 21:07 |只看该作者
我以前的意见是,调用者负责检查。
但最近看到越来越多的函数,都是在内部检查。弄得我现在成了两面派。

不过,进行内部检查的,往往只是进行指针有效性检查(是否NULL)。这可能是因为对NULL指针的误操作影响重大。

我建议你也只作NULL检查。其余的,仍然交给调用者本身。

论坛徽章:
0
16 [报告]
发表于 2007-01-06 22:09 |只看该作者
我决定采取折中的策略来处理这个问题,对assert用宏进行一个封装。


  1. #ifdef NOT_USE_ASSERT
  2. #define CGL_ASSERT(x)
  3. #else
  4. #include <assert.h>
  5. #define CGL_ASSERT(x) assert(x)
复制代码


默认情况是检查。

论坛徽章:
0
17 [报告]
发表于 2007-01-06 22:19 |只看该作者
总有一层需要严格检查参数,但是不必每层都检查

有一种思想是:基于契约的编程  可以找来参考

mfc大量的使用assert,因为assert在调试阶段会跳出异常,这样做到严格检查了。
在发布阶段,assert被定义成空语句,效率提高了,如果出现错误嘛——由他,跳出“非法操作”就是了

论坛徽章:
0
18 [报告]
发表于 2007-01-06 22:29 |只看该作者
原帖由 dulao5 于 2007-1-6 22:19 发表
总有一层需要严格检查参数,但是不必每层都检查

有一种思想是:基于契约的编程  可以找来参考

mfc大量的使用assert,因为assert在调试阶段会跳出异常,这样做到严格检查了。
在发布阶段,assert被定义成空 ...


debug版用,release不用倒也是一个思路吧。

论坛徽章:
0
19 [报告]
发表于 2007-01-06 22:30 |只看该作者
给DEBUG分个级别吧...对于那种概率极小的错误, #if 时候就级别低些. 对于概率大些的 #if 就用高级别的.
编译时候指定 DEBUG 级别, 有选择的容错....也是个办法吧

论坛徽章:
0
20 [报告]
发表于 2007-01-06 23:40 |只看该作者
小弟喜欢在B里判断,感觉会好些, 但是常常出现重复检测的情况。
在对性能要求不高的地方,多判断几次应该还可以, 对性能要求很高的地方,反正到后期还要优化。先写好,优化时再考虑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP