『ジェネレーティブプログラミング』
https://images-na.ssl-images-amazon.com/images/I/51hyrUK6z2L.jpg https://www.amazon.co.jp/dp/479811331X/
全く新しい形のプログラミングの本が出版されたならば、1つの質問が提起されるのが常である。すなわち、「歴史的に見ればその本はどこに位置づけられることになるのだろうか」という問いである。しかし、ある1冊の本がこのような質問を喚起するということ自体が、何かわくわくするもの、パラダイムシフトに関することや、新しいアイディアや、古い方法を打破する何かであることを示しているのだといえるのだろう。
James Coplienによる序文がとてもいきいきしている。この序文でコプリエンは、これまでのソフトウェア工学の研究は未だ断片的な成果しか得られていなかったが、この書はそれら断片が統合的な視点によってまとめられているはじめての本だとしている。 本書は単なるテクニックのコレクションではない。断片を互いに結びつける原則を統合するにあたり、強力なテーマを開拓したものになっており、その中でも最も顕著なのがドメイン工学とメタプログラミングを統合しようというテーマである。 本書の目的について、著者は「ジェネレーティブプログラミングは、ソフトウェア製品を既製コンポーネントから流れ作業的に完成させることを目的としています」と述べている(p.1)。著者は、現在のコンポーネントベースのソフトウェア工学の状況を、完成した自動車を購入するのではなく必要部品を購入して組み立てる過程になぞらえている。部品によっては微調整が必要となり、いまだハンドクラフトの状況を脱していないと評価する。自動車産業においては、上記の状況を脱したのは「生産ライン」の導入による大量生産方式の確立である。本書は、ソフトウェア工学に生産ラインを導入するために、既存のソフトウェア工学のアイデアを再配置しなおしている。
目次
第1章 本書について
1.1 ハンドクラフトから大量生産へ
1.2 ジェネレーティブプログラミング
1.3 利点と応用法
第1部 分析、設計モデル、技法
第2章 ドメイン工学
2.1 この章を読むべき理由
2.2 ドメイン工学とは
2.3 ドメイン分析
2.4 ドメイン設計とドメイン実装
2.5 アプリケーション工学
2.6 プロダクトラインの実践
2.7 ドメイン工学の主概念
2.8 ドメイン分析とドメイン工学方法論の傾向
2.9 ドメイン工学と関連するアプローチ
2.10 これまでの経緯
2.11 まとめ
第3章 ドメイン工学とオブジェクト指向分析・設計
3.1 この章を読むべき理由
3.2 オブジェクト指向技術と再利用
3.3 ドメイン工学とオブジェクト指向分析・設計手法(OOA/D)との関係
3.4 ドメイン工学とOOA/Dの統合におけるアスペクト
3.5 水平な手法と垂直な手法
3.6 手法の選択
第4章 フィーチャモデリング
4.1 この章の読むべき理由
4.2 フィーチャについてのおさらい
4.3 フィーチャモデリング
4.4 フィーチャモデル
4.5 フィーチャ図と他のモデル表現、実装技術の関係
4.6 制約の実装
4.7 フィーチャモデルのためのツール支援
4.8 フィーチャ図に関するよくある質問
4.9 フィーチャモデリングの手順
第5章 ジェネレーティブプログラミングのプロセス
5.1 この章を読むべき理由
5.2 ジェネレーティブドメインモデル
5.3 ジェネレーティブプログラミングの主な開発工程
5.4 ジェネレーティブプログラミング向けドメイン工学手法の適用
5.5 ドメイン固有言語
5.6 DEMRAL:ジェネレーティブプログラミングのためのドメイン工学手法の例
5.7 DEMRALの概要
5.8 ドメイン分析
5.9 ドメイン設計
5.10 ドメイン実装
第2部 実装技術
第6章 ジェネリックプログラミング
6.1 この章を読むべき理由
6.2 ジェネリックプログラミングとは何か?
6.3 ジェネリックプログラミングとジェネレーティブプログラミング
6.4 ジェネリックパラメータ
6.5 パラメータによる多態と継承による多態
6.6 閉じた多態と閉じていない多態
6.7 いまどきの多態
6.8 パラメータ化されたコンポーネント
6.9 パラメータ化プログラミング
6.10 C++標準テンプレートライブラリ
6.11 ジェネリック方法論
6.12 歴史的な背景
第7章 テンプレートによるコンポーネント指向のC++プログラミングテクニック
7.1 この章を読むべき理由
7.2 システム構成の種類
7.3 C++による動的な構成のサポート
7.4 C++による静的な構成のサポート
7.5 特定のテンプレートのインスタンス化を禁止
7.6 静的なパラメータ化と動的なパラメータ化
7.7 パラメータ化した継承によるラッパ
7.8 パラメータ化した継承によるテンプレートメソッド
7.9 バインディングモードのパラメータ化
7.10 多数のコンポーネントを一律にパラメータ化
7.11 コンポーネント間の静的な相互利用
8.1 この章を読むべき理由
8.2 アスペクト指向プログラミングとは何か?
8.3 アスペクト指向的なデコンポジションヘのアプローチ
8.3.2 コンポジションフィルタ
8.3.4 アスペクト指向でコンポジションとドメイン工学
8.4 アスペクトの現れ方
8.5 コンポジションのメカニズム
8.6 プログラミング言語におけるアスペクトの表現方法
8.7 アスペクト指向プログラミングの実装技術
8.8 最後に
第9章 ジェネレータ
9.1 この章を読むべき理由
9.2 ジェネレータとは何か?
9.3 ソフトウェア開発の変形モデル
9.4 ジェネレータを開発する技術
9.5 組み立てジェネレータと変形ジェネレータ
9.6 変形の種類
9.7 変形システム
9.8 生成のために選択されたアプローチ
第10章 C++による静的なメタプログラミング
10.1 この章を読むべき理由
10.2 メタプログラミングとは何か?
10.3 メタプログラミングへの誘い
10.4 静的なメタプログラミング
10.5 2つのレベルを持つ言語としてのC++
10.6 静的なレベルの機能的な持ち味
10.7 テンプレートメタプログラミング
10.8 テンプレートメタ関数
10.9 他のメタ関数への引数と返り値としてのメタ関数
10.10 メタ情報の表現
10.11 コンパイル時の制御構造
10.12 コード生成
10.13 例:静的な繰り返し処理によるメタ関数のテスト
10.14 C++における部分評価
10.15 部分的な特殊化の回避方法
10.16 テンプレートメタプログラミングの問題
10.17 歴史的な背景
11.1 この章を読むべき理由
11.2 インテンショナルプログラミングとは何か?
11.3 IPの背景にある技術
11.4 IPプログラミング環境での作業
11.5 高度な話題
11.6 IPの背後にある哲学
11.7 まとめ
第3部 応用事例
第12章 リストコンテナ
12.1 この章を読むべき理由
12.2 概要
12.3 ドメイン分析
12.4 ドメイン設計
12.5 実装コンポーネント
12.6 人手による組み立て
12.7 リストの指定
12.8 ジェネレータ
12.9 拡張
第13章 銀行口座
13.1 この章を読むべき理由
13.2 幸運なプログラミングの現場
13.3 デザインパターン、フレームワーク、コンポーネント
13.4 ドメイン工学とジェネレーティブプログラミング
13.5 フィーチャモデリング
13.6 アーキテクチャ設計
13.7 実装コンポーネント
13.8 コンフィギュレーション可能なクラスの階層
13.9 ドメイン固有言語の設計
13.10 銀行口座ジェネレータ
13.11 ジェネレータとその生成物のテスト
第14章 ジェネレーティブ行列計算ライブラリ(GMCL)
14.1 この章を読むべき理由
14.2 なぜ行列計算を取り上げるのか?
14.3 ドメイン分析
14.4 ドメイン設計と実装
付録
付録 A 概念モデリング
A.1 概念とは何か?
A.2 概念に関する理論
A.3 概念に関する重要な話題
A.4 概念モデリング、オブジェクト指向、そしてソフトウェア再利用
付録 B Smalltalkのインスタンス個別拡張プロトコル
付録 C Smalltalkにおいてリスナオブジェクトを割り当てるプロトコル
付録 D 行列計算の用語集
付録 E 依存表評価のためのメタ関数
ジェネレーティブプログラミング用語集
参考文献