论坛首页 编程语言技术论坛

朴实的C++设计

浏览 54678 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-08-18   最后修改:2010-08-18
不回答?好吧,你赢了。我猜可能是你的实现吧。
为什么?“拳拳到肉”啊。引用一个只实现了一个方法的类,就有那么多的辅助方法,买一送五还不止,虽然看得到摸不着,可这种所谓的object-oriented方法真正是“肉感十足”啊!
0 请登录后投票
   发表时间:2010-08-18  
jimmy_c 写道
内部类?那T1,T2,T3呢?还是等到C++支持partial class再谈内部类吧。

你没回答我的其他问题呀老大,对于一个外部引用者来说,究竟他是会选择你的实现,还是我的实现呢,你猜?


AImpl 作为 A 的内部类有什么问题吗?T1, T2, T3 有什么关系?它们没有被暴露给客户,也不妨碍 AImpl 使用它们,不管 AImpl 是不是 A 的内部类。这跟 partial class 又有什么联系?

pimpl 技法已经达到了从物理上隐藏实现的目的,而且 A 可以作为(值)对象出现,对象的生命期也容易控制(不需要显式释放)。比起透过指针或者引用来调用虚函数,我觉得值对象更容易使用些。
0 请登录后投票
   发表时间: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;
    };
};
0 请登录后投票
   发表时间: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();
}

0 请登录后投票
   发表时间:2010-08-18  
Solstice 写道
pimpl 技法已经达到了从物理上隐藏实现的目的,而且 A 可以作为(值)对象出现,对象的生命期也容易控制(不需要显式释放)。比起透过指针或者引用来调用虚函数,我觉得值对象更容易使用些。

这个东东在设计模式里被称作delegate(也不是C#的delegate)。
很欣慰,至少你的观点和你引用的帖子不一样,设计模式也用的。
“对象的生命期容易控制”的观点我不同意,这取决于你的implement类的复杂程度。如果delegate仅仅用于替代复杂的基类/子类构造关系,这种模式我是赞同的;但在这个我举的例子里,虚基类显然不适用,所以它不可能更简单。另外如果delegate对象如果包含一些复杂的从属,引用之类的东西,那它的生命周期很容易变得复杂。这显然是比虚基类更容易误用的地方。
我发的帖子一直都在说明,我关注的是类A本身的简化,值对象比指针或者引用调用虚函数容易使用?何从谈起?性能上不会更快,代码上不会更短,概念上,一个是基本的继承关系,一个是delegate模式,哪个更简单,不用讨论了吧?
0 请登录后投票
   发表时间:2010-08-18   最后修改:2010-08-18
Solstice 写道

AImpl 作为 A 的内部类的正确做法是:

唉,和你之前的写法有什么区别么?二进制代码只是差个名字而已,设计也未见简单。又铺了一层被子。
看,囬字还可以这样写!
0 请登录后投票
   发表时间:2010-08-18  
好了。这个例子的讨论到此为止。

还是那个“不装蛋原则”。C++的模板技术,从实践上来说还是很失败的。推出十几年,除了STL和经常用于补裤裆的boost,未见什么GP技术设计的经典之作。我想在这方面想继续尝试的新朋友们可以止步了。至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧!
0 请登录后投票
   发表时间:2010-08-18  
jimmy_c 写道
好了。这个例子的讨论到此为止。

还是那个“不装蛋原则”。C++的模板技术,从实践上来说还是很失败的。推出十几年,除了STL和经常用于补裤裆的boost,未见什么GP技术设计的经典之作。我想在这方面想继续尝试的新朋友们可以止步了。至于什么“改变C++设计风格”的炎炎之言,还是少说为好吧!

不要为了辩论而辩论。

人家不是在批判OO,也不是你猜测的因为template模式导致的对OO全盘推翻,没有人说设计模式没用,PImpl也不是你想的那样。

不实际思考,不去尝试弄懂别人在说什么。这样辨下去有什么意义?

0 请登录后投票
   发表时间: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模式的区别,你倒给我说说?
0 请登录后投票
   发表时间: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模式理念并不相等。不过即使就是一样的,你想说什么?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics