ヘッダファイルって捨てたもんじゃないよね

一応始めたばかりなので続けて書いてみる

現行のDiksamでは分割コンパイルも出来ないのですが、Cで書かれたネイティブ関数が(ひとつだけ)存在し、それを使うにはCのプロトタイプ宣言よろしく宣言しなければなりません。

int print(string str);

なんだ今時こんなCみたいな宣言、と言われそうですが、こういう書き方もまんざら捨てたもんじゃない気がする、というのが今回のお話。

ヘッダファイルの役割

以前こちらとかでも書きましたが、私はCのヘッダファイルは以下のふたつに分類できると思っています。

  • パブリックヘッダファイル
  • プライベートヘッダファイル

パブリックヘッダファイルは、他のモジュールに対してインタフェースを提供し、プライベートヘッダファイルはそのモジュール内で共有するデータ構造を表現します。
特に重要なのはパブリックヘッダファイルの方です。
手元のOOSC第2版日本語版には、

多くの場合、情報隠蔽を実施するために、カプセル化支援言語ではインタフェースと実装を2つの部分に分けてパッケージを宣言し、型宣言の詳細やルーチンの本体などの内密の要素は実装の部分に退避させることが勧められている。しかし、この方針のせいで特定のヘッダ宣言をコピーするという余分な作業を供給者モジュールを書く人に強いることになる。詳細は後の章に譲るが、情報隠蔽をもっとよく理解すれば、こうしたことは全く必要ない。(p.118)

と書かれています。
でも、ヘッダ宣言をコピーするなんてたいした手間ではないですし、同じことを複数の箇所に書くことは一般には悪いことですがコンパイラが整合性をチェックしてくれるのなら罪は相当軽くなると思います。

先に書きたいんだってば

そして、一般に、インタフェースは実装よりも先に書いて利用者に提供しなければならないものです。ヘッダファイルだけ提供すればひとまずコンパイルまでは通せますし。たとえひとりでプログラムを書いているときでも、あらかじめモジュールのインタフェースを決めるのは、設計の意味で重要だと思います。
どうもこのへんのことは、Javaとかではずいぶん軽んじられているように見えてしょうがない。

プライベートヘッダファイルもね

もうひとつの、プライベートヘッダファイルの方は、Cでこそ「データ構造を別ファイルで集中的に定義する」という意味で重要な意味を持ちますが、データと処理が一体化するオブジェクト指向の世界では「どれもヘッダファイル」とも言えるわけで、あまり意味はないのかもしれません。
でも、MVCとか見てると、なんだかんだ言って結局はModelは別のところに切り出されるんじゃないか、とも思えたりして。

ではDiksamではどうするか

さすがにCの#includeという機構は時代遅れかと思いますが、Diksamでは何らかの形で「ヘッダファイル」に近いものが出来るかもしれません。要はまだ考えてないってことですけど。