【日記】読みやすいコードについて考えたこと

読みやすいコードとは何かについて個人的に思っていることについて書きます。
前提として、黒魔術的な話や自動整形で直せるような部分には触れません。

そもそも読みやすさとは何か?

最近のコードにおける読みやすさとは「その処理によって何がどう変化するか(しないか)を予測できること」だと自分は考えています。
今時の「動的型付け辛い」だとか「強力な型システムはいいぞ」だとか「関数型プログラミングはいいぞ」の流れも結局本質はそこにあると思っています。

要するに、文法の良し悪しだとか見た目がきれいだとかいう以上に何が起きるか(起きないか)を人間が予測しやすい形になっているかの方が問題だということです。

最近の言語はいかにして読みやすさを確保するか

最近のプログラミング言語は以下のような要素を実現することで読みやすさを確保していると思っています。

  • 強力な型システム
  • スコープを強力に区切ることによる外部への影響の限定
  • mutable / immutableの徹底

逆に言うと、これらに反するようなコードの書き方はあまりよろしくないものだと解釈しています。

具体的なコードの読みやすさ

「自分ならこう解釈する」という程度の話ですが、ここまでの流れを踏まえ、Javaでの一部機能を例にどちらが良いと感じるかを書きます。

if文 vs 三項演算子

三項演算子の方がよいと考えています。

理由は、if文ではその中で一体どのような副作用が発生するか分からないのに対し、三項演算子では恐らく代入しか行われていないことが想定しやすいからです。

一時変数を置く vs 置かない

極力置かないか、置いてもスコープが限定されていて使い捨てにされるべきだと考えています。

理由は、スコープ内に変数が増えれば増えるだけ何が起きるかの予測が難しくなるからです(e.g. 再代入されたり、リストの中身が別の場所で変更されるなど)。

StreamAPIやOptionalを上手く使えば一時変数と上手く付き合うことができますし、極力宣言される一時変数は少ない方が良いでしょう。

ただし、やりすぎると実際に読みにくくなるというのは確かだと思うので、「一時変数が無く読みやすい > 一時変数が適度に有る > 一時変数が無く読みにくい > 一時変数が多い」の順で良いコードだと考えています。

for文 vs forEach文

forEach文を使うべきだと考えています。

理由は、forEach文では外部の変数が変更されない(中身が変更できることはともかく!)ということが明示されるのに対し、for文や拡張for文では外部の変数に対して変更ができるため、動作の予測が難しくなるからです。

また、インデックスを使うようなfor文に関しても、これからはIntStream等のrangeを使うことで対応ができるので、これからは余程の事情が無ければ通常のfor文を用いるべきではないと思います。

読みやすさか能力不足か

このような話題を出した時、「とは言えこの書き方は読みにくいんじゃないか?」という意見が出ることは有りますし、実際自分も「この書き方だと読みにくいんじゃないか、読みにくいなら使わない方がいいんじゃないか」と感じたことも有ります。

ただ、エンジニアになって半年以上開発を続けた結果、これはコードが読みにくいのではなく自分の能力が不足しているということなのだと解釈するようになりました。

理由は以下の3点です。

  1. 鬼強い人らが集まって決めたプログラミング言語の仕様だから嬉しさは必ず有る
  2. その嬉しさを使わなければ損をする
  3. 嬉しさを使わない理由が能力不足なら悪いのは自分

確かに新しいものを積極的に使おうと思えば覚えることは非常に多岐に渡ります。
一方、何故新しいものが追加されたかと言えばそれに嬉しさが有るからです。

少なくとも当分技術で食って行こうと思うなら、プログラミング言語に新しく追加された機能からなるべく早い時期に嬉しさを引き出そうという姿勢は必要だと思います。

とは言え既存のコードの秩序を破壊するべきなのか?

エンジニアは日々成長する生物であるため、コードを書いていく中でより良い書き方に出会うことは多々あると思いますが、その時どのタイミングでどのようにより良いコードを取り込んでいくかという話です。
これには以下3つの選択肢が有ると思います。

  1. 全面的なコードの改修を含めた対応を行う
  2. 新しいコードは原則それを用い、既存は順次改修していく
  3. それを用いない

チームで相談して1を選べるなら特に問題は有りませんが、2の選択肢を選ぶ場合既存のコードと整合性が取れなくなることについてどうするべきかという話になるでしょう。
また、それを用いると見た目がガラッと変わるため、読みにくく感じてしまう場合も有ると思います。

それでも、自分は以下3点から2の選択肢を取るべきだと思います。

  • 読み書きしていけば文法には慣れる
  • 実装レベルでの文法ブレはそこまで重大な問題ではない
  • 直していった方が将来的なバグを防げる

まとめ

読みやすいコードとそれを書いていく上での心構え的な部分をまとめました。

かなり原理主義的な意見だという自覚は有りますが、個人的にはこのスタンスでやっていくことが結局コード品質の向上につながるだろうと思っています。