免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2011-12-04 16:19 |只看该作者
回复 14# 三月廿七


    所以我只用一些子集啊,RAII(好东西),适当的虚函数(看需要,这个东西有ABI的问题),尽可能少的模板(很少用),还有,我喜欢把成员变量都写成public,除非真的需要受限访问,真不懂java或者c#这种语言为什么要把变量访问搞成受限的,然后又来一对get/set。有见解没?

论坛徽章:
0
22 [报告]
发表于 2011-12-04 16:24 |只看该作者
回复 16# 幻の上帝


    其实,除了RAII,我自己经验还有一个就是和其相对的“资源获取既资源释放”,具体如下:

构造函数不分配任何资源,只将对象初始化到一个无效状态(指针置NULL等),然后有配对的Open/Close或Alloc/Release或Initial/Destroy来真正初始化对象资源,同时返回错误码。在Open/Alloc/Initial里面第一句就是调用Close/Release/Destroy等函数释放已获取资源,确保对象没有资源泄漏。这个就是我的资源获取既资源释放。生和死本来就是鸡生蛋蛋生鸡的问题。

论坛徽章:
0
23 [报告]
发表于 2011-12-04 16:26 |只看该作者
回复 14# 三月廿七


    用c++等所谓面向对象的语言有一个好处就是给资源加了域,方便资源管理和自动代码工具处理。

论坛徽章:
0
24 [报告]
发表于 2011-12-04 16:38 |只看该作者
本帖最后由 xhl 于 2011-12-04 16:42 编辑
回复  三月廿七


    所以我只用一些子集啊,RAII(好东西),适当的虚函数(看需要,这个东西有ABI的 ...
walleeee 发表于 2011-12-04 16:19



-----------真不懂java或者c#这种语言为什么要把变量访问搞成受限的,然后又来一对get/set。有见解没?--------------


当初也跟你有类似的疑惑, 但随着做实际的东西多了, 才真正明白这样做的几点好处。

1. 避免一个共有成员变量被到处修改, 当你想下断点找是谁修改一个变量的时候, 当有get/set的时候非常方便, 断在这个函数内, 看callstack就可以了。

2. 有很多应用并不是简单的修改类的成员变量的数值, 他需要一定的规则, 举个例子, 当你想知道哪些变量在程序执行时候被修改, 哪些没被修改的时候, 你就需要有统一的地方做一个统一的标脏处理。 所以需要set/get函数。

3. 这个是很好的设计风格, 在多人开发, 多公司配合, 多模块库配合的项目里, 这样做虽然从个人开发角度讲, 显得麻烦, 但对于长期维护的大型项目来说, 利大于避, 主要的好处体现在长期维护, 后期修改。 如果你没get/set, 当应用这到处修改你的成员变量的时候, 几年后, 这代码基本无法维护。 也就是说当初实现这写了get/set不仅仅是为了实现功能, 还给自己将来维护留下一个入口。


要知道想得到任何好处都是有代价的。而且有些好处仅仅体现在很复杂的应用情况下, 在简单的模型下, 反倒显得多余。

论坛徽章:
0
25 [报告]
发表于 2011-12-04 16:52 |只看该作者
本帖最后由 三月廿七 于 2011-12-04 17:04 编辑
回复  三月廿七


    所以我只用一些子集啊,RAII(好东西),适当的虚函数(看需要,这个东西有ABI的 ...
walleeee 发表于 2011-12-04 16:19

因为 变量的仿问是受限的,所以要 提供公有的 get/set接口啊
这个方面java就比 c++ 先进了(其实人家还有很多人性化的设计),人家明着让你提供 get/set接口呢,
而c++ 就不会...

把成员变量都写成 public 就很糟糕了,最起码违反了 面向对像 "封装" 的规则

论坛徽章:
0
26 [报告]
发表于 2011-12-04 17:04 |只看该作者
回复 19# walleeee

据我所知,没……

论坛徽章:
0
27 [报告]
发表于 2011-12-04 17:07 |只看该作者
回复 22# walleeee

这个也是常用的idiom。比起构造函数和析构函数而言的缺点是不会隐式生成代码,如果多了的话写起来稍微累一点。

论坛徽章:
0
28 [报告]
发表于 2011-12-04 17:17 |只看该作者
回复 25# 三月廿七

变量的访问为什么是受限的?你凭什么确定所有变量都需要是这样?
写个public就叫违反封装?struct算什么?文件算什么?你以为封装是什么
限制用户自由选择的权利就叫人性化,就叫先进?
需要public的时候还get/set,从语义角度来说就是脱裤子放屁——好处是裤子不会变味,适合ZB。
考虑到人以及工具的问题,实际情况倒是和24L所说的一样。不过,如果不考虑代码自动生成的需求,要一个不落地留下get/set还不如逼人留下足够清楚的文档。

论坛徽章:
0
29 [报告]
发表于 2011-12-04 19:13 |只看该作者
回复  三月廿七

变量的访问为什么是受限的?你凭什么确定所有变量都需要是这样?
写个public就叫违反封 ...
幻の上帝 发表于 2011-12-04 17:17


这个我回复不了你, 你看看24楼的回帖吧

论坛徽章:
0
30 [报告]
发表于 2011-12-04 19:19 |只看该作者
1. 避免一个共有成员变量被到处修改, 当你想下断点找是谁修改一个变量的时候, 当有get/set的时候非常方便, 断在这个函数内, 看callstack就可以了。
xhl 发表于 2011-12-04 16:38



get/set最后还是要inline掉的,没有callstack

再说,调试器可以直接在访问某变量时停住吧,不需要callstack
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP