関数命名や関数切り出しって本当に大切?
プログラミングで、関数に切り出そうとか、関数名ちゃんと決めようとか言われることがあると思います。
でも、それって本当に大切?
綺麗なコード、見やすいコードって自己満足じゃないの?
そう思う時があると思います。
では、本当に利点があるのか。
その時点だと利点はない。後のみんなの幸せ
動作が変わらないので、その時点では確かに意味がないかもしれません。
ですが、『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();
一気に見やすくなるし、各コードの影響範囲がわかりやすくなります。
関数に切り出す時点で、意味の単位で切り分けるようになるので、無駄なコードの絡まり合いが防げるようになります。
自分が『嫌だった』ことを覚えて、コードを綺麗にしてみよう
ここまで、『嫌なコード』をまとめていきましたが、
日常のプログラミングで、『ちょっとつらいな』って思うコードはあると思います。
ではどうしたら良いだろう?を考えて、綺麗に書くことを意識すると、
今は良いのを実感出来ないかもしれませんが、後の自分や他者の効率化に繋がります。
開発速度・バグなどに関わる関数化・命名について、今一度考えてみてはいかがでしょうか。