良いコードを書く技術


良いコードを書く技術 -読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)


技術評論社


著者:縣俊貴


はじめに
謝辞
コード例について
サポートページ
公式タグ
目次

第1章 良いコードとは何か
1.1 良いコードの定義と価値
1.2 良いコードの定義
保守性が高い
すばやく効率的に動作する
正確に動作する
無駄な部分がない
1.3 良いコードの価値
プロジェクトを強力に推し進める
プログラマとしての評価が高まる
仕事に満足感や自信が持てるようになる
1.4 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
1.5 まとめ

第2章 良いコードを書くための5つの習慣
2.1 良いコードは1日にしてならず
2.2 習慣その1 読む──コードを読んで読んで,読みまくれ!
Column:コード検索サービスでコードの海を泳ぐ
2.3 習慣その2 書く──とにかくコードを書きましょう
Column:1人でプログラムを書けますか?
2.4 習慣その3 道具を磨く──使う道具は常に磨いておこう
エディタ/統合開発環境
自動化
バージョン管理ツール
UNIX/Linux/Mac OS X
Column:良い道具に乗り換える
2.5 習慣その4 知る──良い知識を得よう
書籍──原典とHow To本の2冊買いがお勧め
リファレンスや仕様書などのドキュメント
Webサイト
2.6 習慣その5 聞く──アウトプットと人からのフィードバックでさらなる成長を
コードレビューを受ける
ブログを書く
コミュニティや勉強会に参加する
成果を発表する
2.7 まとめ

第3章 名前付け
3.1 良いコードは良い名前から生まれる
3.2 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
3.3 良い名前の条件
説明的で意味・意図を表している
一貫性がある
英語で付けられている
イディオムに従っている
コーディング標準に従っている
Column:名前の流行り廃り
3.4 変数名
基本は説明的な名前を付ける
グローバル変数,クラス変数,フィールド変数──意味を正しく表現する
Column:変数の種類
ローカル変数──スコープの長さで使い分け
メソッドの引数名──わかりやすく簡潔に
3.5 メソッド名
Column:メソッドの種類
3.6 クラス名
クラス名のボキャブラリは経験とともに高まる
3.7 パッケージ/ネームスペース名
3.8 プロジェクト名
3.9 まとめ
Column:Cubbyのクラス名の変遷

第4章 スコープ
4.1 スコープを意識していますか?
4.2 スコープって何?
4.3 スコープを小さくして覚えておくことを減らそう!
4.4 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
4.5 変数のスコープ
ローカル変数
Column:JavaScriptの奇妙なスコープ
フィールド変数
クラス変数
4.6 メソッドのスコープ
インスタンスメソッド
クラスメソッド
メソッドの引数の情報量
4.7 クラスのスコープ
インナークラス
無名クラス
4.8 キャストを使用した可視性の制御
4.9 より大きな粒度のスコープ
4.10 まとめ

第5章 コードの分割
5.1 適切な長さにコードを分割する
5.2 なぜコードを分割するのか
可読性が向上する
保守性が向上する
再利用性が向上する
5.3 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
5.4 2つの方向からの分割
トップダウン方式
ボトムアップ方式
5.5 お題 クライアントにXMLを返すWeb APIの処理を分割
5.6 ステップ1 ベタなコードで書いてみる
5.7 ステップ2 共通処理をメソッドに抽出して分割する
考察 どこまで共通化を行えばいいの?
5.8 ステップ3 処理単位で分割する
考察 制御構造と処理の分け方
5.9 ステップ4 状態を持つ処理をクラスに抽出して分割する
考察 インナークラスとして実装しているのはなぜ?
考察 必要なデータをコンストラクタで渡しているのはなぜ?
考察 フィールド変数として保持したほうがよいものは何?
考察 さらにリファクタリングしてみる
5.10 まとめ

第6章 コードの集約
6.1 コードの重複は悪
6.2 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
6.3 メソッドに抽出してまとめる
6.4 継承でまとめる
継承でのまとめ方には注意
6.5 ユーティリティクラスにまとめる
Javaではstaticインポートと組み合わせると便利
ユーティリティクラスの名前付け
6.6 サービス層にまとめる
6.7 オブジェクトにまとめる
6.8 定数にまとめる
6.9 まとめ
Column:まとめ過ぎにご用心

