免费注册 查看新帖 |

Chinaunix

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

异常安全的代码写起来还是很纠结的 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
41 [报告]
发表于 2011-12-04 20:42 |只看该作者
不知道, 我觉得大多数情况下都是不合理的实现方式
我觉得如果要面向对象,整个工程都要面向对象

你遇到过仿问一个外部变量,然后在每一个文件都来一个
extern global_x? 的恶心代码吗?
三月廿七 发表于 2011-12-04 20:36


你这个与 point 应该是 x,y 还是 getx,gety, setx, sety 之间有何联系?
与之有联系的是 extern struct point global_point;


是不是这些概念之间的区别对于你来说都是这么不明显的? 都是这么容易产生联想的?

论坛徽章:
0
42 [报告]
发表于 2011-12-04 20:48 |只看该作者
你这个与 point 应该是 x,y 还是 getx,gety, setx, sety 之间有何联系?
与之有联系的是 extern struc ...
OwnWaterloo 发表于 2011-12-04 20:42


忽然间联想到了,也不知道有没有关系

论坛徽章:
0
43 [报告]
发表于 2011-12-04 20:59 |只看该作者
回复 37# walleeee


我觉得,set/get没有任何语义。一个成员,真的需要set/get函数时候,就得写。哪怕你不用C++,用用C写的面向对象代码。

一个对象的内部状态随意改变,本身就是不好的一个设计,因为私有成员变量“意外”改变了,程序出错,说明:这个变量改变时有特殊行为,这个行为本身就该独立成一个方法
如果私有变量改变,程序没任何问题,说明:变量直接给外部访问也没有问题

比如,一个窗口类,你可以setWidth,因为setWidth确实有行为,或者enable一个特性。连C的面向对象程序都需要单独写一个方法来处理这些东西
但是C语言里你可以随便修改的一个结构体成员,拿到C++/Java里用get/set包装下有啥用呢?

论坛徽章:
0
44 [报告]
发表于 2011-12-04 21:02 |只看该作者
回复  walleeee


我觉得,set/get没有任何语义。一个成员,真的需要set/get函数时候,就得写。哪怕你不 ...
reiase 发表于 2011-12-04 20:59


我比较赞同你的这个观点...

论坛徽章:
0
45 [报告]
发表于 2011-12-04 21:05 |只看该作者
回复  reiase


    调试级别的代码是不会被inline掉的。另外,在调试过程中的确可以watch变量,不过想 ...
walleeee 发表于 2011-12-04 20:33



还有hook,其实都要用到hook了,已经不是set/get这种简单东西能够处理的问题了,就应该设计一套机制专门处理hook和消息

论坛徽章:
0
46 [报告]
发表于 2011-12-04 22:25 |只看该作者
本帖最后由 xhl 于 2011-12-04 22:43 编辑
还有hook,其实都要用到hook了,已经不是set/get这种简单东西能够处理的问题了,就应该设计一套机制专 ...
reiase 发表于 2011-12-04 21:05



恩, 我说的2点不是hook, hook是缺省提供一套实现, 同时提供给上层一个回调注册机制, 用户可以用自己的实现代替掉缺省实现。

其实get/set应该不算实现细节问题, 我认为应该是项目管理方面的约定。 好处是便于维护, 大家用到的系统调用跟库函数, 几乎没很少有直接把数据暴露给外层直接修改数据的。 虽然他们那些函数不是针对某个变量的修改, 一般都是针对功能。

但如果要做到那样, 做库的人会很纠结, 起码要弄清楚你实现的接口, 既保证通用灵活, 又能保证稳定安全。 (如果你提供给外面用户直接修改你的内部数据, 那万一他给一个非法值, 导致内部库崩溃, 这个BUG算谁的? 我想更多还是库不稳定)

我觉得是否为每个变量用get/set没有对跟错,只是风格问题, 但直接用公有数据是绝对有问题的, 除非你做的是最顶层的应用, 只有自己调用到你的代码, 不会有其他人或者上层应用使用你的代码。



我说的第2点的意思是, 当你有针对每个变量的get/set的时候, 你起码有机会针对应用试图修改你的这个变量的时候, 做一些基本的安全判断跟保护的意思。 还有就是在复杂的多线程异步程序模式下, 你可以在这些函数里打印修改他的线程id跟统计

修改次数啥的。 反正就是便于找问题的时候有地方添加代码。

大家不要总是假定项目所有代码都是你写的或者你都懂, 我经常调试一些BUG, 但上层调用者的代码我基本很难在短时间内查看完全明白, 因为代码量跟逻辑太多, 所以我一般会通过底层接口部分加一些逻辑来分析问题。

论坛徽章:
0
47 [报告]
发表于 2011-12-04 23:36 |只看该作者
回复 46# xhl


    很有道理,但主要还是get/set感觉有点麻烦啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP