エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【プログラミング】関数の切り分け・命名を大切にする利点とは?【676日目】

関数命名や関数切り出しって本当に大切?

プログラミングで、関数に切り出そうとか、関数名ちゃんと決めようとか言われることがあると思います。

でも、それって本当に大切?
綺麗なコード、見やすいコードって自己満足じゃないの?

そう思う時があると思います。

では、本当に利点があるのか。

その時点だと利点はない。後のみんなの幸せ

動作が変わらないので、その時点では確かに意味がないかもしれません。

ですが、『1年以上メンテナンスするコード』や『1000行超えるコード』であれば、話が大きく変わります。

1. 後にコードを読む人の速度が上がる
2. 読まなくていいコードを読まずに済む
3. バグを出すコードが作りにくくなる

等々、、、いろいろ利点があります。
実例を交えて、説明してみましょう。

例) 後の開発速度について

function updateUserRanking()
{
    $latest_user_ranking = $this->getLatestUserRanking();
    $this->setUserRanking($latest_user_ranking);
    $this->sendUpdatedNotificationMail();
}

■仕様変更
最新データの取得方法、AWSのs3からじゃなくて、自社サーバーのapiに変更になりました

さあ、このコードのどこを追えば良いでしょうか。

getLatestUserRankingを見ればいいのがすぐにわかりますね。

すぐわかると嬉しいのは?

では、これが1万行のコードだったら・・・どこ見ればいいかわからない。コードを追うだけでどれくらいの時間が失われるでしょう。

このコードは、少なくとも $this->setUserRanking($latest_user_ranking);と、 $this->sendUpdatedNotificationMail();を 見なくて良いのがわかります。
もし、行数が均等なら、約7000行のコードを読まなくても良くなりました。

1. 後にコードを読む人の速度が上がる
2. 読まなくていいコードを読まずに済む

この利点です。少なくとも、コードを読む時間はすっごく省略出来ます。

例) バグの出にくいコード

ここは、かなり語弊が生まれるかもしれませんが、あえてこう表現します。

function updateUserRanking()
{
    $latest_user_ranking = $this->getLatestUserRanking();
    $this->setUserRanking($latest_user_ranking);
    $this->sendUpdatedNotificationMail();
}

このコードで $this->getLatestUserRanking();の編集をしたとします。

これ、よっぽど変なコードを書かなければ $this->sendUpdatedNotificationMail();に影響はありません。

他のコードに影響がないことがわかりやすいのは、影響範囲をより小さく予測することが出来るようになります。
仮にバグったとしても、その周辺を見れば良いのがわかるでしょう。

順序を意味の単位でまとめられる

$a = 4;
$b = 5;
$d = $a + $b;
$e = $d + $a;

$x = $c + $d + $e;

$this->sendEmail();

このコードは、以下のように書き換えられます。

$a = 4;
$b = 5;
$d = $a + $b;

$this->sendEmail();
$e = $d + $a;

$x = $c + $d + $e;
$a = 4;
$b = 5;

$d = $a + $b;
$e = $d + $a;
$this->sendEmail();

$x = $c + $d + $e;

そう、 sendEmailの順番どうでもいいんです。
『今意識する必要ない』変数について、別な処理の途中に無駄に書いたり、絡まり合ったりするのは、非常に見にくくなります・・・

$x = $this->some_func($a, $b);

$this->sendEmail();

一気に見やすくなるし、各コードの影響範囲がわかりやすくなります。
関数に切り出す時点で、意味の単位で切り分けるようになるので、無駄なコードの絡まり合いが防げるようになります。

自分が『嫌だった』ことを覚えて、コードを綺麗にしてみよう

ここまで、『嫌なコード』をまとめていきましたが、
日常のプログラミングで、『ちょっとつらいな』って思うコードはあると思います。

ではどうしたら良いだろう?を考えて、綺麗に書くことを意識すると、
今は良いのを実感出来ないかもしれませんが、後の自分や他者の効率化に繋がります。

開発速度・バグなどに関わる関数化・命名について、今一度考えてみてはいかがでしょうか。