AIがコードを生成できる時代に、人間のソフトウェア設計者はどのような役割を担うべきでしょうか。本書はその問いに対する一つの答えを提案します。
生成AIのコード生成能力は驚くべきものです。しかし、生成されたコードに対する最終的な責任は、それを利用した人間が負わなければなりません。したがって、AIが生成したコードの正しさを検証し、必要に応じて変更を要求できることが、これからのソフトウェア開発において人間に求められるきわめて重要な能力になります。
本書は、その基盤となるオブジェクト指向設計法として、EOD(Extended Object Diagram:拡張オブジェクト図)とNLUR(Natural Language Use-case Realization:自然言語によるユースケース実現)を中心に据えた設計法を紹介するものです。
(本書「はじめに」より)
【本書の特徴】
・メモリからの理解:値型、参照型、スタティック領域など、プログラムが動く際のメモリ挙動を図解。オブジェクト指向の抽象的な概念を、具体的なイメージに定着させます。
・独自の設計手法「EOD+NLUR」を解説:標準的なUMLだけでは捉えきれないオブジェクト間の動的なつながりを「拡張オブジェクト図(EOD)」で可視化し、「自然言語による設計(NLUR)」で論理構造を整理します。演習を通じ、誰もが「迷わない設計」を習得できます。本設計手法はUMLが抱えていた曖昧さを排除し、AIによるコード生成において間違えの発生しやすい推測フェーズを除去します。
・AIとの共同開発を実践:単にコードを書かせるのではなく、EOD/NLURという論理的な成果物を介してChatGPTと対話することで、設計品質を担保しながら開発を加速させる次世代のワークフローを紹介します。
https://www.ohmsha.co.jp/book/9784274235092/
正誤表やDLデータ等がある場合はこちらに掲載しています
Chapter1 オブジェクト指向の基礎
Chapter2 Unified Process(UP)の概要とユースケース駆動の分析・設計
Chapter3 格調オブジェクト図(EOD)と自然言語のユースケース実現(NLUR)による設計法
Chapter4 ChatGPTとの共同プログラム開発の実例
Reference
Appendix
Chapter1 オブジェクト指向の基礎
1.1 オブジェクトとクラス
1.2 オブジェクト指向プログラムのメモリ上での振舞い
1.2.1 オブジェクト指向プログラムの実行環境
1.2.2 値型変数と参照型変数
1.3 実行時のメモリイメージ
1.3.1 変数とオブジェクト
1.3.2 this 参照
1.3.3 new コンストラクタ演算
1.3.4 メモリイメージの描き方のまとめと演習(再帰呼出し)
1.3.5 オブジェクト指向プログラムの実行時のメモリイメージと拡張オブジェクト図
1.3.6 スタティックフィールド、スタティックメソッドとスタティック領域
1.4 クラスとオブジェクトのUML 表記
1.4.1 設計ステップのクラス図
1.4.2 設計ステップのオブジェクト図
1.4.3 分析ステップのクラス図とオブジェクト図
1.4.4 クラスの関連と多重度、およびオブジェクトのリンク
1.4.5 継承のクラス図およびオブジェクト図
1.5 オブジェクト指向プログラムの設計、生成プログラム、実行時動作の関係
1.5.1 「データ構造とアルゴリズム」とインスタンス図
1.5.2 EOD+NLUR による設計法の概要
1.6 C とオブジェクト指向プログラムのイメージ
1.7 実行時メモリイメージの演習問題の解答
Column
1 データ型の意味
2 オブジェクト指向の見える化
3 C とC++ のスピード
4 Polymorphism の使用とオブジェクト間の移動によるスピードの劣化
Chapter 2 Unified Process(UP)の概要とユースケース駆動の分析・設計
2.1 Unified Process(UP)とは
2.1.1 UP の三つの柱の概要
2.1.2 UP の書籍についての感想と次節からの構成
2.2 ユースケース駆動開発の概要
2.2.1 ユースケースモデル
2.2.2 ユースケース駆動
2.2.3 ユースケース駆動についての注意事項
2.3 アーキテクチャ中心
2.3.1 Key ユースケースとアーキテクチャ
2.3.2 アーキテクチャの構築
2.3.3 なぜアーキテクチャの構築が必要なのか
2.3.4 アーキテクトとその位置づけ
2.4 繰返しと漸進的プロセス
2.4.1 小さいステップでの開発
2.4.2 UP のライフサイクル
1 初動(Inception)フェーズ
2 精緻化(Elaboration)フェーズ
3 構築(Construction)フェーズ
4 実働環境への移行(Transition)フェーズ
2.4.3 UP の繰返し開発のまとめ
1 アーキテクチャおよびアーキテクトに焦点を当てた繰返し開発
2 UP の繰返し開発の本質
2.5 ユースケース駆動における分析と設計
2.5.1 分 析
1 分析モデルの概要
2 ソフトウェアのライフサイクル内での分析モデルの役割
3 分析クラスのステレオタイプ
1 ユースケース実現ごとにつくるコントロールクラス
2 バウンダリクラスについての注意事項(バウンダリかコントロールか)
3 バウンダリクラスの決め
4 分析クラスのステレオタイプについての注意
4 分析ステップのクラス図とオブジェクト図
5 分析ステップのユースケース実現
6 分析ステップの作業
7 分析ステップでのクラスのフィールドと関連の決め方
2.5.2 設 計
1 分設計モデルの概要
2 設計成果物と作業
3 その他の設計成果物
Column
1 Rumbaugh のオブジェクト指向分析法
2 アーキテクトの例
3 まずは動くコードを作成する
4 アーキテクトがいることの利点
5 要求定義におけるアーキテクトの役割
Chapter 3 拡張オブジェクト図と自然言語によるユースケース実現に基づく設計法
3.1 演習問題の紹介:缶自動販売機
3.1.1 顧客からの要求
3.1.2 顧客が提供するデバイスドライバ
1 入出力デバイスドライバ
2 デバイスドライバのクラス図
3 デバイスドライバクラスの制約
3.2 ユースケースの記述法
3.2.1 解 説
1 詳細なユースケースの文書化
3.2.2 演習問題: ユースケースの記述
1 缶自動販売機のユースケースの種類の決定
2 缶自動販売機のユースケース
3.3 分 析
3.3.1 解説:分析クラスの三つのステレオタイプ
3.3.2 演習問題:自動販売機のエンティティクラスの拾い出し
3.4 設 計
3.4.1 解 説
1 拡張オブジェクト図(EOD)
1 EOD の五つのルール
2 EOD による設計法
3 EOD を複数作成するケース
4 UP のオブジェクト図をEOD に拡張する必要があった理由
2 自然言語によるユースケース実現(NLUR)
1 UP のイベントフローとNLUR の違い
2 自然言語によるユースケース実現(NLUR)の詳細
3 EOD+NLUR 設計法についての補足
1 NLUR の構築をクラス図ではなくEOD で行う理由
2 単に動作する設計と良い設計
3 NLUR の記録法
4 EOD によるプログラムの見える化
4 EOD+NLUR 設計法のまとめ
3.4.2 演習問題: 缶自動販売機の設計
1 設計1
2 設計2
3 設計3
4 缶自動販売機の最終設計
1 缶自動販売機のNLUR
2 缶自動販売機のシーケンス図
3 缶自動販売機の最終クラス図
3.5 実 装
3.5.1 バウンダリクラスと双方向リンクの実装
3.5.2 缶自動販売機のコード
3.6 良くない設計例
3.6.1 あり得ない関連
3.6.2 多重度の記入がないクラス図
3.6.3 不要なコントロールクラス
3.7 オブジェクト指向設計における迷信
3.7.1 UML の仕様に完全に従ってモデルを書くな
3.7.2 エンティティクラスに振舞いを入れない設計の否定
3.7.3 コントロールクラス/ オブジェクトの使いすぎの否定
3.7.4 設計におけるプログラマの役割
3.7.5 関連・リンクによるループについて
Column
1 不要なコントロールクラスの問題
Chapter 4 ChatGPTとの共同プログラム開発の実例
4.1 ChatGPT とのプログラムの共同開発
4.1.1 ChatGPT との共同作業の必要性
4.1.2 ChatGPT との共同作業における共有情報
4.1.3 ChatGPT との共同作業の実験結果から知り得たこと
4.1.4 ChatGPT との共同作業におけるEOD+NLUR の設計法の位置付け
4.1.5 ChatGPT との対話から得られたEOD+NLUR 設計法に対する示唆
4.1.6 本設計法における人間とChatGPT の役割分担
1 概 要
2 要求仕様の作成ステップ
3 分析・設計ステップ
4 実装ステップ
4.2 演習問題:Domestic Telephone System(DTS)
4.2.1 DTS のインフォーマルな仕様
4.2.2 DTS のユースケース
4.2.3 DTS の分析・設計
1 DTS の分析:ユースケースからのフィールドおよびクラスの拾い出し
2 DTS の設計
1 DTS の設計:最初のハードル
2 DTS の設計:第2 のハードル
3 DTS の設計:細部の詰め
4 DTS の設計:Polymorphism の使用
5 DTS の設計:TelephoneNumber クラスの導入
6 DTS の設計:最後の詰め(CallLog のオブジェクトの管理)
7 DTS の設計:最終版
4.2.4 実 装
1 バウンダリサブシステム
2 実装コード
4.3 ChatGPT とのDTS の共同開発の実例
4.3.1 ユースケースの共同開発
1 概 要
2 第1 回目のやり取り
3 第2 回目のやり取り
4 第3 回目のやり取り
4.3.2 設計の共同作業
1 ChatGPT のDTS の設計
1 最初の設計
2 currentResident およびworkingResident について
3 Controller をなくす方向の議論
4 多重度の問題
5 禁止番号の設計とPolymorphism
6 password を独立エンティティにする
7 CallLog の生成タイミングと一時ポインタ
8 TelephoneNumber クラスの導入
9 クラス名とフィールド名の変換
10 完全版 EOD+多重度付きクラス図
2 補足:缶自動販売機でのNLUR の変更要求の例
4.3.3 実装の共同作業
1 ChatGPT の生成コード(バージョン1)と改善策の協議
2 ChatGPT の生成コード(バージョン2)と改善策の協議
3 ChatGPT の生成コード(最終版)
4.4 ChatGPT との共同作業を通して得られた結論
Appendix
A.1 クラス図とEOD のテキストによる記述法
A.1.1 テキストによるクラス図の記述ルール
1 関連以外のクラス定義
2 関連の定義
3 缶自動販売機・設計3 クラス図の例
A.1.2 テキストによるEOD の記述ルール
1 EOD 記述ルールの概要
2 インスタンスの定義
3 コレクションとGroup 定義(タイプ定義)
1 コレクションの定義
2 Group の定義
4 リンクの定義
A.1.3 EOD 記述の例
1 缶自動販売機・設計3 のEOD 記述
2 DTS のEOD 記述
A.2 ChatGPT が生成したDTS のユースケース(最終版)
A.3 ChatGPT が生成したDTS のNLUR(バージョン1)
Reference
Index