分割コンパイルの分割単位

yuki
記事: 5
登録日時: 14年前

分割コンパイルの分割単位

投稿記事 by yuki » 14年前

ポインタ・構造体の壁(?)を乗り越えて、ようやくC言語初級者から中級者になった人が次にぶち当たる壁は、
この分割コンパイルだと思います。
一緒に使う機能をまとめるって言われてもよくわからんし、
どれくらいの規模になったら分割すべきかとか、
そもそも分割する意味もわからないなんて人も居るかもしれません。

私の個人的な分割単位は、C言語の場合でいうと一つの構造体の宣言とその構造体を操作する関数を一まとめにします。
C言語の場合は、と書きましたが、この分割単位はJavaのクラスと同じです。
ある人は1ファイルには1つの関数(とそれに関する宣言や定数)のみという人も居ますし、
またある人はよく使う組み合わせの関数で分けるとか。
また、見通しが良くなるように、短めにファイルを分割するというのもありだと思います。
これは臨機応変に変えるべきです。

色々な分け方がありますが、全ての基本はファイル間の依存をなくすことが重要です。
大分前のエントリーでも書きましたが、とことんファイルの依存をなくすこと。
グローバル変数が害悪というのはバグが入りやすいことはもちろんですが、
別のファイルに依存してしまうことも問題です。
依存はincludeだけが全てではなく、別のファイルの定義を利用した時点でそれは依存していることになります。
どういうことかというと、a.cでグローバル変数int GLOBAL_INT;を宣言し、それをb.cで使ってしまえば、b.cはa.c無しでは利用できなくなります。
逆に言えば、a.cもb.cも同一ファイルであることと変わりがありません。
そういう観点で見れば、グローバルな関数の場合も別のファイルの関数を使えばそれは依存していることになります。

もちろん依存しないとライブラリなんかは使えないわけで、依存が悪いといっているわけではありません。
ただ、する必要の無い無駄な依存は避けたほうが、精神衛生上にもコード衛生上にも良いかと思います。
(コンパイル時の再コンパイルをなるべく防ぐことで、コンパイル時間を短縮できます)



だらだら書きましたが、要点はいくつか。
・分割の基準は、依存の高いものをまとめる
・見通しの良いプログラムは適切に分割されている(それぞれが大体1つのファイルで簡潔している{1つのファイルに全て書くという意味ではなく、切り離せない単位で分割されているということ})
・依存することが悪いのでなく、無駄に依存させている設計が悪い

以上、私の個人的なファイル分割規約でした。
参考に出来る部分だけ参考にしてください。
もっと良い方法あるよという方は教えてください(^^;

コメントはまだありません。