C++ソフトウェア設計

―高品質設計の原則とデザインパターン

[cover photo]
TOPICS
Programming , C/C++
発行年月日
PRINT LENGTH
408
ISBN
978-4-8144-0045-4
原書
C++ Software Design
FORMAT
Print PDF EPUB
Ebook
4,400円
Ebookを購入する
Print
4,400円

本書は、ソフトウェアを設計する上で大切な39のガイドラインを提示し、広く認知されている重要な設計原則の真意を解説し、テスト/保守/拡張/再利用に優れたソフトウェアアーキテクチャを示します。長年にわたりその価値を実証して来た古典的デザインパターンを応用/発展させ、さらにその後に生まれた新しいデザインパターンとともに、Modern C++での活用方法を解説します。

目次

まえがき
    本書の動機 
    本書の内容 
    ソフトウェア設計 
    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:デザインパターンの習得は継続すること 

索引