ToDo:
http://d.hatena.ne.jp/lyrical_logical/20100819/1282232382
そういう話なんかなコレ。 pimpl 死ね死ね派として。
元の話は
// header class C { public: C(); void f(); private: class CImpl; CImpl* pimpl_; }; // source class C::CImpl { public: CImpl() {} void f() { // ... } }; C::C() {} void C::f() { pimpl_->f(); }
と
// header class C { public: C(); virtual void f(); static C* create(); }; // source class CImpl : public C { public: CImpl() { } virtual void f() { // ... } }; C* C::create() { return new CImpl(); }
の比較ってことなんじゃないのかな知らんけど。 pimpl とファクトリの比較って言ってるから pimpl とファクトリは組み合わせれるとかじゃなくて、 pimpl 的なことをファクトリでやる、っていう話かと想像した。 まぁいずれにせよ元の話が違っても 僕は後者の方が好きだという主張したいという話をしたい。
pimpl って何がダメってめんどくさすぎることで、 ただでさえヘッダのせいで二カ所に関数名書かにゃならんので DRY から遠ざかってるのに、 pimpl とかしたらに三カ所なってありえんというだけ。 まぁそれだけなんだけど、しかし三カ所に書くってホントありえんと思うんですよ。 単に引数一個増やすだけであちこち書き直していくとか完全におかしい。
たぶん後者の話の弱点は仮想関数呼び出しとか ヒープアロケーションのオーバヘッドくらいなわけだけど、 たぶん pimpl 使いたいと思うようなクラスを思い出してみると、 たぶんたいした個数作らないオブジェクトがほとんどなんじゃないかなぁと思う。 NantokaMgr とか NantokaController とか名前つけたくなるクラスが多いんじゃないかと。
(02:16)
前 | 2010年 8月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。