🔖

書籍「組込みソフトウェア開発のためのオブジェクト指向モデリング」は組込み以外の人にもOOPを学ぶ上でお勧めできる本だった。

2022/10/02に公開

レビュー対象

タイトル:組込みソフトウェア開発のためのオブジェクト指向モデリング 要件定義/分析/設計からソースコード作成まで オブジェクト指向ソフトウェア開発の基本を学ぶ
著:SESSAME WG2
出版社:翔泳社
出版年:2006年初版、2007年初版第2刷

概要

  • オブジェクト指向(OOP)の必要性から説明されている。
  • 「話題沸騰ポット」という仮想製品を作るという題材で、上流である要求モデリングから、分析してクラスを抽出し、どう設計するかという一連の流れについて説明されている。
  • モデリングでは、UMLとしてユースケース図、クラス図、シーケンス図、パッケージ図、コミュニケーション図を使用し、状態遷移図・状態遷移表等も使用する。
  • 言語はC++だが、OOPに対応している言語を使用していれば、内容はほぼ応用できる。
  • 要求モデリングでは、ユースケース図の書き方、ユースケース記述やイベントリスト等の説明がある。更に、非機能要件についても言及がある。
  • 分析モデリングでは、要求モデリングで作成したアウトプットを元に、クラス候補を抽出する方法を少しずつ丁寧に説明している。責務抽出法や名詞句抽出法等でクラス候補を抽出する。更に、組込みでは避けられない状態遷移について、状態遷移図や状態遷移表を使ってモデル化する。少しずつモデルを改良していくため、一連の流れを体感できる。
  • 設計モデリングでは、分析モデリングのアウトプットを元に、「関心事の分離」を実現するようにうまく設計していく流れを説明している。継承インターフェイスを最小化するように、クラス構造を見直していく。ドメインを分析し、システム全体をパッケージに分割していき、独立した開発単位を決定する流れの説明もある。メモリ構造やメモリリークについての言及もしている。
  • クラスの品質を高めるために、クラスサイズを適正化して、データや振る舞いを隠蔽し、単一の目的に特化させることで凝集度を高める必要性を述べている。更に、クラス間の品質を高めるために、結合度を低くして蘇結合とする必要性、更にファンイン(何個のモジュールから呼び出されるか)/ファンアウト(何個のモジュールを呼び出しているか)という尺度の説明あり。ファンアウトは7±2位内にできるだけ収めることが良い設計に繋がる。
  • モデリングの失敗事例としては、機能分割、もの依存、過度な詳細、過度な抽象、クラス過多、くもの巣が説明されている。

総評

  • 組込みエンジニアには万人におすすめできる内容。
  • 組込み以外のエンジニアでも、オブジェクト指向におけるモデリングについて学びたい人には大いに学びのある内容。
  • 古い本ではあるが、内容は褪せていない。要求をどうモデリングし、それをどうクラスに落とし込んで設計していくかといった基本の流れを学ぶのにちょうど良い。
  • どのように要求からクラスを作っていくか、という部分を詳しく説明しているため、参考になった。

目次

Chapter 1 はじめに

1-1 本書について
  1-1-1 本書の適用範囲
  1-1-2 オブジェクト指向で大規模化かつ短納期化に対処する
  1-1-3 モデリング中心
  1-1-4 具体的な事例
1-2 本書の活用方法
  1-2-1 本書の読み進め方
1-3 モデリングツールの活用
  1-3-1 ユースケース図
  1-3-2 イベントリスト
  1-3-3 クラス図
  1-3-4 コミュニケーション図
  1-3-5 状態遷移図
  1-3-6 状態遷移表
  1-3-7 シーケンス図
  1-3-8 パッケージ図
1-4 大規模な組込みソフトウェア開発
  1-4-1 大規模組込みソフトウェアの特徴
  1-4-2 ソフトウェア開発工程とモデリング
  1-4-3 モデリングの効用

Chapter 2 課題説明

2-1 話題沸騰ポット(GOMA-1015)

Chapter 3 失敗事例

3-1 失敗パターン 1:クラス抽出の失敗
  3-1-1 機能分割モデル
  3-1-2 もの依存モデル
3-2 失敗パターン 2:抽出度選定の失敗
  3-2-1 過度な詳細モデル
  3-2-2 過度な抽象モデル
3-3 失敗パターン 3:時間経過によるモデル劣化
  3-3-1 クラス過多モデル
  3-3-2 くもの巣モデル
3-4 まとめ
  3-4-1 6つの失敗モデル
  3-4-2 15個の危険な兆候

Chapter 4 要求モデリング

4-1 要求モデリングで何をするのか
  4-1-1 要求モデリングとは
  4-1-2 要求モデリングのプロセスとアウトプット
4-2 機能要件を考察する
  4-2-1 ユースケースモデルとは
  4-2-2 ユースケース図の表記法
  4-2-3 ユースケース記述の表記法
  4-2-4 ユースケースモデルの作成
  4-2-5 イベントリストを併用する
  4-2-6 コンテキストダイアグラムを併用する
4-3 非機能要件を考察する
  4-3-1 非機能要件リストを作成する
  4-3-2 タイミング仕様書を作成する
  4-3-3 データディクショナリを作成する
4-4 まとめ
4-5 復習

Chapter 5 分析モデリング

5-1 分析モデリングで何をするのか
  5-1-1 分析モデリングとは
  5-1-2 分析モデリングのプロセスをアウトプット
5-2 システムのスコープを決める
  5-2-1 コンテキストダイアグラムを作成する
5-3 静解析する
  5-3-1 オブジェクト/クラス/インスタンスとは
  5-3-2 クラス候補を抽出する
  5-3-3 キー抽象となるクラス候補を選定する
  5-3-4 モデル化の指針を決定する
  5-3-5 クラスと属性を決める
  5-3-6 クラスどうしの関連を決める
  5-3-7 ロール名/多重度/関連記述を作成する
  5-3-8 その他のクラス抽出法
  5-3-9 名詞句抽出法の例
  5-3-10 図解抽出法の例
  5-3-11 静解析のまとめ
5-4 動解析する
  5-4-1 責務分担のコミュニケーション図を作成する
  5-4-2 クラスごとの状態遷移図
  5-4-3 クラスの状態遷移表を作成する
  5-4-4 役割分担を確認する
  5-4-5 動解析のまとめ
5-5 クラスごとの責務仕様を決める
  5-5-1 クラス図を詳細化する
  5-5-2 クラスへの操作の追加による一慣性の確認
5-6 モデル検証を行う
  5-6-1 シナリオによる動作の確認
5-7 まとめ
5-8 復習

Chapter 6 設計モデリング

6-1 設計モデリングで何をするのか
  6-1-1 設計モデリングとは
  6-1-2 設計モデリングのプロセスとアウトプット
  6-1-3 構造設計以後のコード中心プロセスの例
6-2 分析モデルを設計モデルへ変換する
  6-2-1 コンパイル可能なモデルへ変換する
  6-2-2 生成関係を検討する
6-3 タスク構造を設計する
  6-3-1 イベント分析を行う
  6-3-2 制御スレッド分析を行う
  6-3-3 インスタンス生成関係を見直す
  6-3-4 クラス構造を見直す
  6-3-5 通信方法を決定する
6-4 パッケージを設計する
  6-4-1 パッケージ図を作成する
  6-4-2 機種ごとにパッケージ分割する
6-5 メモリ構造の設計を行う
  6-5-1 メモリマップを理解する
  6-5-2 ヒープの使い方
  6-5-3 メモリ構造設計のまとめ
6-6 クラスの詳細設計を行う
  6-6-1 シーケンス図を作成する
  6-6-2 クラス仕様書を作成する
6-7 システム全体の設計
  6-7-1 ドメインを分析する
  6-7-2 システムを分割する
6-8 まとめ
6-9 復習

Chapter 7 プログラミング

7-1 プログラミングで何をするのか
  7-1-1 プログラミングとは
  7-1-2 プログラミングのプロセスとアウトプット
7-2 クラスをプログラミングする
  7-2-1 コンポーネントを形成する
  7-2-2 ヘッダファイルとソースファイルを作る
7-3 インスタンスの生成と消滅
  7-3-1 ライフタイムとスコープ
  7-3-2 newによるインスタンス生成とdetelteによるインスタンス消去
  7-3-3 ファクトリによるインスタンス生成
  7-3-4 実装時のメモリ節約
7-4 メソッドを実装する
  7-4-1 状態遷移を実装する
  7-4-2 メッセージ送信を実装する
7-5 オブジェクト指向言語の仕組みと注意事項
  7-5-1 クラスとインスタンスの仕組み
  7-5-2 生成と消滅の仕組み
  7-5-3 メモリ管理の仕組み
7-6 まとめ
7-7 復習

Chapter 8 設計品質

8-1 複雑さへの対処
  8-1-1 分割と階層(トップダウン)
  8-1-2 抽象化
  8-1-3 俯瞰
  8-1-4 図解
  8-1-5 対話
8-2 オブジェクト指向設計の特徴
  8-2-1 カプセル化
  8-2-2 詳細隠蔽
  8-2-3 クラスとインスタンス
  8-2-4 メッセージ通信
  8-2-5 状態保持
  8-2-6 継承
  8-2-7 ポリモーフィズム
8-3 設計の品質
  8-3-1 クラスの品質
  8-3-2 クラス間の品質
  8-3-3 システム形状(静的側面)
  8-3-4 システム形状(動的側面)
8-4 失敗事例の検証
  8-4-1 機能分解
  8-4-2 もの依存
  8-4-3 過度な詳細
  8-4-4 過度な抽象
  8-4-5 クラス過多
  8-4-6 くもの巣
8-5 まとめ

Chapter 9 レビュー

9-1 レビューとテスト
  9-1-1 レビューとテストの違い
9-2 レビューとは
  9-2-1 レビューの対象物
  9-2-2 なぜレビューするのか
9-3 レビュー技法
9-4 インスペクション
  9-4-1 インスペクションの概要
  9-4-2 インスペクションの入力
  9-4-3 インスペクションの処理
  9-4-4 インスペクションの出力
9-5 インスペクションの実際
  9-5-1 対象物
  9-5-2 タイミング
  9-5-3 観点
9-6 インスペクションの実施ツール
  9-6-1 課題ログ
  9-6-2 実施報告書
  9-6-3 チェックリストの事例
9-7 まとめ

Appendix A 定石・格言一覧

A-1 定石
A-2 格言

Appendix B 用語辞書

Discussion