関数について

function.png

関数化するときはどんなとき?

  • 複数の場所で処理が重複してるとき
  • 条件式が分かりにくいとき…関数化して何を判定したいかの名前をつければ可読性up
  • 計算式….数学的に難しい計算内容は関数化して名前をつけると誰でもわかりやすいコードになります
  • 条件分岐のブロック内…switch内のcaseの中が複数行になってきたら、関数化した方がわかりやすいでしょう。
  • ループ….ループの中が複数行になってきたら、関数化
  • ループのブロック内…ifの何重もの入れ子になってきたら、関数にして早期returnした方がわかりやすいです。
  • データ変換…変換後 何々to何々(変換前)
  • データ確認…bool is何々(検証したいオブジェクト)
  • 配列アクセス…get何々()
  • コメント部分….コメントで長ーく説明を書きたくなったら、その処理の部分は関数化した方が良いのサイン

その関数を分割すべきとき

  • 引数が沢山になってきた

関数の戻り値のコツ

C++やJavaの関数は戻り値が1個しかないのが欠点。
なので、複数の返り値にしたいときは、引数の後ろの方にポインタとして渡すのが一般的である。
戻り値はその関数が成功したか、失敗したかintで表すのがいい。

  • 成功したら0
  • 失敗したらエラーを表すエラーコードを返す。LRESULTを使うといいらしい。

すべからず集

関数の引数でただのリファレンス引数(&)は使わない

void f(int& _i){}//これはダメ。

なぜやってはいけないか?
関数の中でいつのまにか、そのリファレンスで渡した引数の中身を変えられてしまい、混乱を招くからである。

出力としての引数目的\nもし、関数の結果を格納したいなら、ポインタにするか、戻り値として返すことにする。

void f(int* _i){}//ok
int  f(){}//ok

入力としての引数目的

ならば、const &にするのがお勧め。
constをつければ、この関数の中で、その引数の値を変えることはありませんよ、と宣言することになる。

void f(const int& _i){}//ok

トラブル

ポインタで渡したけど、値が変わってくれない。

ときは、返り値をポインタにしてやるとよいよ。
たぶん、関数内だけの一時的なメモリになってるから、関数外に出た時に消えてなくなるんだと思う。

英語としての意味

意味

  • 行事、催し物という意味もあるよ

サポートサイト Wikidot.com