漢の言語

C++ の何が難しいって、無限ハードル走というか、一つ「難しい」を乗り越えても直ぐ目の前に次の「難しい」があって、それがどこまでもどこまでも続いているところかな? また、正直(他の言語なら)しなくても良い苦労を強いられている実感もあります。でもそこが、好き。(←何かに洗脳されてきた)

今、私が差し掛かっている「難しい」は、実装デザイン(フォルダ分けとかファイル分けとか #include とか)の依存性を如何に減らすかと言うところ。ちょうど良い本(大規模C++ソフトウェアデザイン) を捕まえられたので、今はそこら辺をお勉強中。というのも、C++の場合、論理的なカプセル化関係なく実装デザインでも依存関係を生じます。そして 実装デザインの依存はビルド時間に影響し、開発効率に大きな影を落とすので放置できません。(ウチのプロジェクトのリビルド時間は現在 90分くらい T△T)


「大規模C++ソフトウェアデザイン」では、実装デザインの依存性(コンパイル時依存性)の回避を 絶縁(insulation) と呼んでます。しかしこの絶縁のテクニックが凄いのです。

たとえば「HasA (ある型のメンバ変数を持つ)だと、持ってる先の型のヘッダファイルを 自身にヘッダにインクルードしなくてはいけない。それだと先の型が変更されると連鎖リビルドになってしまうから、HoldsA (要はポインタで持つ)して、.c ファイルにだけインクルードするテクニック」とか、「プライベートな関数でも変更や追加で #include 先がリビルドしちゃうから、クラス内プライベートな関数は .cファイルの static グローバルな関数(ファイルスコープ関数) にするのも有り」とか。

C++慣れしてくると、どうと言うことも無い気がしてきますが、冷静に考えれば驚愕です。だって今起こったことをありのままに言うと、「コンパイル時依存を切り離したらプライベートメンバ関数が無くなってた」ということだもの。「どのファイルにクラスを置くかを考える」とか「ファイルやディレクトリを論理デザインに投影して上手く使う」だとかそんなちゃちなもんでは断じてありません。C++ では もっと恐ろしいモノの片鱗を味わえます。(以上、絶縁の話はおわり)


C++ の難しいは「とりあえず(よく解らないけど)こうしておけ!」・・対処不能なところが肝で、「よく解らない」を残しちゃいけない。よく解って、解った上で考えて決断を下すことを要求する、なんだかそんな感じです。まぁ、それは本当はどんな言語だって当たり前の話なのですが、C++ の場合はそれをしないときのしっぺ返しがすさまじいというか(^^;

たとえば上記の絶縁のテクニックもデメリットが小さくないわけで、コーディング規約で「プライベート関数は使わない」とか決めてしまえば状況はかえって悪化するだけ(おそろしい・・・)。でも、野放しでもうまく行かないのは同じ事で、だから我々には C++ を使いこなすしか、デスマーチかしか選択肢はないです。くぅう、 漢の言語 だねぇ。

しかもこの手のモノって、他の言語では大して考えなくても上手く行くことだったり。 うっ、こんなことまで悩ませるのか とうっとりです。(漢じゃなくって M だったかw)

蛇足

という駄文をコンパイルビルド待ち時間に書いてみた(w

make と リンク時間が長すぎます(追記:今計ったらこれだけで 約10分)。C++実装依存切り離しに失敗した好例...orz