リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 68人 クリック: 1,802回
- この商品を含むブログ (133件) を見る
きっかけ
そもそも読んだのは、2014年の終わり。
ものすごい売れているので、パラパラめくったら、かなり共感できることが書かれていたので、買った。
すでに買っているのに、読了してないがために2冊買ってしまった思い出の品。
それをきっかけに、クラウドで買った本を管理するようになった。
感想・内容
読んだ感想とまとめ。
主観が入っているので、興味を持った方は購入したほうがいい。
()は、いつも通り、本にはない心の声。
コードの大原則
コードは理解しやすくしなければならない!
なぜなら、読みやすいコードは、他人が最短で理解できるコードの事だから。
他人が理解しやすいようにコーディングすることが、凡人と達人の分かれ目。
コードは短いほうがいいが、他人が理解するまで時間を短くするコードを書くことが優先。
(Javaだと三項演算子がそう。確かに使うとコードが短くなるけど、使い時を間違えると意味が分からなくなる。)
理解しやすい設計が、優れた設計。
(難しいロジックを難しいまま設計するのは、よい設計者とは言えない。)
(エンジニアの腕の見せ所は、分かり難い事をいかに分かりやすく設計するか。その一点に尽きる。)
(難しいものを難しく設計してドヤ顔するのは、恥をしらない愚か者。)
命名
名前に情報を詰め込む
明確な名前を付けることは、多くの情報を詰め込めること。
いい名前は目的や実態を表す。
名前は、短いコメントととらえるべき。
名前の長さ
スコープの範囲で決める。
スコープが狭ければ、処理が見えるため、変数名は短くていい。
(for分のインデックスに "i" を使っていいのは、スコープが狭い時だけって意味だね)
長い名前が問題ではない。意味不明な名前が問題なのだ!
(意味不明な名前とは、ようするにマジックナンバーを使ったりするやつ。)
(日本は、なぜコード値のようなものを命名したがるのだろうか?もの凄く疑問)
(大手SIは、よくすることに思える。)
誤解
誤解されにくい命名を心がける。
命名する際は、誤解を生む要因がないか、積極的に探すクセをつける。
(誤解を生むような命名にするとバグの温床になる。昼ドラで誤解を生むような会話をすると、泥沼に落ちるのと一緒)
コードの美しさ
コードの美しさは、読みやすさ。
シンプルさこそを絶対の基準にする。
美しい = いい設計ではないので、注意。
美しさの原則
- 統一されたレイアウト
- 似ているところは似せる
- 関係するコードをブロック化
コードの段落表記
- 考えをグループ化できる
- 他との考えの違いを区別しやすくする
- 視覚的な踏み石
(枕詞って言った方が日本人にはしっくりくるかな?)
(例を出すと、熱湯風呂に入るのをためらっている奴が、「押すなよ」って言ってたら、押してあげることだ)
一貫性あるスタイル > 正しいスタイル
正しさよりも一貫性が重要。
見た目をそろえることが、バグの早期発見につながる。
コメント
コメントすべきこと
書き手の意図を読み手に伝える。
コメントが名前の説明になる場合、それは名前がおかしいので、考え直す。
コメントは、修正を促したり、なぜそうなったのか背景を載せるように心がける。
一般的なコメント例
TODO:あとでやるタスクを書く
FIXME:既知のバグや不具合
HACK:許容しにくい解決策
XXX:危険、問題あり
定数のコメント
なぜその値なのかを考える必要がなくすコメントにする。
コメントを書く基準
読み手が、プロジェクトを熟知していない人と考える。
つまり、コメントに書かなければいけないこととは、質問されそうなことに対する答えだ。
コメントを書く作業フロー
- 頭にあるコメントをすべて書き出す
- 不要な個所を探す
- 改善、添削
コメントすべきではないこと
コードからすぐに抽出できること。
コードを補うコメント→コメントを書くのではなく、コードを修正すべき。
コメントに書くべきこと(推奨すべきこと)
- なぜこの作りになっているか
- コードの結果レベル(TODO, FIXMEなど)
- 定数の背景
読み手が欲しているもの
- 疑問に思うことを先回りして書いておく
- ファイル・クラスの全体像
- 一般的ではない動作
コメントの簡素化
コメント領域は少なくすべき。
多いコメント→それだけコードに問題がある。
歯切れのいい文書、短いけど的確な文章が、読みやすさにつながる。
特に、あいまいな代名詞は除去する。
「それ」「これ」は、読み手が何を指しているのか紐解く必要があり、手間と誤解を招く。
使ってもいいが、何を指しているのか明確にしてあげる。
ロジック
if文
条件は、否定形よりも肯定系を使う。
否定形は、分かり難さにつながる。
条件の優劣も見やすさにつながるので、注意。
三甲演算子
基本的には使うべきではないが、よりコードが簡潔になる場合は使うべき。
(これをどう使うかで、コーディング能力がわかる。)
ネスト
- 深い=精神的苦痛を当たる
- 浅い=理解しやすい
ネストを浅くするには、処理を途中で終わらせるようにロジックを組む必要がある。
難しいロジック
最善手ではない可能性が高い。
逆転の発想が必要になる。
巨大で難解なロジックはなるべく分割する。
変数
一度だけ初期化するもの。
変数の変更が多くなるということは、処理を追う必要があり、面倒。
テスト
テストコード
テストコードが読みやすい=テスト以外も読みやすい。
テストコードが読みにくいと起こること
- 本物のコードの修正を恐れる
- 新しいコードを書いてもテストケース書かない
テストの原則
大切ではない詳細 → 隠す 大切な詳細 → 目立たせる
(つまり、本質ではないことは、処理を隠蔽してやる必要がある。)
テストデータ
なるべく単純化させる。
複雑なテストデータは、隠すか単純化しないと、テスト恐怖症を引き起こす。
テストやりすぎ問題
90%のテストは楽だが、残りの10%は難しいもの。
実際に100%のカバレッジを達成しても、バグがゼロになることはない。
コストとバグの消化が割りに合わなくなるので、許容店を考える。
最後に
コードの質を高める
簡単なのは、外部の視点を得ること。
外部には、6ヶ月後の自分も含まれる。
(ぼっちにやさしい!)
(自分は、触らなくなって3日立つと忘れるので、うまく利用する)
エンジニアで大切なこと
実践すること
気づく機会は、手を動かしたもののみに与えられる。
気づきがなければ、成長はできない。
他人に頼る
外部の視点は、自分に気づけないことに対する気づきを与えてくれる。
なので、指摘してくれる人は大切にすべき。
(GitHubにコードを晒す連中は、コレが主要な目的だと思う。)
感想
いろいろ考えが変わった一冊。
自分ではなく、読む人にたいしてコーディングするという考えが、一番印象にのこった&ためになった。
意外にも、それが出来てない奴が、日本には多い。
言われたことをそのまま実装するだけでは、ダメだということを痛感できた一冊。
新人教育で読ませるだけでも価値があると思うんだが、ウチの会社は理解せんだろうな。。。
これを読書会を社内で開くことを検討中。
やって結果が出たら、ブログに書きたい。