プログラマーの五感を活性化するバイブル リーダブルコードという良書

「読みやすい」コードとは「理解しやすい」コードであり、結果として「優れた」コード。

この信念の元で書かれた本書は、多くのエンジニアが薦める一冊。

本書では4つのトピックにおいて、実践的な内容が書かれており、とにかくコスパ◎な一冊。

そもそも理解しやすいコードの定義とは何か!?

POINTコードは他の人が最短時間で理解できるように書かなければならない!!

これを実践するための具体的なテクニックを教えてくれるのがリーダブルコード。

Ⅰ部.表面上の改善

読みやすさの基本は「表面上の改善」から!!

具体的に何に気をつければ良いのか!?

・名前に情報を詰め込む

・誤解されない名前

・美しさ

・コメントすべきことを知る

・コメントは正確で簡潔に

一応挙げてみたものの・・・

言うは易し行うは難しです。

名前に情報を詰め込む

変数・メソッドに情報を詰め込むコツは!?

・明確な単語を選ぶ

・汎用的な名前は避ける

・抽象的よりも具体的な名前

・接尾辞・接頭辞で情報追加

・名前の長さを決める

・名前のフォーマットで情報

「明確な単語を選ぶ」は、例えばGetより状況に応じてFetchやDownload。

「汎用的な名前は避ける」は、明確な理由(生存期間が短い)があれば◎

「抽象的よりも具体的な名前」は、ServerCanStartよりCanListenOnPort!!

「変数名に大切な情報を付与」は、ミリ秒を表す変数には_msなどつける。

「スコープの大きな変数は長めに」は、極力暗号めいた短い名前は×

「大文字や_に意味を含める」は、_でグローバルとローカルを区別。

誤解されない名前

POINT最善の名前は、誤解されない事!!

実践的な方法に以下を挙げられています。

・上下限界値はmax_やmin_

・包含的範囲はfirstやlast

・排他的範囲はbeginとend

・ブール値はisやhasなどの単語

・get()やsize()は軽量メソッド

美しさ

優れたコードとは「目に優しい」もの。

具体的に以下3つの原則があります。

・読み手が慣れているパターンと一貫性のあるレイアウト

・似ているコードは似ているように見せる

・関連するコードはまとめてブロックにする

具体的な技法は!?

・同様の処理があれば、シルエットも同じように揃える

・コードの「列」を整列すれば、概要が把握しやすくなる

・変数の書く順番は、意味のある順番を選び、その順番を守る

・空行を使い、大きなブロックを論理的な「段落」に分ける

コメントすべきことを知る

コメントの目的とは!?

POINTコメントは書き手の意図を読み手に知らせること!!

具体的には以下の点に配慮しましょう。

・コメントすべきでは「ない」こと

・コードからすぐ抽出できる事

・ひどいコードを補う「補助的なコメント」

・記録すべきは自分の考え

・なぜコードが他のやり方でなく、こうなっているのか

・コードの欠陥をTODO:やXXX:などの記法を使って示す

・定数の値にまつわる「背景」

・読み手の立場になって考える

・コードを読んだ人が「え?」と思う箇所を予想してコメント

・平均的な読み手が驚くような動作を文書化しておく

・ファイルやクラスには「全体像」のコメントを書く

・読み手が細部にとらわれないようブロックの概要を書く

言うは易し行う難しですが・・・

POINT優れたコード > ひどいコード + 優れたコメント

コメントは正確で簡潔に

コメントは領域に対し情報比率が高いこと。

具体的なヒントには、以下が挙げられます。

・複数を指す可能性のある「それ」「これ」など代名詞は×

・関数の動作は正確に説明する

・コメントの入出力の実例を慎重に記述すること

・コードの意図は、詳細レベルではなく、高レベルで記述する

・よく分からない引数には、インラインコメントを使う

・多くの意味が詰め込まれた言葉や表現を使い簡潔に保つ

Ⅱ部.ループ・ロジック単純化

コードを動かすための制御フロー・論理式・変数など、精神的な負荷を減らす取り組み。

・制御フローを読みやすくする

・巨大な式を分割する

