原创  private是我们的心病 收藏

张云开(117670538) 20:07:37

最近编程,我有一个观点,说出来看看大家的意见。

我觉得底层的库,不应该封装得太严实,否则当我们想直接了当的访问数据的时候,总会有一种隔鞋瘙痒的感觉,
为什么我们总是喜欢把一些公共的数据封闭为private?  

我觉得更多不是安全性问题(因为就C语言而言,一切都是公共的,照样可以开发出稳定的linux内核,其实就我们的低层库而言,就是给我们程序员使用的,C/C++就是本着信任程序员而设计的),我觉得造成这种用法,是我们在学习C++的过程,被世面上的大多数过度宣传面向对象思想的教材所害!  

一遇到数据,就喜欢用private限制一下,否则就浑身不舒服,唯巩调用者,会弄出什么乱子来,这是我们的观念在作怪!

举个例子,今天我就遇到这种情况,我想使用:

class AcctItemAccuMgr : public AcctItemBase 类里的一个指向共享内存的变量,m_poAcctItem

可是,它在基类被封装成proteced了。
但我使用这个类,就是操纵共享内存呀,就是为了可以向其添加数据呀,但我现在观察了这个类的接口,没办法如果我要做到操纵共享内存,显然我只能再在这个类里添加一些接口了。 

在我意识叫,靠接口来过渡,总会带来性能的损失,而且既然我的任务就是为了操纵共享内存,为什么不直接给我访问这个变量的权限呢?这样不就直接了当了吗?省时省力呀? 

然后,我一想到为了实现这个目标,我必须把基类的权限开放为public, 对,就是这么简单,改一个单词就可以了,可是为这件事,我左思右想,寝食难安,因为我的观念里,就是根深蒂固地,觉得这样做是一个危险动作? 

大家会不会有这种感觉呢?

但是,我真想打破这个思想的枷锁!!!

改一个单词,获得的是生产效率的提高哇。。。。

看看大家的意见。
蔡登科(4040870) 20:09:14
这个很多东西一放开就不好控制了
张云开(117670538) 20:09:28
你说一下不好控制的理由
蔡登科(4040870) 20:09:59
自己的东西自己保管好
蔡登科(4040870) 20:10:02
可以向外界暴露接口嘛

张云开(117670538) 20:10:11
但是,现在,我就是自己人啊
蔡登科(4040870) 20:10:24
我说的自己,就是指类的概念
张云开(117670538) 20:10:48
就是这个概念,在害死人,这就是这我想表达的。

蔡登科(4040870) 20:10:57
说说撒
你遇到什么实际问题
张云开(117670538) 20:11:25
因为我现在要访问共享内存,如果直接用那个变量来做,是非常方便的。

蔡登科(4040870) 20:11:43
哪个呀

张云开(117670538) 20:12:09
就是那个变量啊,我现在只能看着他,却不能访问他。AcctItemAccuMgr 里的 m_poAcctItem 变量。

蔡登科(4040870) 20:13:17
那你可以在base类里面增加方法

张云开(117670538) 20:13:20
我现在的感觉,跟linux的创始人在去年所谈到的C++心智包伏,太相似了。

蔡登科(4040870) 20:13:31
没有技术是十全十美的哈

张云开(117670538) 20:13:58
为什么我要添加方法呢,改一个单词,我就可以开工干别的活了。

张云开(117670538) 20:14:19
我觉得,我们被我们所接触的教材害得太深了。

金星(3937113) 20:14:21
。。。。。。。。。。。。。

张云开(117670538) 20:14:30
我真想打破这个封局。

金星(3937113) 20:14:36
。。。。。。。。。。。。

张云开(117670538) 20:14:53
金总,你啥意见呢

张云开(117670538) 20:15:19
因为mmdb下的库,就是给我提供公共数据的,
而不是给电信的人用的。
张云开(117670538) 20:16:04
所以,没有任何安全性问题,如果我要在基类增加方法,也可以写出垃圾的危险代码来。

张云开(117670538) 20:16:23
我们在为观念所累。。。

蔡登科(4040870) 20:16:54
那是因为是要你自己改自己用哈

所以你觉得麻烦
蔡登科(4040870) 20:17:07
比如说你改给我用

那么我可以获得你那个对象
我就可以为所欲为
张云开(117670538) 20:17:33
NO
,如果直接一个public,

任何人都解脱了。

金星(3937113) 20:17:48
开总,直接用c就可以了

张云开(117670538) 20:17:49
因为我们无法为未来设计好所有接口。
蔡登科(4040870) 20:17:54
除非你事先嘱咐我 palapalapala说一堆
金星(3937113) 20:17:54
只有
public
蔡登科
(4040870) 20:18:03
要不然我就可以为所欲为了

但是暴露接口就不一样了
张云开(117670538) 20:18:19
我觉得,现在就可以把那个private改为public
蔡登科
(4040870) 20:18:27
你可以做输入限制,你可以做异常控制

张云开(117670538) 20:18:50
暴露又怎么样呢?

蒋涛(158522428) 20:19:05
如果要价格修改内存 需要记录个日志,那就需要全部代码都检查在用变量之前加日志功能,如果有接口只要在接口函数上加就可以了

