免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2007-01-07 10:38 |只看该作者
原帖由 nully 于 2007-1-7 10:32 发表


经过编译后指针的类型已无从考证,也只能进行null检查了
像 fprintf("abc%d", a), 这个函数已无法检查传进去的是不是FILE *

从内部检查固然可以增加库的键壮性,但在一些关键的,调用密集形的函 ...



就是这样, 只能说计算机科学还处于chaos阶段, 还在摸索......

所以调用者本身应该很熟悉底层接口...不过大家都喜欢造wheel, 还造了很多, 有免费的, 有收费的...多多少少增加了软件工程的困难.

论坛徽章:
0
32 [报告]
发表于 2007-01-07 10:50 |只看该作者
assert本身就是debug版,有个文档写过,我没看源码,应该如此,那本书还是比较的经典。

其实我是只能在b判断,其实理由很简单,既然要在a判,为了省代码,就写在b。
程序的健壮性是比效率要重要的得多。大部分的判断都是debug版而在发布版可以不使用,当然要做详细的测试。
assert判断,可以改写成分级的判断,release时,根据规则把部分判断去掉。

论坛徽章:
0
33 [报告]
发表于 2007-01-07 11:00 |只看该作者
原帖由 nully 于 2007-1-7 10:32 发表


经过编译后指针的类型已无从考证,也只能进行null检查了
像 fprintf("abc%d", a), 这个函数已无法检查传进去的是不是FILE *

从内部检查固然可以增加库的键壮性,但在一些关键的,调用密集形的函 ...


其实素数的检查我的意见是放在b检查,如果调用者忘了呢?

比方在调用b前需要做检查,100个,都是素数检查。这个代码量是不是?

既然都要检查,那就省代码,放在b,如果发现某个检查其实不必要,改动的话,只要改b一个就可以了,
而不用改所有调用b的函数,可能b这个函数被引用了1w次。

如果b只调用一次,那放在a和b都无所谓,但从聚合度来看,b对他要处理的内容一定要判断是否是合法的,不能依赖于他所不能确定的东西。也就是说每个实体要是完备的。

如果放在a的话,a和b的编写者不是一个人,那么a要很了解b才能知道里面复杂的判断关系,
或许b的判断语句只需要1句话,那a是不是要问b的开发者这句话如何写?还是看文档?还是阅读源码?
如果文档和代码不同步?如果代码实行了保密制度,那b的源码根本看不到,如何?如果这个判断还是动态的?所以还是b来判断。

一个比较典型的例子是b可能是一个由1万行代码组成的函数(直接或者间接),那么编写a的人员是不是得吐血?

[ 本帖最后由 njmpop 于 2007-1-7 11:09 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2007-01-07 11:12 |只看该作者
如果有在a调用的好处,请支持者给个例子看看。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015亚冠之广州恒大
日期:2015-07-22 17:20:15
35 [报告]
发表于 2007-01-07 11:13 |只看该作者
牛智瀚(37786734) 11:10:38
其实一般来说看两个函数之间的紧密程度了
牛智瀚(37786734) 11:10:56
没有统一的标准
暗夜精靈 (5667320 11:13:50

牛智瀚(37786734) 11:11:43
不过我有一个基本的原则是调用方尽量不传无用数据,而被调方在数据出错时要能够返回,不能直接崩掉

论坛徽章:
0
36 [报告]
发表于 2007-01-07 11:17 |只看该作者
两种说法都有道理。

如果编写 A 调用和编写 B 调用的开发人员不是同一个,那么这两个开发人员的沟通和交流就非常重要。实际上如果协调好了的话,不会产生什么问题。个人观点。

论坛徽章:
0
37 [报告]
发表于 2007-01-07 11:18 |只看该作者
原帖由 langue 于 2007-1-6 17:43 发表


然。但宜把判断尽可能多地置于最外层调用处。否则额外的判断会产生垃圾,以及性能缺陷。


我倒是觉得在最外层倒是容易产生甬余代码,产生垃圾。同一个代码写多遍就是垃圾。
主函数写太多的判断,倒是影响业务逻辑的阅读,把判断放到函数里,理解业务逻辑倒是容易些。

性能不会有太大缺陷,都是执行相同的代码,至多多执行一次函数调用,但同样会多有一次if判断。

函数调用的性能比if的性能慢就慢点,这个就无所谓了。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015亚冠之广州恒大
日期:2015-07-22 17:20:15
38 [报告]
发表于 2007-01-07 11:19 |只看该作者
但是如果每个人只负责一个函数 那么不管写A还是B都应该做下 保证自己写的东西不出问题 要出也是别人的问题 也是个人观点

论坛徽章:
0
39 [报告]
发表于 2007-01-07 11:19 |只看该作者
原帖由 langue 于 2007-1-7 11:17 发表
两种说法都有道理。

如果编写 A 调用和编写 B 调用的开发人员不是同一个,那么这两个开发人员的沟通和交流就非常重要。实际上如果协调好了的话,不会产生什么问题。个人观点。


其实生产中是b的开发人员辞职走了。
或者b是一个内存数据库的接口函数,判断逻辑相当复杂。
或者b是一个com调用,开发者根本就不是一个公司的人。

[ 本帖最后由 njmpop 于 2007-1-7 11:23 编辑 ]

论坛徽章:
0
40 [报告]
发表于 2007-01-07 11:24 |只看该作者
原帖由 ghostwwl 于 2007-1-7 11:19 发表
但是如果每个人只负责一个函数 那么不管写A还是B都应该做下 保证自己写的东西不出问题 要出也是别人的问题 也是个人观点


关键问题是a可能根本就不知道b需要什么判断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP