最近Rubyでコードを書くとき、クラス構造と似たディレクトリ構成にして、そこにソースファイルを置くようにしている。例えばText::Hatenaならtext/hatena.rbになる。これをCやC++でも行おうとして悩んでいることについて、現在までの考えなどをメモする。
最近ふとやってしまいがちなのが、ディレクトリを細かく作り、単純なソースファイル名を付けてしまうこと。いい加減な例だが、音を鳴らすクラス Audio があり、その音をWindowsで鳴らす為の実装クラス Audio::Windows を用意しようとして、ついaudio/windows.cppというファイルを作ってしまう。ソースファイルとオブジェクトファイルを同じ場所へ置くのであれば問題無いが、Visual StudioやAutomakeなどを使う場合オブジェクトファイルの置き場所が一つにまとめられる為、このaudio/windows.cppから作られるwindows.o(windows.obj)と、他の場所にあるvideo/windows.cppから作られるwindows.o(windows.obj)とでファイル名が衝突してしまう恐れがある、ということに最近気付いた。
bin_PROGRAMS = foo foo_SOURCES = a/foo.c b/foo.c
実際、上記のようなMakefile.amを書き、automakeコマンドを実行すると、以下のようなメッセージが出力される。
Makefile.am: object `foo.$(OBJEXT)' created by `b/foo.c' and `a/foo.c'
この場合はどちらかのfoo.cをリネームすることで解決する話だが、今後別々のディレクトリにある同じファイル名の存在を気にしていく必要があると考えると頭を抱えてしまった。さらに、リネーム以前にディレクトリを分けていく意味自体が無いのではないだろうか。
そもそもディレクトリを細かく作ることになったのは、クラスを入れ子にするようになってからだ。あまり長い名前をつけたくなくて、Audioクラスの実装はAudioImplクラスじゃなくてAudio::Implクラスにしたかったり、とか。すると自然とaudio/impl.cppを作りたくなるじゃないか。
仮に、ディレクトリを作らずにファイル名を作ろうとするとどうなるのだろう。命名方法を機械的に行いたいんだけど、基準をなかなか決められない。大文字小文字、クラス名の区切り、など考えることはたくさんある。
ということで、現在も絶賛悩み中なのでオチは無い。今のところソースファイルについてはディレクトリを深く掘らない方向で行こうと思うけど、上記のように命名方法がまだ決まっていない。しばらく試行錯誤していこう。


コメント
コメントを書く