紳士なブログ

紳士すぎてすみません

『良いコードを書く技術』のまとめ その1

そろそろリファクタリングとか良いコードを書くことをもっと意識してもいいなと思ったので、『良いコードを書く技術』を読んでみた。

いくつか参考になることがあったので、重要なところをまとめてみたいと思います。

f:id:mathemathiko:20120609170450j:plain

Amazonで詳細を見る


目次

第1章 良いコードとは何か
第2章 良いコードを書くための5つの習慣
第3章 名前付け
第4章 スコープ
第5章 コードの役割
第6章 コードの集約
第7章 コードのパフォーマンス
第8章 ユニットテスト
第9章 抽象化
第10章 メタプログラミング
第11章 フレームワークを作ろう


良いコードの定義


本書では、次の4つを満たすものを良いコードと定義している。

  • 保守性が高い
  • すばやく効率的に動作する
  • 正確に動作する
  • 無駄な部分がない


良いコードを書くための習慣


長い期間プログラマをやっているからといって必ず良いコードが書けるようになるわけではない。
良いコードを書くための習慣を日々実践して、時間をかけて積み上げていくことが重要。


  • その1 コードを読んで読んで読みまくる
    • オープンソースソフトウェアや周りの達人プログラマの人が書いたコードをじっくり読んだことがないのであれば、かなり危うい状況
      • 音楽や絵画など芸術の世界で、自分だけの発想で作品を完成させる人はいない
      • 先人たちの作品を見て、影響を受けたり良いところを盗んで咀嚼していくなかでオリジナルの作品を生み出していく


  • その2 とにかくコードを書く
    • いったい何を書けばいいんだろうという人は、コードの写経をするとよい
    • 写経することで、もとのコードが書かれた手順や、行間に潜む意図を伺い知ることができる


手の裏付けのない言葉はあまりに安い。人を動かしたかったら、まず自分の手を動かせ。手が塞がっていたら、手を動かした経験を語れ。口で語るな手で語れ。
ーー小飼弾「スーツの道も、舗装するのはギーク(404 Blog Not Found)2007」


  • その3 道具を磨く
    • コードを書くうえで必要な道具や環境を最高の状態に保つ
    • 作業効率を上げていくことで、無駄のないプログラミングを行う


  • その4 良い知識を得る
    • 書籍を選ぶときは良書を選ぶべし
    • 各言語において原典とも言える良書と、それを読みやすくするためのHOW TO本を組み合わせるとよいのでは


  • その5 アウトプットと人からのFBでさらなる成長を
    • コードレビューを受ける
      • GitHubで自分のコードを公開する、公開されている他人のコードを読むことはおすすめ
    • ブログを書く
    • 勉強会に参加する


名前付け

  • 良い名前は重要
    • 良い名前を使うことで読みやすく理解しやすいコードになり、保守性も向上する
    • 逆に悪い名前はバグを生み出しやすく、保守が難しくなる
    • 名前付けは良いコードの第一歩であり、基本中の基本
      • オープンソフトウェアのコードを見たりして、命名の幅を広げるのも有効
      • 名前付けがうまくできないときは設計を見なおしたほうがよいことが多い


  • 良い名前の条件
    • 説明的で意味・意図を表している
      • 良い変数名、メソッド名、クラス名は、名前がその中身を正しく表している
      • 逆に長すぎるとコードの可読性が落ちる
    • 省略のコツ
      • 先頭の数文字を残す(Separators→Seps)
      • ingの削除(Grouping→Group)
      • 単語の削除(formattedConsumptionTax→formattedTax)
      • 語頭以外の母音を削除(image→img)
      • 強い音を残す(server→svr)
      • 一般的な略語の利用(database→db)
    • 一貫性がある
      • 対称性を保つ
      • 単語の組み合わせ方を一貫させる
    • コーディング標準に従う


  • 変数名
    • 変数名は宣言、代入、参照といった箇所でコード中に何度も登場するため、良い変数名を付けることができればコードの可読性は飛躍的に高まる
    • 基本は説明的な名前を付ける
      • 変数には値やオブジェクトが格納されている。変数名を見るだけで何がどのような役割として格納されているかが明確にわかるものが良い名前
    • 変数はスコープによって求められる良い名前の性質が異なる
      • スコープが長いとさまざまな箇所から参照され影響範囲が広いため、注意が必要


  • メソッド名
    • 良いメソッド名は、名前から機能が想像できる
    • メソッドは処理を行うので、メソッド名は動詞または動詞+目的語になっていることが多い
    • インスタンスメソッドは「Report.new」のようにオブジェクト名と組み合わせて呼び出されるので、組み合わされたときに重複なく意味が通り名前にする
    • クラスメソッドとクラス名も同様
    • よく使用されるメソッドは簡潔で短い名前が良いと言われる


  • クラス名
    • 変数名やメソッド名と比べてクラス名は単位が大きいため、適切で良い名前を付けることが重要
      • 良いクラス名は、名前だけで何を行うクラスかがわかる
    • クラス名がうまく思い浮かばないときは、自分が作ろうとしているクラスの役割が整理できていない
      • 1つのクラスに複数の責務を押しこんでいたり、役割があいまいだったりしている可能性がある
    • クラスの名前付け=設計である
    • 筆者「自分が知らない表現・概念は、自分の中から生まれない」
    • より上位の表現をものにするには、いろいろなコードや書籍を読んだり、実際にコードを書いて試すことが重要
    • クラス名に対する成長の過程


  • まとめ
    • 最初から良い名前付けをできる人はいない
    • どういう名前が良いのかを慎重に検討し、適切な名前を決定するプロセスを繰り返していく
    • 自分が知らないまったく新しい概念の名前が、突然ひらめくことはない
    • コードリーディングやコードレビュー、誰かに相談するなどして、名前の引き出しを少しずつ増やしていくことでネーミングセンスを鍛える


やたら長くなりそうなので、一旦ここで区切りますー