免费注册 查看新帖 |

Chinaunix

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

因为没有用Singleton模式,被人批不懂OOP! [复制链接]

论坛徽章:
0
51 [报告]
发表于 2009-01-12 06:23 |只看该作者
原帖由 真菜 于 2009-1-11 03:16 发表

就事论事吧,我咋了?


本来懒得拍的,呵呵。
就事论事:
1)全局变量含有自定义类型的对象是大忌
2)全局变量的定义有依赖关系,更坏的是不同编译单元之间全局变量的依赖关系,一般来说应绝对避免。解决办法也是有的,比如通过函数调用来返回静态变量的引用等。
3)singlton模式能保证编译器就杜绝这个类被多次实例化,而不是运行期
4)你说singleton不能直接在多线程使用,那你的代码(static int count)能在多线程直接用?
5)顺便拍一下楼主所谓的解决方式中的C++问题:
[quote[
class A {
    A() {
       static int count;
       assert(count++ == 0);
    }
}
[/quote]
楼主莫非不知道assert中的表达式不能有side effect?

还有,不要轻易说别人写的都是TOY CODE,只有你的很牛B。呵呵。

论坛徽章:
0
52 [报告]
发表于 2009-01-12 09:19 |只看该作者
LZ,我看了这么多本来也不想说的,可是我实在是看不下去了,因为你说的话太无知,你自以为自己很聪明,很牛比,事实上你不过是井底的那只蛤蟆而已
或许你永远也不会明白什么是OO,至少你现在还不明白,这就是你跟那个工程师的区别(所以人家管你,拿的工资比你多)

PS:多线程中单例类的解决方案有很多种,你无知就不要在这里乱吼,冲你的态度也懒的跟说

论坛徽章:
0
53 [报告]
发表于 2009-01-12 09:44 |只看该作者
原帖由 emacsnw 于 2009-1-12 06:23 发表
返回静态变量的引用等

原帖由 alexhappy 于 2009-1-12 09:19 发表
多线程中单例类的解决方案


这个想征求下大家的看法
比如下面的代码,语义上讲,编译器有理由保证t不会被多次初始化。
然而,多线程环境中,这里我们并不太相信编译器的能力。
这个问题好像解决的不爽哎


  1. template <class T>
  2. inline T &GetInstance( )
  3. {
  4.     static T t;
  5.     return t;
  6. }
复制代码

论坛徽章:
0
54 [报告]
发表于 2009-01-12 09:59 |只看该作者
支持lz的意见。
设计模式本身没有错,错的是总是有人试图用设计模式来套用所有的纷繁芜杂的情形。

论坛徽章:
0
55 [报告]
发表于 2009-01-12 10:10 |只看该作者
楼主真的很菜
还要 参考 书上的 代码 来 修改这个东西, 还敢说自己 懂?

论坛徽章:
0
56 [报告]
发表于 2009-01-12 10:28 |只看该作者
原帖由 真菜 于 2009-1-11 14:08 发表

Singleton确实解决了保证只有一个实例的问题,但是它解决的只是一个很容易克服的问题,却引来了很多复杂的问题。
第一:原先的调用是"remoteServer->LoadInfo()",现在却要改为"RemoteServer * instance = R ...


不一定2句吧,硬要凑成一句也可以:
RemoteServer.GetInstance()->LoadInfo()。
没达到无招胜有招的境界,先把招数都背下来还是有必要的。

论坛徽章:
0
57 [报告]
发表于 2009-01-12 10:35 |只看该作者
在c++中Singleton主要是为了存储全局配置信息。以便于不同模块存取。
不知你这个server是否具有这样的属性。

你定义一个全局变量也可以,但非常麻烦。对于每个用到此变量的模块都要声明。

论坛徽章:
0
58 [报告]
发表于 2009-01-12 11:01 |只看该作者
话说singleton模式是为了禁止程序员在系统中随意定义同类变量。
因此singleton模式的类,应该没有公开的构造函数。
而没有公开的构造函数需要一个有元函数,或者一个类成员函数来访问该类的构造函数。
按着OO的思维,首选当然是类成员函数,但是普通的类成员函数显然不行,因为它们需要先有变量,所以类成员函数只能是静态成员函数。
最后singleton模式就成你看到的样子了。

论坛徽章:
0
59 [报告]
发表于 2009-01-12 11:12 |只看该作者
singleton有很多的好处   人家给你一个建议  其实是很好的。
随便举个例子吧:
假设你要对这个全局变量的每次使用都上锁或者加log,或者设置断点来调试
那么,如果是singleton的话,就很容易,如果是全局变量,到处都是的话,就会很麻烦

论坛徽章:
0
60 [报告]
发表于 2009-01-12 11:30 |只看该作者

singlton模式等价于楼主的C设计方法,反之亦然!

singlton模式等价于楼主的C设计方法,反之亦然!
首先,对于多个singlton对象初始化,为了保证初始化顺序,你可以做一个singlton对象,该对象什么也不做就是按顺序初始化多个singlton对象。
其次,楼主一直纠缠什么singlton会带来什么多线程初始化问题,这个问题如果singlton需要用锁,那么C也必然要锁,这是与任何方法论无关的,C的代码可以不用锁,那么singlton也可以不用锁,如果必须用锁,那么C的实现也必须用锁,这是毫无疑问的。有问题的决定与工具方法无关。楼主的代码中有些代码好像没有用锁但是看上去还正确,但实际是错误的。比如全局变量的++操作,会有几条汇编指令(加1和返回原来的值),这个操作在多线程情况下就是必须用保护机制的。windows下有这个API的,忘了,自己去查。所以他的那些代码在多线程下其实都是错误的,根本不能说明他的代码相对singlton有什么优势。
其次,singlton和用全局变量没有本质区别,只是代码质量会好点,MFC,QT不用singlton,那是他们的事情,不代表singlton不好,也许出于效率考虑,自从学了symbian后认为MFC不是很好,如果有时间看看Symbian的源代码看看人家的类库是什么样子的,你也会发现OO原来是这么用的,感觉MFC就是一群C程序员写的;我只学了QT1个小时,并5天写了个经典打砖块的游戏Demo,不深入,但是很容易上手,我这种弱智的人学1个小时就能写游戏你说容易不?
再次,对楼主的一点忠告,设计模式是一个很好的东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP