あらすじ
読みやすく保守しやすい「良いコード」の書き方を解説した入門書です。本書を読むと,良いコードを書くための習慣から,名前の付け方,コードの分割や集約を行う方法,抽象化の作法,計算量とアルゴリズム,ユニットテストやメタプログラミング,そして簡単なフレームワークの自作まで,プログラマーとして長く役立つ基本が身に付きます。
2011年に刊行し,大好評を博した初版を,10年ぶりに改訂しました。改訂版では,コード例をモダン化したほか,第7章「データ構造」を新たに書き下ろしました。10年ぶりの改訂であるにも関わらず,本書の根幹は驚くほど変わっていません。それはすなわち,基礎や基本といった本質的な知識は,陳腐化しないということです。
感情タグBEST3
Posted by ブクログ
増補改訂 良いコードを書く技術
読みやすく保守しやすいプログラミング作法
著:縣 俊貴
出版社:技術評論社
一千万行を超える膨大なソースコードと、複雑に相互に関連する複数のネストに構成された、巨大なシステムに対して、その前に立つものとして何に気をつければいいだろうか。
不用意な修正については、予期せぬデグレードが生じ、一見関連もないようなシステムのパフォーマンスが劣化し、停止にいたる。
もちろん、設計や、テストにも、問題はあるだろうが、いまあるのは、現状稼働しているモジュールに、対を成す、ソースコードだ。
そんな、迷いの森に踏み込んだ時に掲げる灯りが本書である
気になったのは以下です。
■良いコードとは
保守性が高い
すばやく効率的に動作する
正確に動作する
無駄がない
本書はその前提である、基本的な習慣を緒として、その5つの領域に焦点を当てる
基本的な習慣
良いコードを書くための5つの習慣(第2章)
保守性が高い
名前付け(第3章)
スコープ(第4章)
コードの分割(第5章)
コードの集約(第6章)
データ構造(第7章)
すばやく効率的に動作する
コードのパフォーマンス(第8章)
正確に動作する
ユニットテスト(第9章)
無駄がない
抽象化(第10章)
メタプログラミング(第11章)
フレームワークを作ろう(第12章)
本書の流れは、いわゆる、統合開発環境、コーディング規約から、構造化プログラミング、そして、フレームワークの活用である。
ただし、基本設計書や、詳細設計書の出来不出来に一喜一憂してはいけない。
本書はあくまでもコードが主体である。設計書の粒度などは触れること能わずである。
冒頭に掲げられる、コードライティングの金言
その1 良いコードは一日にしてならず 日々実践、時間をかけて積み上げる
その2 コードを読んで読んで読みまくれ 達人になるまで、先人の作品を読みまくれ
その3 書く、とにかくコードを書こう とにかく手を動かせ、口ではなく、手を動かせ
その4 道具を磨く 使う道具は常に磨いておこう エディタ、自動化ツール、バージョン管理
その5 知る、良い知識を得よう 良い本をたくさん読めといっている
このあとには、DevOpsや、継続的デリバリーが次のステップとしてあるかとは思う。
いやいや、これからは、生成AIがコード生成をする時代になったら、この世界はどうなるのであろうかと想う次第である
目次
はじめに
謝辞
増補改訂での更新点
コード例について
サポートページ
第1章 良いコードとは何か
1.1 良いコードの定義と価値
1.2 良いコードの定義
1.3 良いコードの価値
1.4 代表者の声
1.5 まとめ
第2章 良いコードを書くための5つの習慣
2.1 良いコードは1日にしてならず
2.2 習慣その1 読む ── コードを読んで読んで、読みまくれ!
Column:GitHubでコードの海を泳ぐ
2.3 習慣その2 書く ── とにかくコードを書こう
Column:1人でプログラムを書けますか?
2.4 習慣その3 道具を磨く ── 使う道具は常に磨いておこう
Column:良い道具に乗り換える
2.5 習慣その4 知る ── 良い知識を得よう
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:あるWebアプリケーションフレームワークでのクラス名の変遷
第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 ユーティリティクラスにまとめる
6.6 サービス層にまとめる
6.7 オブジェクトにまとめる
6.8 定数にまとめる
6.9 列挙型(enum)にまとめる
6.10 まとめ
Column:まとめすぎにご用心
第7章 データ構造
7.1
データ構造で勝負が決まる
7.2
代表者の声
良い仕事をしたい普通のプログラマー
達人プログラマーを目指す中級プログラマー
達人プログラマー
7.3
データ構造とは?
日付のデータ構造の例
年月日をそれぞれの値で保持する場合
年月日を配列で保持する場合
年月日をオブジェクトのプロパティとして保持する場合
複数のメールアドレスのデータ構造の例
すべてのメールアドレスを配列で保持する場合
メインとサブのメールアドレスを別のプロパティで保持する場合
7.4
データ構造の指針
仕様や制約が明確
処理するコードが書きやすい
パフォーマンスが劣化しにくい
7.5
お題 美容室の予約画面のHTMLを出力する
7.6
ステップ1 データベースのデータ構造をそのまま利用する
7.7
ステップ2 処理に最適なデータ構造を把握する
7.8
ステップ3 最適なデータ構造に変換して利用する
考察 データの変換処理とHTMLの出力処理を分ける
考察 効率的なデータ変換の方法
考察 クラスを使うとどうなる?
7.9
まとめ
Column:データ構造はどこにでも存在している
第8章 コードのパフォーマンス
8.1
パフォーマンスを意識していますか?
8.2 代表者の声
8.3 パフォーマンスは計算量で決まる
8.4 パフォーマンスチューニングの手順
8.5 アルゴリズムの選択以外のパフォーマンスチューニング
8.6 パフォーマンスチューニングの指針
8.7 まとめ
第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 まとめ
Column:言語別のテスティングフレームワーク
第10章 抽象化
10.1 抽象化がプログラミングのパワーを最大化する
10.2 配列/リストって何?
10.3 配列/リストを利用した抽象化とは?
10.4 代表者の声
10.5 お題 画像ファイルの一覧を表示するWebアプリケーション
10.6 ステップ1 ベタなコードで書いてみる
10.7 ステップ2 可読性を高めるためのメソッド抽出
10.8 ステップ3 関連するデータのデータ構造を整理
10.9 ステップ4 配列/リスト化して抽象化
10.10 抽象化の指針
10.11 まとめ
第11章 メタプログラミング
11.1 プログラミングをプログラミングする
11.2 代表者の声
11.3 メタプログラミングって何?
Column:流れるようなインタフェースとstaticインポートによる内部DSL
11.4 お題 Javaコードを使った内部DSL
11.5 ステップ1 ベタなコードで書いてみる
11.6 ステップ2 メタデータを内部DSLに移動する
11.7 ステップ3 変換ルールに対応する
11.8 まとめ
第12章 フレームワークを作ろう
12.1 フレームワークの動作原理を知る
12.2 代表者の声
12.3 お題 Webアプリケーションフレームワークを作ろう
12.4 ステップ1 素のサーブレットで書いてみる
12.5 ステップ2 フロントコントローラとアクションクラスの導入
12.6 ステップ3 ルーティング情報の外部ファイル化
Column:JavaのリフレクションAPI
12.7 ステップ4 よく使う処理を簡単に実行できるように共通化する
12.8 ステップ5 フレームワークをパッケージ化する
12.9 まとめ
付録A コードリーディングの方法
A.1 コードには動的な読み方と静的な読み方がある
A.2 お題 Apache Commons IOのコードを読む
A.3 ステップ1 対象のコードをダウンロード(チェックアウト)する
A.4 ステップ2 静的な方法でコードを読む
A.5 ステップ3 動的な方法でコードを読む
A.6 まとめ
付録B 解説付き参考文献
あとがき
索引
著者プロフィール
SBN:9784297120481
出版社:技術評論社
判型:A5
ページ数:264ページ
定価:2680円(本体)
2011年05月10日初版第1刷発行
2021年05月11日第2版第1刷発行
2022年07月28日第2版第2刷発行