锁定老帖子 主题:朴实的C++设计
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-18
最后修改:2010-08-18
不回答?好吧,你赢了。我猜可能是你的实现吧。
为什么?“拳拳到肉”啊。引用一个只实现了一个方法的类,就有那么多的辅助方法,买一送五还不止,虽然看得到摸不着,可这种所谓的object-oriented方法真正是“肉感十足”啊! |
|
返回顶楼 | |
发表时间:2010-08-18
jimmy_c 写道 内部类?那T1,T2,T3呢?还是等到C++支持partial class再谈内部类吧。
你没回答我的其他问题呀老大,对于一个外部引用者来说,究竟他是会选择你的实现,还是我的实现呢,你猜? AImpl 作为 A 的内部类有什么问题吗?T1, T2, T3 有什么关系?它们没有被暴露给客户,也不妨碍 AImpl 使用它们,不管 AImpl 是不是 A 的内部类。这跟 partial class 又有什么联系? pimpl 技法已经达到了从物理上隐藏实现的目的,而且 A 可以作为(值)对象出现,对象的生命期也容易控制(不需要显式释放)。比起透过指针或者引用来调用虚函数,我觉得值对象更容易使用些。 |
|
返回顶楼 | |
发表时间:2010-08-18
Solstice 写道 AImpl 作为 A 的内部类有什么问题吗?T1, T2, T3 有什么关系?它们没有被暴露给客户,也不妨碍 AImpl 使用它们,不管 AImpl 是不是 A 的内部类。这跟 partial class 又有什么联系?
难道内部类的实现代码不应该是这样么? class A { private: class AImpl { private: T1 myFunc(T2); private: T3 _myVariable; }; }; 原来这样T1, T2, T3不叫暴露给客户啊。 关于partial class,我的意思是,如果C++支持把A的这一部分代码放入.cpp中,那么你的说法是可行的,从理论上来说没有任何问题,只可惜C++语法不支持: partial class A { private: class AImpl { private: T1 myFunc(T2); private: T3 _myVariable; }; }; |
|
返回顶楼 | |
发表时间:2010-08-18
jimmy_c 写道 Solstice 写道 AImpl 作为 A 的内部类有什么问题吗?T1, T2, T3 有什么关系?它们没有被暴露给客户,也不妨碍 AImpl 使用它们,不管 AImpl 是不是 A 的内部类。这跟 partial class 又有什么联系?
难道内部类的实现代码不应该是这样么? class A { private: class AImpl { private: T1 myFunc(T2); private: T3 _myVariable; }; }; 原来这样T1, T2, T3不叫暴露给客户啊。 关于partial class,我的意思是,如果C++支持把A的这一部分代码放入.cpp中,那么你的说法是可行的,从理论上来说没有任何问题,只可惜C++语法不支持: partial class A { private: class AImpl { private: T1 myFunc(T2); private: T3 _myVariable; }; }; AImpl 作为 A 的内部类的正确做法是: // A.h class A { public: A(); ~A(); void func(); private: A(const A&); void operator=(const A&); class AImpl; // 声明,不是定义 AImpl* impl_; }; // A.cc // 在这里定义,完全不暴露 class A::AImpl { public: void func(); private: T1 myFunc(T2 myParam); private: T3 _myVariable; }; A::A() : impl_(new AImpl) { } A::~A() { delete impl_; } void A::func() { impl_->func(); } |
|
返回顶楼 | |
发表时间:2010-08-18
Solstice 写道 pimpl 技法已经达到了从物理上隐藏实现的目的,而且 A 可以作为(值)对象出现,对象的生命期也容易控制(不需要显式释放)。比起透过指针或者引用来调用虚函数,我觉得值对象更容易使用些。
这个东东在设计模式里被称作delegate(也不是C#的delegate)。 很欣慰,至少你的观点和你引用的帖子不一样,设计模式也用的。 “对象的生命期容易控制”的观点我不同意,这取决于你的implement类的复杂程度。如果delegate仅仅用于替代复杂的基类/子类构造关系,这种模式我是赞同的;但在这个我举的例子里,虚基类显然不适用,所以它不可能更简单。另外如果delegate对象如果包含一些复杂的从属,引用之类的东西,那它的生命周期很容易变得复杂。这显然是比虚基类更容易误用的地方。 我发的帖子一直都在说明,我关注的是类A本身的简化,值对象比指针或者引用调用虚函数容易使用?何从谈起?性能上不会更快,代码上不会更短,概念上,一个是基本的继承关系,一个是delegate模式,哪个更简单,不用讨论了吧? |
|
返回顶楼 | |
发表时间:2010-08-18
最后修改:2010-08-18
Solstice 写道 AImpl 作为 A 的内部类的正确做法是: 唉,和你之前的写法有什么区别么?二进制代码只是差个名字而已,设计也未见简单。又铺了一层被子。 看,囬字还可以这样写! |
|
返回顶楼 | |
发表时间:2010-08-18
好了。这个例子的讨论到此为止。
还是那个“不装蛋原则”。C++的模板技术,从实践上来说还是很失败的。推出十几年,除了STL和经常用于补裤裆的boost,未见什么GP技术设计的经典之作。我想在这方面想继续尝试的新朋友们可以止步了。至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧! |
|
返回顶楼 | |
发表时间:2010-08-18
jimmy_c 写道 好了。这个例子的讨论到此为止。
还是那个“不装蛋原则”。C++的模板技术,从实践上来说还是很失败的。推出十几年,除了STL和经常用于补裤裆的boost,未见什么GP技术设计的经典之作。我想在这方面想继续尝试的新朋友们可以止步了。至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧! 不要为了辩论而辩论。 人家不是在批判OO,也不是你猜测的因为template模式导致的对OO全盘推翻,没有人说设计模式没用,PImpl也不是你想的那样。 不实际思考,不去尝试弄懂别人在说什么。这样辨下去有什么意义? |
|
返回顶楼 | |
发表时间:2010-08-18
最后修改:2010-08-18
hyf 写道 jimmy_c 写道 好了。这个例子的讨论到此为止。
还是那个“不装蛋原则”。C++的模板技术,从实践上来说还是很失败的。推出十几年,除了STL和经常用于补裤裆的boost,未见什么GP技术设计的经典之作。我想在这方面想继续尝试的新朋友们可以止步了。至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧! 不要为了辩论而辩论。 人家不是在批判OO,也不是你猜测的因为template模式导致的对OO全盘推翻,没有人说设计模式没用,PImpl也不是你想的那样。 不实际思考,不去尝试弄懂别人在说什么。这样辨下去有什么意义? OK。这位爱思考的大哥,不知道你有没有读过我批评的这篇楼主推崇的博文: http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 有没有看到前面有人说过OO的技术只是在面试的时候有点用的话?"现在 mem_fn, reference_wrapper, function 和 bind 都被直接放到了 std 里面,C++编程的风格可以发生根本变化了"这句话是楼主说的吗?我所说的“至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧!”的话说的是楼主吗?你实际思考了?你弄懂我在说什么了? 这篇博文里有没有说设计模式没有用的话,读完再说。pImpl是怎样?不是怎样?它和delegate模式的区别,你倒给我说说? |
|
返回顶楼 | |
发表时间:2010-08-18
jimmy_c 写道 hyf 写道 jimmy_c 写道 好了。这个例子的讨论到此为止。
还是那个“不装蛋原则”。C++的模板技术,从实践上来说还是很失败的。推出十几年,除了STL和经常用于补裤裆的boost,未见什么GP技术设计的经典之作。我想在这方面想继续尝试的新朋友们可以止步了。至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧! 不要为了辩论而辩论。 人家不是在批判OO,也不是你猜测的因为template模式导致的对OO全盘推翻,没有人说设计模式没用,PImpl也不是你想的那样。 不实际思考,不去尝试弄懂别人在说什么。这样辨下去有什么意义? OK。这位爱思考的大哥,不知道你有没有读过我批评的这篇楼主推崇的博文: http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 有没有看到前面有人说过OO的技术只是在面试的时候有点用的话?"现在 mem_fn, reference_wrapper, function 和 bind 都被直接放到了 std 里面,C++编程的风格可以发生根本变化了"这句话是楼主说的吗?我所说的“至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧!”的话说的是楼主吗?你实际思考了?你弄懂我在说什么了? 这篇博文里有没有说设计模式没有用的话,读完再说。pImpl是怎样?不是怎样?它和delegate模式的区别,你倒给我说说? 惭愧,其实我真没完全看明白你说的东西。你的发言发散性强,不容易抓住论点论据,所以只是对几段看得懂的话发表意见。 我猜你针对的是Solstice的这段话: “在《设计模式》这本书提到了23个模式,我认为iterator有用(或许再加个State),其他都在摆谱,拉虚架子,没啥用。或许它们解决了面向对象中的常见问题,不过要是我的程序里连面向对象(指继承和多态)都不用,那似乎也不用叨扰面向对象设计模式了。” 他都说了不用面向对象,那么在他的系统里面向对象模式没有用也是很自然的啊。那是他经过实践提出的一种设计方法,你要反驳也不能空吆喝。 PImpl是专用于隐藏实现细节的惯用法,和delegate模式理念并不相等。不过即使就是一样的,你想说什么? |
|
返回顶楼 | |