決して口開けて空眺めながらコードを書いているわけではないと弁明させてほしいんですが、それでも1日経てばもう終わりです。昨日書いたコードの記憶は消し飛び、「このコード書いたの誰だよ…。…俺か…」と自己嫌悪の波に飲まれ……ることはありませんが、自分の書いたコードの解釈に体力を使うことになります。過去の自分に苦しめられることほど腹の立つことはありません。ではどうすれば良いか。読みやすいコードを書けばいいんです。簡単ですね。
リーダブルコード――より良いコードを書くためのシンプルで実践的なテクニック
これは私が新卒の頃に借りて読んだ本です。新卒の頃は今の100分の1程度の技術力しかありませんでしたし、初版も2012年(原著は2011年)と古めですが、それでもこの本は非常に読みやすかったです。それから数年経ち、改めてまた読みたくなったので自分で買いました。この本の内容は現在も通用し、全て重要で、どの部分が一番であるといった優劣は付け難いんですが、今回はこの本の中から私が一番気を付けていることを紹介します。タイトルにもある一度に1つのことをです。一度に1つのことを
本よりの引用ですが、以下の2つのJavaScriptコードを見比べてみてください。vote_changedはユーザがブログで投票するときに使われる関数です。初版が10年近く前なのでconstではなくvarを使っていたりしますが、原文ママで載せています。皆さんはconstを、定数ではどうしようもないときだけletを使用してください。letのほうが読みやすいし、くらいの理由ならconstを使ってください(過激派)。var vote_changed = function(old_vote, new_vote) { var score = get_score(); if (new_vote !== old_vote) { if (new_vote === 'Up') { score += (old_vote === 'Down' ? 2 : 1); } else if (new_vote === 'Down') { score -= (old_vote === 'Up' ? 2 : 1); } else if (new_vote === '') { score += (old_vote === 'Up' ? -1 : 1); } } set_score(score); }
var vote_value = function (vote) { if (vote === 'Up') { return +1; } if (vote === 'Down') { return -1; } return 0; } var vote_changed = function (old_vote, new_vote) { var score = get_score(); score -= vote_value(old_vote); // 古い値を削除する score += vote_value(new_vote); // 新しい値を追加する set_score(score); }恐らく下のほうが読みやすいと感じたと思います。
「下のほうはコメントがあるからずるい!」という意見が聞こえてきました。では
score += (old_vote === 'Down' ? 2 : 1);
にコメントを付けるとすると、どう付ければ良いでしょうか。少なくとも「古い値を削除する」だけでは実態に合っていません。下は一度に「古い値を削除する」というひとつのことが行われているからこそ、これほど単純なコメントを付けるだけで済んでいます。バグがあったとしても、上の方は「一番最初の条件分岐か?それとも2個目?それとも三項演算子?」と考えることが多くありますが、下の方は「多分vote_valueの条件分岐だろう」くらいには当たりを付けることができます。
最後に
今回書いた内容はとても基本的なことで、「この世に生を受けたときからこんなの知ってるわ」という方もいると思います。実際、この本の内容は非常に基本的なことが紹介されていて、ドメイン駆動設計やクリーンアーキテクチャといった完璧な秩序をプロジェクトにもたらす内容、というものではないと思います。ただ、この本の内容を完璧に守ったコードがあったとしたら、それは高尚な設計思想が使われていなくても非常に読みやすいコードだと思います。簡単な内容で200ページとちょっとなので、一度図書館とかで借りて流し読みしてみましょう。それだけでもきっと明日の自分が書くコードが少しだけ晴れ晴れとして見えると思います。
ついでに
株式会社イメージ・マジックではエンジニアを募集しています。PHP未経験者でも大丈夫です。「PHPはちょっとなあ…」という方もいるかもしれませんが、弊社ではSymfonyというMVCフレームワークを採用しており、JavaのSpring BootやRuby on Railsと同じような書き味ですし、何より使いやすいです。PHPはわかりませんが、Symfonyのことはきっと好きになれると思います。