Pieris Books(ブックカフェ併設のセレクトショップ販売店)のシステム開発プロジェクトを進めています。
要求モデルをCozyモデルとして定義する方法を検討しています。
現在はユースケース間の関係をCML(Cozy Modeling Language)でどのように記述するかという観点で整理を進めています。前回は extend を検討しました。
今回は generalize(汎化) を取り上げます。
generalize
- マージモード : TypeRefinement
- マージ点 : N/A(フロー非依存)
- 機能 : 契約包含(仕様精緻化)
- 由来 : UML generalization
generalizeの基本方針
Cozyモデルでは、ユースケース間のgeneralizationを
- ユースケース間の型的関係(契約関係)
として定義します。
具体的なフロー継承方法やsuper展開規則は、generalizationの仕様外とします。
ユースケースの意味定義
Cozyモデルでは、ユースケースを
- 状態遷移モデルの断片
とみなします。
その意味は、主に次の契約によって定義されます。
- 事前条件(Pre)
- 事後条件(Post)
ユースケース U は、
- ある状態が Pre(U) を満たすとき実行可能であり
- 実行後の状態は Post(U) を満たす
という仕様を持つものとします。
抽象状態機械は明示的には定義しませんが、
- 暗黙の抽象状態機械 = ユースケース集合
という位置付けを取ります。
generalizationの定義
UseCase C が UseCase P を generalize するとは、
- C が P の契約を包含し、意味を精緻化する関係
と定義します。
具体的には、LSP(リスコフの置換原則)的に次を満たすことを要件とします。
事前条件の包含
親の事前条件を満たす状態では、子も実行可能でなければならない。
すなわち、
- C は P の事前条件を弱めない
- 子は親より実行可能範囲を狭めてはならない
事後条件の保存
子は、親が保証する結果を壊してはならない。
- C の事後条件は P の事後条件を包含するか、より強い保証を与える
直観的整理
- 親が約束することは、子でも必ず成り立つ
- 子は親より具体的であってよいが、意味を破壊してはならない
このとき、
- generalization = 状態遷移断片の refinement(仕様精緻化)
とみなすことができます。
フローとの関係
前述した通りCozyモデルでは「generalizationはフローの継承方法を規定しない」というアプローチを取ります。
- MainFlowは契約を実現するシナリオである
- 契約が保持される限り、フロー構造は自由である
したがって、
- super展開の位置
- テンプレート的骨格継承
- 差分オーバーライド
といったgeneralization関係にあるユースケース間のフローの関係は仕様としては定めておらず自由な構造を選択することができます。
include / extendとの違い
| 観点 | include | extend | generalize |
|---|---|---|---|
| 対象 | フロー構造 | フロー変形 | 契約(意味) |
| 本質 | 構造合成 | 条件付き拡張 | 仕様精緻化 |
| 型関係 | なし | なし | あり |
| LSP制約 | なし | なし | あり |
include や extend が
- シナリオ構造の操作
であるのに対し、generalize は
- 意味(契約)の包含関係
です。
記述例
usecase Purchase pre: - 顧客が商品を選択している post: - 注文が確定している - 支払いが登録されている
usecase PurchaseOnline generalize Purchase pre: - 顧客が商品を選択している - 顧客がログインしている post: - 注文が確定している - 支払いが登録されている - 配送先が登録されている
このとき、
- 子は親の事前条件を包含し
- 親の事後条件を壊していない
ため、generalization関係が成立します。
まとめ
本稿では、generalizeを
- ユースケース間の型的関係 = 契約包含関係 = 状態遷移断片の精緻化
として定義しました。
generalizationは、
- フロー構造の継承を規定するものではなく
- 契約レベルでの意味関係を定義するもの
と位置付けます。
具体的なフロー実現方法(テンプレート的継承、差分オーバーライドなど)は、
- generalizationを実現するための設計戦略
として、次回検討します。

0 件のコメント:
コメントを投稿