リーダブルコードを読んでみて、個人的に共感したポイントや、これから意識しようと思ったポイントをまとめていきます。
リーダブルコードとは?
リーダブルコードとは、「リーダブルコード―より良いコードを書くためのシンプルで実践的なテクニック」という本の呼称になります。
この本は特定のプログラミング言語でのコーディングを学ぶ本ではありません。
特定のプログラミング言語にとらわれず、プログラムを書く際に意識しておきたいポイントや、コードをどのように書くと良いかを提唱する本になります。
コーディングには必ず一つの解があるわけではありません。
いくつもの方法がある中で、より良い方法を考えて選択していきます。
プログラミングを始めたばかりの入門者の方は、何が良い方法なのかその判断がなかなかできないと思います。
その1つの判断材料として、どういったことを意識したら良いのか、どんな書き方をしたら良いのかを学べる一冊だと思います。
ぜひ入門者の方は一度は読んでおいて欲しい一冊です。
この記事について
冒頭で触れましたが、この記事では個人的に共感したポイントや、これから意識しようと個人的に思ったポイントについて書いていきます。
そのため、今回これから書く内容はこの本のすべてではありませんのでご注意ください。
また、この本の内容を公開するためのものではありません。
これから大きく2つに分けて話をしていきます。
- コーディングをする際の考え方や意識するポイント
- 具体的なケースでの書き方例
それでは詳しく話をしていきます。
コーディングをする際の考え方や意識するポイント
まずは、「コーディングをする際の考え方や意識するポイント」についてです。
次のことを意識すると良さそうです。
- 短いコードを書く意識
- 短いコードを書くことより、理解しやすいコードを書くことを意識
- 誤解されない名前を付ける意識
- 他のソースコードとの一貫性を意識
- コメントをつけるべきところを意識
「短いコードを書く意識をする」と合わせて「短いコードを書くことより、理解しやすいコードを書くことを意識する」とあります。
一見すると矛盾していますが…詳しくはこの後それぞれ説明します。
短いコードを書く意識
まず、なぜ短いコードを書く必要があるのかという点について。
短いコードであれば、一般的に他人が見ても素早く理解しやすいコードになっているためです。
極端な例ですが、100行のコードと10行のコードがあったと想像してみてください。
何が書いてあるのか時間をかけずに理解できるのはきっと10行のコードになりますよね。
コードを読む量が断然違うので、当然短い方が早く理解しやすいです。
また、自分が書いたコードであったとしても、1ヶ月や2ヶ月後の自分がコードを見返した時に、そのコードについてはきっと忘れてしまっているでしょう。
その時のためにも、極力短いコードにしておき素早く理解できるコードにしておくべきということなのです。
ですが、10行や100行でできるアプリケーションやサービスは滅多にないと思います。
なので、私達はこの短いコードを積み上げていくことを意識してコーディングをする必要があるのです。
短いコードを積み上げるために次のことを意識しながらコーディングをおこなう必要があります。
- メソッドで分割する
- 汎用的なユーティリティコードを作成して、重複するコードを無くす
- 既存コードを用いて、できるだけ新しいコードを書かない
- 標準ライブラリに慣れ親しむ
- 外部のライブラリを使う
メソッドで機能毎に分割することで、短い単位で積み上げることができます。
そして、標準ライブラリに精通しておくことで、実は標準機能で実現できる処理を自分で再開発していたといったことが無くなり、コードを書く量やテストを実施する時間も減らすことができるでしょう。
短いコードを書くことより、理解しやすいコードを書くことを意識
コードは誰かが読むときに最短時間で理解できるように書いておくのが良いです。
読む時間を短くするためにコードを短くしましょうという話を「短いコードを書く意識」でしました。
ですが、必ずしも短いコードが良いということではありません。
例えば、先程の話で100行のコードと10行のコードがあった場合は10行のほうが良いと話をしました。
もちろん、10行の方が圧倒的にコードが短いので理解するのに時間がかからないでしょう。
では、10行と11行だった場合はどうでしょうか。
11行の方がほんの少しだけ時間がかかるかもしれませんが、あまり変わらないですよね。
10行の読みづらいコードと11行の理解しやすいコードの場合は11行の理解しやすいコードを採用するのが良いでしょう。
なぜなら、最短時間で理解できるように書いておくのが良いからです。
説明変数のセクションにて簡単な例を出します。
誤解されない名前を付ける意識
名前を正しく付けることで、それが何者なのか、何をするものなのかを正しく伝えることができます。
もし曖昧で分かりづらい、または実態と異なった名前が変数や関数に付けられていた場合、使い方を誤ってしまい不具合が発生したり、それが何者で何をするものなのか細部を見る必要が出てくることは必至です。
他のソースコードとの一貫性を意識
「他のソースコードとの一貫性を意識」することも大切です。
これもコードを理解する時間に関係してきます。
他のソースコードと一貫性があることで、不要な箇所に意識がさかれず大事なところに意識を集中することができるからです。
例えば、インデントがずれているとか、カッコの書き方が統一されていないとか、スペースの付け方が違う場合はそれに意識が向いてしまいます。
意識を集中するべき大事な処理内容から意識が削がれてしまいます。
カッコの書き方で言うと以下のようなものが混在していたりということですね。
public String getId() {
return mId
}
public String getName()
{
return mName
}
インデントやスペースが統一されていない問題は、IDE(統合開発環境)を使用している場合はコードを整形してくれるショートカットが用意されていることが多いので、活用していくことで解決できるでしょう。
コメントをつけるべきところを意識
コメントを付けることでコードを理解する手助けとなります。
ですが、これまで「コードを短くしましょう」と話がありましたが、コメントを付けることでコードが長くなってしまいますよね。
そのため、コメントには長くなってしまっても最短時間で理解するための手助けとなるような価値があるものでなければならないのです。
なので、コードを読んだらわかるものに関してはコメントを書く必要はなく、手助けとなるようなコメントを書く必要があります。
では、どのような場合でコメントを書くと良いのか。
- 誰かがコードを読むと疑問に思う箇所
- ファイルやクラスの全体像の説明
- 関数内など、細部に捕らわれないようにコードブロックに説明
具体的なケースでのコーディング例
簡単に以下の点についてコーディング例を記載します。
- 説明変数
- 制御フローを読みやすく
説明変数
例えば、以下の条件式で何を比較しているか分かりますか?
if (line.split(":")[0].equals("root")) {
...
}
コードを見ただけではこれが何なのか分かりません。
ですが、以下のように変数を用意するとどうでしょうか?
username = line.split(':')[0].strip()
if (username.equals("root")) {
...
}
このように、コードは少し長くなりますが、説明変数を用意することではるかに理解しやすくなります。
また、デバッグ時にusername
の変数に何が入っているのか調べるのも容易になります。
制御フローを読みやすく
まず、条件式の比較書き方についてです。
条件式では左側に「調査対象」(変化する値)で右側に「比較対象」(あまり変化しない値)にすると理解しやすいです。
例えば、以下が推奨されない書き方です。
final int count = 10;
if (15 <= count) {
....
}
そして、以下が推奨する書き方です。
final int count = 10;
if (count >= 15) {
....
}
いかがでしょうか。
例とする処理は、カウントが15以上の場合に何かを実行するという条件式です。
推奨する書き方は「もしカウントが15以上ならば」と自然に理解でき流れになっていますが、推奨しない書き方では「もし15がカウントならば」と理解しづらい流れになっています。
その他、条件式は可能であれば肯定形を使うのが良いです。
これは、条件式を否定にする場合、頭の中で一度肯定から否定に変換することになるので考える事が増えるためです。
以下が否定形での記述です。
final Boolean enable = true;
if (!enable) {
....
} else {
....
}
そして、以下が肯定形での記述です。
final Boolean enable = true;
if (enable) {
....
} else {
....
}
これら制御フローを読みやすくする書き方は、「最短時間で理解できるようにするため」ということに繋がります。
おわりに
今回は以上となります。
興味がある方はぜひ本を読んでみてください。
入門者の方は一度は読んでおくのが良いでしょう。