
関連サイト
本書の関連ページが用意されています。
内容紹介
『Five Lines of Code — How and When to Refactor —』(Christian Clausen著、MANNING刊)の日本語版。
リファクタリングはソフトウェア開発やプログラミングの世界においてコードの品質向上や保守性の確保のために重要です。何をリファクタリングすべきかは、問題の兆候を示す「コードの臭い」で説明されてきましたが、この概念は抽象的で、経験の浅いプログラマーには理解しづらいものでした。
本書では、「メソッドを5行以内で実装する」といった明確なルールを用いてリファクタリングを行うテクニックをステップバイステップで解説します。ルールの解説後には、そのルールの元となった「コードの臭い」についても説明されており、効率的に「コードの臭い」への感覚も養うことができます。
第1部では、GitHubで公開されている2Dパズルゲームのコードを主要な題材としてリファクタリングのプロセスを示しながら、適用するルールやパターンを解説します。
第2部では、チームでの開発にも焦点を当て、ルールとリファクタリングパターンを実務でどう活用するかを掘り下げます。コンパイラの機能の活用や、コメントを極力書かないようにするためのコツ、価値あるコメントの見極め方、コードの安全な削除/追加方法、将来的なリファクタリングで見落とされないように悪いコードをさらに悪く見えるようにして品質レベルを明確にするテクニックなど、実践で役立つトピックを広範に扱っています。
<本書で学べること>
悪いコードの兆候
コードを完全に理解していなくても安全に改善する方法
コードの最適化と汎用化のバランス
適用すべきリファクタリングパターン
リファクタリングのタイミング
など
書誌情報
- 著者: Christian Clausen(著), 松田晃一(訳)
- 発行日: 2025-05-27
- 最終更新日: 2025-05-27
- バージョン: 1.0.0
- ページ数: 384ページ(PDF換算)
- 対応フォーマット: PDF
- 出版社: マイナビ出版
対象読者
著者について
Christian Clausen

コンピュータサイエンスの修士号を持ち、専門は、プログラミング言語、特に、ソフトウェアの品質とバグのないコードの書き方。ソフトウェア品質に関する査読付き論文を2本共同で執筆し、権威ある学術誌やカンファレンスで再録された。また、パリの研究グループ用のCoccinelleというプロジェクトでソフトウェアエンジニアとして働いた経験があり、2つの大学でオブジェクト指向および関数型プログラミング言語の基礎から応用までを教えた経歴を持ち、5年間にわたりコンサルタントおよび技術責任者として働いている。
松田晃一

博士(工学、東京大学)。石川県羽咋市生まれ。『宇宙船ビーグル号の冒険』を読み、絵描きではなくコンピュータの道へ。海(海水浴)と温泉を好む。HCI/AR/VR/UX、画像処理・認識、機械学習、エッセーの執筆、技術書、SF、一般書の翻訳などに興味を持つ。最近立ち上げたPython の講義が(自分では)結構良く構成でき、再構成し書籍化を考えているPAW^2(メタバース)の開発に携わり、オープンソースのm3py ライブラリの開発を行っている。著書に『Python ライブラリの使い方~ GUI から機械学習プログラミングまで』、『p5.js プログラミングガイド改訂版』(カットシステム)、『学生のためのPython』(東京電機大学出版局)、『WebGL Programming Guide』(Addison-Welsley Professional)など、訳書に『Web API デザイン・パターン』、『機械学習エンジニアリング』、『プログラミングのための数学』、『データサイエンティストのための特徴量エンジニアリング』、『解釈可能なAI』(マイナビ出版)、『生成 Deep Learning 第2版』、『詳解OpenCV3』、『コンピュータビジョンのための実践機械学習』(オライリー・ジャパン)、『デザインのためのデザイン』(ピアソン桐原)などがある。
目次
第1章 リファクタリングをリファクタリングする
- 1.1 リファクタリングとは何か?
- 1.2 スキル:何をリファクタリングすべきか?
- 1.3 組織文化: いつリファクタリングを行うべきか?
- 1.4 ツール:安全にリファクタリングする手段
- 1.5 本書を読むのに必要なツール
- 1.6 本書で用いる例:2Dパズルゲーム
- 1.7 実際のソフトウェアに関する注意
- 1.8 まとめ
第2章 リファクタリングの裏側を見る
- 2.1 可読性と保守性を向上する
- 2.2 スピード、柔軟性、安定性の獲得
- 2.3 リファクタリングと日常業務
- 2.4 ソフトウェアにおける「ドメイン」を定義する
- 2.5 まとめ
第1部 コンピュータゲームでリファクタリングを学ぶ
第3章 長い関数を分割する
- 3.1 最初のルールを決める: なぜ5行なのか?
- 3.2 関数を分割するためのリファクタリングパターンを導入する
- 3.3 関数を分割して抽象化のバランスを取る
- 3.4 適切な関数名の特性
- 3.5 たくさんのことをやりすぎている関数を分割する
- 3.6 まとめ
第4章 タイプコードを機能させる
- 4.1 単純な if 文をリファクタリングする
- 4.2 大規模なif 文をリファクタリングする
- 4.3 コードの重複に対処する
- 4.4 複雑なifの組をリファクタリングする
- 4.5 不要なコードを削除する
- 4.6 まとめ
第5章 類似したコードをまとめて1つにする
- 5.1 類似したクラスをまとめる
- 5.2 条件分岐をまとめる
- 5.3 複雑な条件をまとめる
- 5.4 クラス間でコードをまとめる
- 5.5 類似した関数をまとめる
- 5.6 類似したコードをまとめる
- 5.7 まとめ
第6章 データを守る
- 6.1 ゲッターなしでカプセル化する
- 6.2 単純なデータをカプセル化する
- 6.3 複雑なデータをカプセル化する
- 6.4 順序制約をなくす
- 6.5 別の方法で列挙型をなくす
- 6.6 まとめ
第2部 学んだことを実務に取り入れる
第7章 コンパイラと協調する
- 7.1 コンパイラを知る
- 7.2 コンパイラを活用する
- 7.3 コンパイラを信頼する
- 7.4 コンパイラだけを信じること
- 7.5 まとめ
第8章 コメントに近づかない
- 8.1 古くなったコメントを削除する
- 8.2 コメントアウトされたコードを削除する
- 8.3 無意味なコメントを削除する
- 8.4 コメントをメソッド名にする
- 8.5 不変条件を書いたコメントは残す
- 8.6 まとめ
第9章 コードを積極的に削除する
- 9.1 コードの削除が次のフロンティアになるかもしれない
- 9.2 コードを削除し偶発的な複雑さをなくす
- 9.3 親密度をもとにコードを分類する
- 9.4 レガシーシステムのコードを削除する
- 9.5 中断されたプロジェクトからコードを削除する
- 9.6 バージョン管理システムからブランチを削除する
- 9.7 コードのドキュメントを削除する
- 9.8 テストコードを削除する
- 9.9 設定コードを削除する
- 9.10 ライブラリを破棄するためにコードを削除する
- 9.11 動いている機能からコードを削除する
- 9.12 まとめ
第10章 恐れずにコードを追加する
- 10.1 不確実性を受け入れる:あえて危険に飛び込む
- 10.2 スパイクを使って、間違ったのものを作ってしまうことへの不安を克服する
- 10.3 割合を固定し、無駄やリスクへの恐れを克服する
- 10.4 徐々に改善していくことで不完全さの恐怖を克服する
- 10.5 コピー&ペーストが変更速度にどのような影響を与えるか?
- 10.6 拡張性を用いた追加による変更
- 10.7 追加による変更は後方互換性を可能にする
- 10.8 機能トグルを用いた追加による変更
- 10.9 抽象化による分岐を用いた追加による変更
- 10.10 まとめ
第11章 コード内の構造に従う
- 11.1 スコープと起源で構造を分類する
- 11.2 コードに動作を反映させる3つの方法
- 11.3 コードの追加で構造を明確にする
- 11.4 予測するのではなく観察し、経験的手法を用いる
- 11.5 コードを理解せずに安全性を確保する
- 11.6 構造を見つけ出す
- 11.7 まとめ
第12章 最適化と汎用性を避ける
- 12.1 シンプルさを追求する
- 12.2 いつ、どのように汎用化するか
- 12.3 いつ、どのように最適化するか?
- 12.4 まとめ
第13章 悪いコードを悪く見せる
- 13.1 悪いコードでプロセス上の問題を知らせる
- 13.2 クリーンなコードとレガシーコードを分離する
- 13.3 悪いコードを定義する方法
- 13.4 コードを安全に改悪するためのルール
- 13.5 コードを安全に悪くする方法
- 13.6 まとめ
第14章 本書を終えるにあたって
- 14.1 本書で学んだことを振り返る
- 14.2 根底にある考え方を探る
- 14.3 今後の進め方
- 14.4 まとめ
Appendix 巻末付録 第1部のためのツールのインストール
- A.1 Node.js
- A.2 TypeScript
- A.3 Visual Studio Code
- A.4 Git
- A.5 TypeScript プロジェクトをセットアップする
- A.6 TypeScript プロジェクトをビルドする
- A.7 レベルの変更方法