本書は、ソフトウェアを設計する上で大切な39のガイドラインを提示し、広く認知されている重要な設計原則の真意を解説し、テスト/保守/拡張/再利用に優れたソフトウェアアーキテクチャを示します。長年にわたりその価値を実証して来た古典的デザインパターンを応用/発展させ、さらにその後に生まれた新しいデザインパターンとともに、Modern C++での活用方法を解説します。
C++ソフトウェア設計
―高品質設計の原則とデザインパターン
Klaus Iglberger 著、千住 治郎 訳
- TOPICS
- Programming , C/C++
- 発行年月日
- 2023年10月
- PRINT LENGTH
- 408
- ISBN
- 978-4-8144-0045-4
- 原書
- C++ Software Design
- FORMAT
- Print PDF EPUB
目次
まえがき
本書の動機
本書の内容
ソフトウェア設計
Modern C++
デザインパターン
想定する読者
本書の構成
本書が用いる表記
サンプルコードの利用
オライリー学習プラットフォーム
連絡先
謝辞
1章 ソフトウェア設計の技
ガイドライン1:ソフトウェア設計の重要性を理解する
言語機能をソフトウェア設計とは捉えない
ソフトウェア設計:依存関係管理と抽象化の技
ソフトウェア開発の3レベル
言語機能ばかりを注視しない
ソフトウェア設計と設計原則に注力
ガイドライン2:将来の変更に備え設計する
関心の分離
人工的な関係性の例
論理的関係性と物理的関係性
DRY原則
時期尚早な関心の分離
ガイドライン3:インタフェースを分離し人工的関係性を排除する
インタフェースを分離し関心の分離を図る
テンプレート引数の要件は最小限に
ガイドライン4:テスト可用性に備え設計する
privateメンバ関数のテスト方法
真の解:関心の分離
ガイドライン5:拡張に備え設計する
開放/閉鎖原則
コンパイル時拡張性
拡張を優先した時期尚早な設計
2章 抽象化の技
ガイドライン6:抽象化から期待される動作に従う
期待される動作に従わない例
リスコフの置換原則
リスコフの置換原則に対する批判
明確で意義ある抽象化の必要性
ガイドライン7:基底クラスとコンセプトの共通性を把握する
ガイドライン8:オーバロードセットの意味的要件を理解する
フリー関数の威力:コンパイル時抽象化
フリー関数の問題点:動作に対する期待
ガイドライン9:抽象化の所有権に注意する
依存関係逆転の原則
プラグインアーキテクチャの依存関係逆転
テンプレートを介した依存関係逆転
オーバロードセットを介した依存関係逆転
依存関係逆転の原則と単一責任の原則
ガイドライン10:アーキテクチャの文書化を検討する
3章 デザインパターンの目的
ガイドライン11:デザインパターンの目的を把握する
デザインパターンは名前を持つ
デザインパターンは目的を表す
デザインパターンは抽象化を導入する
デザインパターンは検証が済んでいる
ガイドライン12:デザインパターンを誤解してはいけない
デザインパターンは最終目的ではない
デザインパターンは実装詳細に関するものではない
デザインパターンはオブジェクト指向プログラミングにも動的多態性にも限定されない
ガイドライン13:デザインパターンはどこにもある
ガイドライン14:デザインパターン名を用い目的を伝える
4章 Visitorパターン
ガイドライン15:型または処理の追加に備え設計する
手続き型プログラミングの解
オブジェクト指向の解
動的多態性の設計上の判断には要注意
ガイドライン16:処理セットを拡張するにはVisitorパターン
設計の問題点を分析
解明Visitorパターン
Visitorパターンの短所を分析
ガイドライン17:Visitorパターンの実装にはstd::variantを検討する
std::variantの紹介
図形描画を値ベースで干渉しない解にリファクタリング
性能ベンチマーク
std::variantの解の短所を分析
ガイドライン18:Acyclic Visitorの性能を把握する
5章 StrategyパターンとCommandパターン
ガイドライン19:処理方法を分離するにはStrategyパターン
設計の問題点を分析
解明Strategyパターン
良くない実装例の短所を分析
VisitorパターンとStrategyパターンの比較
Strategyパターンの短所を分析
ポリシベースの設計
ガイドライン20:継承よりコンポジションを優先する
ガイドライン21:処理対象を分離するにはCommandパターン
解明Commandパターン
CommandパターンとStrategyパターン
Commandパターンの短所を分析
ガイドライン22:参照セマンティクスより値セマンティクスを優先する
GoFスタイルの短所:参照セマンティクス
参照セマンティクス:もう1つの例
Modern C++の考え方:値セマンティクス
値セマンティクス:もう1つの例
デザインパターンの実装には値セマンティクスを優先
ガイドライン23:StrategyパターンとCommandパターンの実装には値ベースを優先する
std::functionの紹介
図形描画をリファクタリング
性能ベンチマーク
std::functionの解の短所を分析
6章 Adapterパターン、Observerパターン、CRTPパターン
ガイドライン24:インタフェースを統一するにはAdapterパターン
解明Adapterパターン
オブジェクトアダプタとクラスアダプタ
標準ライブラリでの実例
AdapterパターンとStrategyパターンの比較
関数アダプタ
Adapterパターンの短所を分析
ガイドライン25:通知を抽象化するにはObserverパターン
解明Observerパターン
Observerパターンの古典的実装
値セマンティクスベースのObserverパターン実装
Observerパターンの短所を分析
ガイドライン26:型を静的に区別するにはCRTPパターン
CRTPパターンが生まれた背景
解明CRTPパターン
CRTPパターンの短所を分析
CRTPの今後:CRTPとC++20コンセプトの比較
ガイドライン27:静的mixinクラスにはCRTPパターン
強い型付け
実装パターンとしてのCRTPパターン
7章 Bridgeパターン、Prototypeパターン、External Polymorphismパターン
ガイドライン28:物理的依存関係を排除するにはBridgeパターン
問題点の例
解明Bridgeパターン
Pimplイディオム
BridgeパターンとStrategyパターンの比較
Bridgeパターンの短所を分析
ガイドライン29:Bridgeパターンの性能向上
/低下には要注意
Bridgeパターンが性能に及ぼす影響
部分Bridgeパターンによる性能向上
ガイドライン30:コピー演算を抽象化するにはPrototypeパターン
羊もどきの例:Animalのコピー
解明Prototypeパターン
Prototypeパターンとstd::variantの比較
Prototypeパターンの短所を分析
ガイドライン31:干渉しない実行時多態を実現するにはExternal Polymorphismパターン
解明External Polymorphismパターン
図形描画再び
External PolymorphismパターンとAdapterパターンの比較
External Polymorphismパターンの短所を分析
8章 Type Erasureパターン
ガイドライン32:Type Erasureパターンで継承階層の置換を検討する
Type Erasureの歴史
解明Type Erasureパターン
所有権を持つType Erasureパターンの実装
Type Erasureパターンの短所を分析
Type Erasureラッパクラスの等価演算
Type Erasureラッパクラスのインタフェース分離
性能ベンチマーク
用語について一言
ガイドライン33:Type Erasureパターンの最適化の余地を認識する
小さいバッファの最適化
仮想関数ディスパッチの手動実装
ガイドライン34:所有権を持つType Erasureラッパクラスのセットアップコストを意識する
所有権を持つType Erasureラッパクラスのセットアップコスト
所有権を持たない単純Type Erasureパターン実装
所有権を持たないType Erasureパターン実装を強化
9章 Decoratorパターン
ガイドライン35:カスタマイズを階層化するにはDecoratorパターン
同僚の設計が抱える問題点
解明Decoratorパターン
Decoratorパターンの古典的実装
Decoratorパターンの例その2
Decorator、Adapter、Strategyの比較
Decoratorパターンの短所を分析
ガイドライン36:実行時抽象化とコンパイル時抽象化間のトレードオフを理解する
値ベースのコンパイル時Decoratorパターン
値ベースの実行時Decoratorパターン
10章 Singletonパターン
ガイドライン37:Singletonパターンはデザインパターンではなく実装パターンとみなす
解明Singletonパターン
Singletonパターンは依存関係を管理も軽減もしない
ガイドライン38:Singletonパターンに変更しやすさとテスト可用性を設計する
Singletonパターンはグローバルな状態を表現する
Singletonパターンは変更しやすさとテスト可用性を阻害する
Singletonパターンの依存関係逆転
Strategyパターンの適用
ローカルな依存オブジェクト注入へ向けて前進
11章 最後のガイドライン
ガイドライン39:デザインパターンの習得は継続すること
索引