関数の分割と呼び出しのための考え方


はじめに

C言語のソースコードにおける関数の呼び出し関係に注目して、読みやすいコードにするために気を付けるべきだと思うことをお話しします。

やりかた

1.やりたい処理をフローチャートにする

今回は「あらかじめ与えられた2つのint型変数の相加平均を計算して表示する」という処理を例として考えていきます。
この処理をフローチャートにすると以下のような書き方が考えられます。

もしくは下のようにさらに細かくする方法も考えられます。

しかし、ここまでに登場した処理をもとの処理をどれだけ分割したものかという点で見れば、以下のように3段階に分類できることは同意いただけるかと思います。

2.フローチャートに従ってコードを書く

まずはなにも考えずに全てMainの中で書くことにしてみましょう。

全部乗せ
#include <stdio.h>

num1 = 1;
num2 = 2;

int main(void){
    //合計値を求める処理
    double sum = num1 + num2;
    //合計値を除算する処理
    double ave = sum / 2;
    //数値を表示する処理
    printf("%f\n",ave);
    return 0;
}

これでもわかるような気はしますが今回は関数の分割をテーマにしたいので、1.の図で示した処理の階層を使って分割をしてみたいと思います。
少し行が空いたので図を再掲します。

ここで考えることは単純な2点のみです。

  • 上の図において同じ階層にある処理をコード中でも同じ階層に記述する
  • 処理を呼び出すときには、必ず1つ上の階層の処理中で呼び出す

この2点を守ってコードを記述すると以下のようになります。

分割バージョン
#include <stdio.h>

num1 = 1;
num2 = 2;

double Average(int num1,int num2);

int main(void){
    //平均値を求める処理
    double ave = Average(num1,num2);
    //数値を表示する処理
    printf("%f\n",ave);
    return 0;
}

//平均値を求める関数
double Average(int num1,int num2){
    //合計値を求める処理
    double sum = num1 + num2;
    //合計値を除算する処理
    double _ave = sum / 2;
    return _ave;
}

この2つのコードブロックを見比べれば心なしか下のコードの方が読みやすいような気がしてきませんか?

おわりに

最後まで読んでくださりありがとうございました。