・変数と読みやすさ

制御フローを読みやすくする

具体的に以下に配慮しましょう。

・条件式の引数の並び順

左側には「調査対象」の式(変化有)、右側には「比較対象」の式(変化無)。

・if/elseブロックの並び順

条件式は否定形よりも肯定形し、単純な条件を先に記述、また関心を引く条件を先に書く。

・三項演算子の扱いについて

行数を短くするよりも、他人が理解するのにかかる時間を短くする。

・do/whileを避ける

コードは上から下に読むが、do/whileではコードを2度読む事になってしまい、まだ内部で使われるcontinue文が紛らわしいので、特別な理由が無ければ使わないこと。

・ネストを浅くし、関数から早く返す

ネストは深くなると、精神的負荷も高まるので、浅くして早めに返す(return)。

巨大な式を分割する

巨大な式を分割し、読み手に優しいコードを書くには、説明変数を導入するのが簡単。

説明変数は以下3つの利点があります。

・巨大な式を分割できる

・簡潔な名前で式を説明することで、コードを文書化できる

・コードの主要な「概念」を読み手が認識しやすくなる

複雑なロジックを見たら積極的に分割!!

変数と読みやすさ

変数の名前が適当だとどうなる!?

・変数が多いと変数を追跡するのが難しくなる

・変数のスコープが大きいとスコープを把握する時間が長い

・変数が頻繁に変更されると現在の値を把握するのが難しい

変数を減らし軽量化すると読みやすいです。

・邪魔な変数を削除する

・スコープを小さくする

・一度だけ書き込む変数を使う

邪魔な変数には役に立たない一時変数など。

役に立たない一時変数の特徴↓

・複雑な式を分割していない

・より明確になっていない

・一度しか使っておらず、コード重複削除になってない

Ⅲ部.コードの再構成

コードを大きく再構成する技法として、以下3つの方法が挙げられます。

・プログラムの主目的と関係のない「無関係の下位問題」抽出

・コードを再構成して、一度に1つのことをやるようにする

・最初にコードを言葉で説明、説明を元に解決策を作る

無関係の下位問題を抽出する

エンジニアリングとは、大きな問題を小さな問題に分割し、解決策を組み立てること。

そのためには「無関係の下位問題を積極的に見つけて抽出すること」に!!

・関数やコードブロックで「このコードの高レベルの目標は何か?」と自問自答

・各行で「目標に直接効果ある?無関係の下位問題を解決してる?」と自問自答

・無関係の下位問題を解決するコードが多くあれば、別の関数にまとめる

下位問題を抽出することで得られる恩恵とは!?

・呼び出し側のコードが簡潔化

・別の箇所で再利用が可能

・改善が楽になる

大切なことは!?

POINTプロジェクト固有のコードから汎用コードを分離すること!!

1度に1つのことを

長く複雑なプログラムを見たらコレを意識。

・タスクを小さく分解し、1度に1つのタスクとする

・処理の塊単位で領域を分け、読みやすさを意識する

コードに思いを込める

コードを簡単な言葉で説明することは、自分の考えを明確にすることにも繋がります。

コードをより明確にする簡単な手順。

・コードの動作を簡単な言葉で、同僚にも分かるように説明

・説明の中で使っているキーワードやフレーズに注目する

・説明に合わせてコードを書く

短いコードを書く

出来るだけ新しいコードを書かない意識。

・不要な機能を削除、過剰な機能は持たせない

・最も簡単に問題を解決できるような要求を考える

・定期的に全APIを読み、標準ライブラリに慣れ親しむ

第Ⅳ部. 選抜テーマ

今まで本書で説明された手法を、具体的に以下2つのテーマで適用させる.

・効果的で読みやすいデータの書き方

・特定用途のデータ構造[分/時間カウンタ]の設計と実装を検討

テストを改善する点について↓↓↓

・テストのトップレベルは出来るだけ簡潔にする

・テスト失敗時、バグの発見・修正がしやすいようにエラーメッセージ表示

・テストに有効な最も単純な入力値を使う

・テスト関数に説明的な名前をつけ、何をテストしているのか明らかにする