C++ template地獄
私は、大晦日からお正月の4日間、まるごと使ってC++のtemplateを駆使して書かれたプログラムをいじり倒していただけという、とんでもないお正月だった。気がついたら4日が過ぎていた。
そのソースを書いたのは東大の人で、凄く洗練された素晴らしいプログラムではあるのだけど、困ったことにモジュール性が恐ろしく低い。
Visual C++はtemplateに関してはinclusion-modelを採用している。実体化したいtemplateの実装はheaderに書かなければならない。
headerは、その実装のために必要なheaderをincludeする。そのincludeされたheaderもまたtemplateで書かれているので芋づる式に他のファイルを読み込んでいく。
私はそのプログラムのごく一部のclassを流用したかっただけなのだけど、芋づるがひどすぎて切り離せない。
さらに悪いことに、オブジェクト指向プログラムにおいては、ひとつのclassにそのclassに関する操作をすべて詰め込んでしまおうとする傾向がある。そのプログラムもご多分に漏れずそうなっていて、ひとつのclassが凄い数のmethodを持っている。そのmethodがまたtemplateなもんだから、その実装がheaderに書いてあってと…気が遠くなるようなソースだった。
C#ではpartial classがあるので、このようなことにはならないが、C++で、AOPが出来ない場合、templateをここまで多用するなら、classにはmethodをあまり持たせるべきではないと思う。つまり、Cで擬似的にOOPしようとしていたあのころのように、
hoge.HogeClassMethod();
ではなく、
namespace Hoge { void HogeClassMethod (const HogeClass& hoge); }
みたいな形でHogeClassのmethodを用意して
Hoge::HogeClassMethod(hoge);
のように呼び出して使ったほうがいいような気はする。(わかんないけど)
もはや全然オブジェクト指向っぽくないけど、行き過ぎると原点回帰するっていうのはなんだか面白い。