第7章 コードのパフォーマンス
7.1 パフォーマンスを意識していますか?
7.2 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
7.3 パフォーマンスは計算量で決まる
アルゴリズムの選択で変わる
クラスの選択で変わる
ライブラリの使い方で変わる
7.4 パフォーマンスチューニングの手順
(1)まずは測定する
(2)原因を特定する
(3)チューニングする
(4)チューニング結果を測定する
7.5 アルゴリズムの選択以外のパフォーマンスチューニング
SQLやテーブル設計を変更する
キャッシュする
インフラを強化する
7.6 パフォーマンスチューニングの指針
どのタイミングでチューニングするのがベストなの?
適切な量のテストデータを用意しよう
常にパフォーマンスを意識しよう
7.7 まとめ

第8章 ユニットテスト
8.1 テストはお好きですか?
8.2 ユニットテストって何?
8.3 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
8.4 ユニットテストの効能
網羅的なテストを自動化できる
回帰テストによりコードが壊れていないことを保証できる
設計の改善につながる
8.5 お題 Webアプリケーションのセキュリティテスト
8.6 ステップ1 データベースにテストデータを登録する
8.7 ステップ2 画面の実装
8.8 ステップ3 画面のユニットテスト(正常系)
8.9 ステップ4 画面のユニットテスト(異常系)
8.10 ユニットテストの指針
テストのポリシーを決めておこう
テストしやすい部分はどこ?
テストしにくい部分はどうする?
8.11 まとめ
Column:言語別のテスティングフレームワーク

第9章 抽象化
9.1 抽象化がプログラミングのパワーを最大化する
9.2 配列/コレクションって何?
9.3 配列/コレクションを利用した抽象化とは?
9.4 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
9.5 お題 画像ファイルの一覧を表示するWebアプリケーション
9.6 ステップ1 ベタなコードで書いてみる
9.7 ステップ2 可読性を高めるためのメソッド抽出
9.8 ステップ3 関連するデータのデータ構造を整理
9.9 ステップ4 配列/コレクション化して抽象化
9.10 抽象化の指針
どのタイミングで抽象化するのがベストなの?
コードの重複をまとめるな!?
これって単なるループなんじゃない?
9.11 まとめ

第10章 メタプログラミング
10.1 プログラミングをプログラムする
10.2 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
10.3 メタプログラミングって何?
コードの自動生成
DSL
Column:流れるようなインタフェースとstaticインポートによる内部DSL
10.4 お題 Excelを使った外部DSL
Excelのメリットとデメリット
固定長電文解析処理をDSLで処理する
10.5 ステップ1 ベタなコードで書いてみる
考察 インナークラスを使っているのはなぜ?
10.6 ステップ2 メタデータをExcelに移動する
考察 メタデータって何?
10.7 ステップ3 リフレクションAPIで変換ルールを動的に適用する
Column:JavaのリフレクションAPI
ストラテジパターン
考察 複数の変換パターンを適用したい場合は?
考察 変換ルールに引数を追加したい場合は?
考察 DSLの構文を改善するには?
考察 DSLのテストはどうする?
考察 DSLのデバッグはどうする?
考察 これはフレームワーク? それともDSL?
10.8 まとめ

第11章 フレームワークを作ろう
11.1 フレームワークの動作原理を知る
11.2 代表者の声
良い仕事をしたい普通のプログラマ
達人プログラマを目指す中級プログラマ
達人プログラマ
11.3 お題 Webアプリケーションフレームワークを作ろう
11.4 ステップ1 素のサーブレットで書いてみる
11.5 ステップ2 フロントコントローラとアクションクラスの導入
11.6 ステップ3 ルーティング情報の外部ファイル化
11.7 ステップ4 よく使う処理を簡単に実行できるように共通化する
考察 これからさらにフレームワークを拡張するには?
11.8 ステップ5 フレームワークをパッケージ化する
(1)フレームワークのコードとアプリケーションコードを分ける
(2)パッケージ化する
(3)バージョンを付けて管理する
11.9 まとめ

付録A コードリーディングの方法
A.1 コードには動的な読み方と静的な読み方がある
A.2 お題 Apache Commons IOのコードを読む
A.3 ステップ1 対象のコードをダウンロード(チェックアウト)する
A.4 ステップ2 静的な方法でコードを読む
検索コマンドを使う
Eclipseなど統合開発環境を使う
EmacsやVimでタグジャンプ機能を使う
A.5 ステップ3 動的な方法でコードを読む
デバッガで実行する
ユニットテストを実行する
コードを修正して実行する
部分的なコードをコピーして使ってみる
A.6 まとめ
付録B 解説付き参考文献

あとがき
索引

書籍目次

Posted by shi-n