posts - 9,  comments - 142,  trackbacks - 0
公告
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

留言簿(3)

随笔档案

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜

08-11-16

今天与人讨论, 看见如下构造:

Singleton* s = Singleton::getInstancePtr();

初看觉得很不对劲。 但哪不对劲呢?


我们慢慢学会了
把所有的data member的访问权限由public改为private
把所有的data member替换成一个 pimpl
对继承带有实现的类的态度由理所当然变为谨慎
由基于对象编程, 到基于接口编程
……

这一切都是为了不对客户暴露实现细节, 从而更容易改动实现细节。

甚至对函数命名, 也分外考究。
比如即使是采用了lazy evaluation,也要不采用:

string::calc_length

而是

string::get_length // 或者 string::length


嗯,getInstancePtr的问题就在这里, 它过于明显的暴露了实现细节。
客户将依赖函数返回指针的行为, 从而无法修改这一实现细节。

所以, 应该使用getInstance
在需要修改实现细节的时候, 就可以 ……
就可以 ……
大规模的替换客户端代码吧 囧……


嗯, 其实我想说的是, 虽然刚看到getInstancePtr的感觉是怪怪的。
但稍加分析后, 其实他挺好~~

这个函数的返回值本来就不可避免的暴露了实现。
引用or指针, 一旦决定就不能回头, 没有修改实现的机会。

getInstance 还需要查看文档,到底是返回引用还是指针。
getInstancePtr 就说的明明白白。
getInstanceRef 好像也不错 …… 不过没有getInstance简洁 ……

以后打算(如果还有机会自己做Singleton的话):
getInstancePtr 总返回指针、与引用区分开。
getInstanceRef 就可以简洁一点的命名为getInstance

这也比较符合另外两种语言的习惯 —— 毕竟这是个C++特有的问题。
其他两种语言中getInstance的语意就相当于C++中的getInstanceRef

posted on 2008-11-17 23:31 OwnWaterloo 阅读(2292) 评论(5)  编辑 收藏
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]