第三十一話 関数の分割
翌日。ついに最後の日となった。
俺は部室のドアを開ける。
すると中には、すでに皆が集まっていた。
「イツキくん、ご苦労ー」
先輩の声もする。
「あはは、とうとうここまで来たのねぇ」
岸井先輩も珍しく部室にいた。
「ユカも見たいんだって」
「後輩の奮闘を見過ごすわけにはいかないものねー」
「あんたは、単に面白そうだから、でしょー」
二人はさっそくやりあっている。いつもの事だ。
「イツキくん、今日も頑張りましょうね」
「お兄ちゃん、見ているから……」
西原さんとサヤちゃんとも挨拶する。
俺は自分のPCの前に座ると、ブートさせる。
そしてWindows画面が出たら、sampleフォルダへ移動して、kazuate.cを開いた。
「じゃ、これからどう改造していこう」
「もうほとんど作り終わったわね。それじゃ、今日は関数の分割について考えみようよ」
「関数の分割?」
「メイン関数に、いろいろ詰め込みすぎでしょ? こうなってくると、読みにくくなるじゃない。だから、なるべくサブの関数に分割して、メインは呼び出すだけにしておくのよ」
「うーむ。言われてみれば。じゃあ、ゲーム部分を、別の関数にしてみます」
俺はvoid game(void)という関数を作って(勿論、プロトタイプ宣言も忘れない)、while(1)の中のブロックをすべて移動させた。
「これで、いいのかな?」
「そんな訳ないでしょー。変数はどうするのよ? メイン変数のscoreとseikaiは、game関数では読み込めないわよ」
「あ、そうか」
甘かったな、こりゃ。
「な、なら、こうすれば……」
俺はgame関数の引数、戻り値を int game (int score, int seikai)と入れた。
そして、正解したif文のbreakの代わりに、return scoreと入れておく。
「これで、スコアとseikaiが中でもわかるし、正解した時にはscoreが呼び出したメイン関数にもわかります」
「うん。ま、これで問題ないけど、scoreはグローバル変数にするって方法もあるのよ」
「グローバル変数?」
「どこからでも参照できる変数のことよ。やり方は簡単。関数の外で変数を宣言するだけよ」
先輩は、コードを書き換えて、score変数を外に置いた。
int score = 10;
int main(void)
{
(略)
}
「これで、どこからでも読み込めるんですか?」
「そ。main関数からも、game関数からもね。だから、game関数は、void game(int seikai)だけで、いいわよ」
「こんな簡単な方法があるんだったら、すべてグローバル変数にすれば……」
「あまーい!」岸井先輩がツッコミを入れてくる。
「えっ!?」
「そうしたら、簡単にどこからでも値を変えられるでしょ。もしそれが間違っててバグだったらどうする? プログラムが大きくなれば、どこの関数がグローバル変数を変えたのか、すぐにわからなくなるじゃない。全部の関数を調べる羽目になるわ。でも変数のスコープが小さければ小さいほど、発見は簡単になるのよ」
「ユカの言うとおりね。グローバル変数はなるべく使わない。これは現代のプログラミングの常識よ。関数内のローカル変数をなるべく使うようにするわけ」
「そうなのか」
「ま、今回はグローバル変数を教えたかったから使うけど。あと、入力に使うbuf配列とkazu変数は、メインから削除してgame関数へ移行ね」
「あ、そうでした」
俺は変数を移動させる。
「これでもう完成、かな?」
「そうだねー。これ以上、弄くりようがなくなってきたから、これで完成でいいわ」
先輩のお墨付きが付いて、俺はガッツポーズを取る。
「よっしゃー!」
「ところで、変数にはローカルとグローバルの他に、もう一つ、ヒープってのもあるの。イツキくんにも、そろそろ教えるわ」
「ヒープ?」
「ふふふっ。またメモリーの話よ」
先輩は話を続けた。