本書は、ソフトウェアを設計する上で大切な39のガイドラインを提示し、広く認知されている重要な設計原則の真意を解説し、テスト/保守/拡張/再利用に優れたソフトウェアアーキテクチャを示します。長年にわたりその価値を実証して来た古典的デザインパターンを応用/発展させ、さらにその後に生まれた新しいデザインパターンとともに、Modern C++での活用方法を解説します。
C++ソフトウェア設計
―高品質設計の原則とデザインパターン
Klaus Iglberger 著、千住 治郎 訳
![[cover photo]](https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0045-4.jpeg)
- 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:デザインパターンの習得は継続すること 索引