読者です 読者をやめる 読者になる 読者になる

リーダブルコード読んだ

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

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

この本は,読みやすく理解しやすい良いコードを書くためのテクニックが書かれてる.4部構成になっていて,

  1. 表面上の改善
  2. ループとロジックの単純化
  3. コードの再構成
  4. 選抜テーマ

から成る.エンジニアとして良いコードを書けるようになりたいけど,どんなコードが良いコードなのかいまいちまだ知らないし,しっかりと学んだことがなかったので,すごく勉強になった.

個人的に,この本を読んで特に勉強になったことは,コメントアウトについて,良い名前のつけ方,良い関数の書き方だった.

コメントアウトについては,普段全く書くことがなくて,なんとなく書かないほうがいいんじゃないか勝手に思っていた.コメントアウトを書くときには,この本では大きく

  • コメントするべきでは「ない」ことを知る
  • コードを書いているときの自分の考えを記録する
  • 読み手の立場になって何が必要になるかを考える

この3つについてそれぞれ書かれていて,どれもすごく納得感を得た.

次に良い名前のつけ方について,いくつか印象に残ったことを紹介すと,

まず,変数名について,類語でもっと適切な単語がないかを考える.例えば,

  • send
    • deliver, dispatch, announce, distribute, route

とか.

もっと具体的な名前にする.

ServerCanStart()

これだと,抽象的でどんなことをしているかパッとよくわからない.

CanListenOnPort()

これだと,メソッドの動作をそのまま表していてわかりやすい.

とか.

名前は短いコメントのようなもので,大切な情報があれば変数名に情報を追加すればいい.

// 16進数
string id; // 例:"af84ef845cd8"
string hex_id

として情報を名前に追加したほうが良い.

ほかにも,誤解されやすい名前について紹介されている.

results = Database.all_objects.filter("year <= 2011")

これだと,resultsに含まれているのは「year <= 2011」のオブジェクトなのか「year <= 2011」ではないオブジェクトなのかわからない.select()とかexclude()にしたほうがわかりやすい.

今まで名前をつけるときに,そこまで深く考えずに何となく良さそうな名前で済ませてきていたのだけど,この本を読んでからはすごく気を使うようになって,考えるのに今まで以上に時間を使って気をつけるようになった.tmpとかretvalとかやめよう.

関数については,どこまでを1つの関数で書けばいいのかということについて,

  1. 関数やコードブロックを見て「このコードの高レベルの目標は何か?」と自問する
  2. コードの各行に対して「高レベルの目標に直接的に効果があるのか?あるいは,無関係の下位問題を解決しているのか?」と自問する
  3. 無関係の下位問題を解決しているコードが相当量あれば,それらを抽出して別の関数にする.

を考えるのが良いらしい.今まではどこまで書けばいいのかあんまりわかっていなかったのだけど,「あ,これはこのメソッドですることじゃない!」とか気づいて積極的に抽出していくようになった.

自分がコードを書くときに,参考になるのはもちろん.コードレビューとかで人のコードについて何か言うときにも,この本を紹介して,ここに書いてあるようにしたほうがいいと思うという感じでアドバイスすると無駄なコミュニケーションが省けて良いと思う.

Twitterのほうもよろしくお願いします.スワロイド (tsuwatch) on Twitter