一度に1つのことを(リーダブルコードより)

こんにちは。3行コードを書くとそれより前に書いたコードの記憶が飛んでいる池田です。
決して口開けて空眺めながらコードを書いているわけではないと弁明させてほしいんですが、それでも1日経てばもう終わりです。昨日書いたコードの記憶は消し飛び、「このコード書いたの誰だよ…。…俺か…」と自己嫌悪の波に飲まれ……ることはありませんが、自分の書いたコードの解釈に体力を使うことになります。過去の自分に苦しめられることほど腹の立つことはありません。ではどうすれば良いか。読みやすいコードを書けばいいんです。簡単ですね。何が簡単なんだ。

リーダブルコード――より良いコードを書くためのシンプルで実践的なテクニック

https://www.oreilly.co.jp/books/images/picture_large978-4-87311-565-8.jpeg これは私が新卒の頃に借りて読んだ本です。新卒の頃は今の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のことはきっと好きになれると思います。