蔡登科(4040870) 20:19:20
是的

蔡登科(4040870) 20:19:26
暴露我可以帮你删除
金星(3937113) 20:19:39
还是安全性的问题啊
蔡登科(4040870) 20:19:51
帮你指向别的地方
张云开(117670538) 20:20:05
因为我们彼此不信任。。。这就是面向对象带给我们的

金星(3937113) 20:20:04
可以控制给你读还是给你写啊
蔡登科(4040870) 20:20:29
这和信任不信任无关
你没办法保证别人按照你的想法做事
张云开(117670538) 20:20:57
我为什么要这样做呢?

我们是在为同一个产品开发,我不是黑客呀,

我在用之前,定然会细细的品味,研究。
张云开(117670538) 20:21:22
公共的数据,就是为了方便别人使用的。
张云开(117670538) 20:21:29
那是表里导到内存的数据
蔡登科(4040870) 20:21:37
你说的没错,每个参与开发的人都这样做,那是可以的
你没办法保证每个人都这么做
但是项目大起来的时候
张云开(117670538) 20:22:26
这些是测试的时候,必然会没的。

蔡登科(4040870) 20:22:31
不是老师教一遍,人人都考100分的哈
张云开(117670538) 20:22:37
产品总要测试的。
那用C的人,怎么办?
张云开(117670538) 20:23:00
我觉得是观念的问题,你们的担心,都不是问题。
张云开(117670538) 20:23:14
如果别人用错你的东西,也不是你的责任。

张云开(117670538) 20:23:49
如果我把库里的所以基础库,都小小改一下,不也一样危险吗

金星(3937113) 20:24:19
应该是不给你改的,呵呵。我们代码没有层次结构

张云开(117670538) 20:24:54
我是在举例子,我觉得安全性根本不是问题。

不安全的人,用什么接口,也可以写出不安全的代码,这跟封装一点关系都没有。
张云开(117670538) 20:26:25
是我们的观念,我们对private的情有独钟,

因为对公共库,对于共享内存,本来就是多进程使用的。
张云开(117670538) 20:26:56
如果我们能改变观念,代码就能直接了当,高效而优雅。
蔡登科(4040870) 20:28:00
就这个问题来说吧,Protected修饰的,子类可以访问哈
张云开(117670538) 20:29:34
但现在,我自己新建了一个类,而mmdb/下作为公共库,

我定然要用它,目前我也不适合继承它(如果继承它,我就可以直接访问,那跟把那个private改为public又有什么区别呢?)
张云开(117670538) 20:30:28
"——
低效的抽象编程模型,可能在两年之后你会注意到有些抽象效果不怎么样,但是所有代码已经依赖于围绕它设计的漂亮对象模型了,如果不重写应用程序,就无法改正。

                                                  ---linus
蔡登科(4040870) 20:30:56
其实我们的底层库还是封装的比较好的哈

蔡登科(4040870) 20:31:02
lib liboci
张云开(117670538) 20:31:40
我不是批评我们的设计,我是在反省(包括我自己),在某些情况下,我们是不是可以放下,平时所受到的那些教育。

张云开(117670538) 20:32:58
这只是表达我个人的观点,

但由此次讨论看来,似乎支持我的,只是我一个人啊,唉
张云开(117670538) 20:34:09
登科,你说呢?

如果我继承它,我就可以修改它的数据,这跟把private改为public有什么区别呢?
蔡登科(4040870) 20:34:26
是的,你说的没错

张云开(117670538) 20:34:32
当然有区别,区别就是,后者只需要一秒钟。
蔡登科(4040870) 20:35:00
所以要求一开始写这个类的时候,在写下public private protected之前一定要考虑仔细哈

张云开(117670538) 20:35:56
问题是,连我自己都不愿意把一些共享内存的变量public化,因为我会浑身难受,你明白吗?

我是在批判我们的观念。。。
张云开(117670538) 20:36:56
因为当我们想到共享内存的时候,无疑,我们首先想到的,就是这些数据,肯定别人也可能用到,这样只要一份就够了。

蔡登科(4040870) 20:37:14
嗯,所以要封装设计好接口。。。

张云开(117670538) 20:37:42
我们已经为别人着想了,

所以,既然这些数据,就是大家都要用,就应该把这些指向共享内存的变量,变成public.
张云开
(117670538) 20:38:36
如果我们一起,把这块心病除掉,我立刻把那个基类的变量公开化

张云开(117670538) 20:39:12
登科,你支不支持呀,我是需要你们支持啊,哈哈

张云开(117670538) 20:40:21
那个公共变量,被私有化,我们可以认为这是不太合理的封闭,以此来安慰我们面向对象化的脆弱心灵。

蔡登科(4040870) 20:40:45
改天大家一起交流下哈

张云开(117670538) 20:41:39
嗯,早点啊,我太想解脱了。。。

张云开(117670538) 20:41:53
薛总不在啊,估计大家会比较关心他的看法。

 

发表于 @ 2009年02月24日 20:47:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:VIM7.2打开目录时的一个BUG | 新一篇:在fedora上安装万能五笔

  • 发表评论
  • 评论内容:
  •  
Copyright © chinainvent
Powered by CSDN Blog