Prompt
ソースコードに関数を書く順番って、見たことのない関数が現れないように”呼び出される”関数を先に記述し、“呼び出す”関数を後に記述することも多いけど、
しかし結局呼び出される末端の関数が一番上なのか?
そしてmain関数が一番下?
しかし、それは本当に読みやすいのか?
さすが情報工学徒!めちゃくちゃ鋭いところに気づいたね。それはプログラミングの歴史と「人間の認知のしやすさ」が衝突している、非常に哲学的なテーマなんだ。
結論から言うと、「コンパイラの都合」 と 「人間の読みやすさ」 のどちらを優先するかで、現代では答えが変わってきているよ!
1. なぜ「呼び出される方が上」という風習があるのか?
これは主に、君も触れている ** c や cpp の古い制約** から来ているんだ(いわゆる Single Pass Compilation)。
-
コンパイラの制約: 昔のコンパイラは、ソースコードを上から下へ一度だけなぞって機械語に変換していた。だから、関数を使うときに「その関数が何者か(引数の数や型)」を先に知っていないと、エラー(未定義の参照)を出してしまったんだ。
-
構造: その結果、末端の「小さな部品(関数)」を上に、それらを組み合わせる「大きなロジック(main)」を下にする、という積み上げ式の書き方が定着したんだ。
2. 「それは本当に読みやすいのか?」という疑問
君の直感通り、ぶっちゃけ読みづらいよ!
多くのプログラマにとって、プログラムを読むときは「このソフトは何をするのか?」という全体像(抽象的な部分)から入り、必要に応じて「どうやって実現しているのか?」という詳細(具体的な部分)へ潜っていきたいはずなんだ。
-
ボトムアップ(呼び出される方が上): 「ネジ」の説明を延々と読まされた後に、最後に「これは飛行機の話でした」と言われる感じ。
-
トップダウン(呼び出す方が上): 「これは飛行機です。羽はこうなっていて、そのネジはこれです」という、新聞記事のような構成。
3. 現代の解決策:プログラミング言語ごとの対応
現代の多くの言語では、コンパイラが賢くなって「2パス(複数回なぞる)」を行うようになったから、記述順序は自由になっているよ!
JavaやC#、JavaScriptの場合
これらは関数の定義順を気にしない。だから、「重要なもの(mainや公開メソッド)を上、細かい実装は下」 に書くのが一般的(クリーンコードの推奨)だよ。
C / C++ の場合:プロトタイプ宣言
「上から順」の制約を守りつつ、読みやすさを確保するために**「プロトタイプ宣言」**という技を使うんだ。
void move_arm(); // 宣言だけ先に「上」でする
int main() {
move_arm(); // 安心して呼び出せる!
return 0;
}
void move_arm() {
// 具体的な中身は「下」に書く
}4. 読みやすさの黄金律「ステップダウン規則」
有名な著書『Clean Code』では、「ステップダウン規則」 が推奨されているよ。
-
最上部に高レベルな戦略(何をしたいか)を書く。
-
そのすぐ下で、その中で呼んでいる関数を定義する。
-
さらにその下で、その詳細を定義する。
まるで新聞を読み進めるように、下に行くほど話がマニアック(低レイヤー)になっていく構成だね。これなら、詳細を知る必要がない人は上の数行を読むだけで内容を理解できる。
💡 豆知識:ヘッダファイルの役割
C++などで「定義は.cpp、宣言は.h」と分けるのも、この「インターフェース(何ができるか)」と「実装(どうやるか)」を分離するための一つの知恵なんだよね。
哲学的な視点から
INFPの君なら、コードを「物語」として捉えてみると面白いかも。物語の結末(結果)を先に示す倒叙ミステリーのような書き方(トップダウン)が、プログラムを読む「人間」にとっては心地よい……。
一方で、物理的な「組み立て」を重視するなら「足元から作る(ボトムアップ)」のが自然。
「機械のためのコード」から「人間のためのコード」へ、プログラミングの歴史は変化してきたんだね。
君がJavaやC#で課題を書くときは、「一番大事な関数を一番上に持ってくる」 というのを意識してみるだけで、先生や友達からの「読みやすさ評価」が爆上がりするはずだよ!