360 likes | 525 Views
オブジェクト指向モデリング [11]. 2003 年 12 月 16 日. 10. 状態モデル. 10.2 活動図 ( 6 ). プロセス図の課題 記法(活動図の拡張) 利益の源泉は何か 回転率を上げる(速い,安い,うまい) ムダを出さない(予測型か調整型か) 予測(見込み生産) 実績(調理と販売) 中間製品で在庫するが,カスタマイズしない 価値の移動 物流と金流 付加価値 接客←従業員教育 素材 店舗の立地. 日別の商品別売上げを得る. カテゴリ別の商品別売上げを得る. 日別の利益額を得る. 店長. 調理係. 窓口係.
E N D
オブジェクト指向モデリング[11] 2003年12月16日
10. 状態モデル 10.2 活動図(6) • プロセス図の課題 • 記法(活動図の拡張) • 利益の源泉は何か • 回転率を上げる(速い,安い,うまい) • ムダを出さない(予測型か調整型か) • 予測(見込み生産) • 実績(調理と販売) • 中間製品で在庫するが,カスタマイズしない • 価値の移動 • 物流と金流 • 付加価値 • 接客←従業員教育 • 素材 • 店舗の立地
日別の商品別売上げを得る カテゴリ別の商品別売上げを得る 日別の利益額を得る 店長 調理係 窓口係 作り置きがあればそこから出庫する 商品ごとの調理時刻を記録する 11. 静的モデル4 11.6 揺さぶり(1) • モデルの洗練 • 変更に強いモデルにする • 本質的なモデルを追求する • 要求のエスカレーション 作り置きがあればそこから出庫する
カテゴリ 名称 1 * /売上 商品 明細 1 取引 1 1 * * /売上金額 /製造原価 /利益 商品名 単価 原価 日 数量 /金額 日時 {導出} 1 1 消費税はどうする * * 廃棄 製造 販売 現物 * ロット番号 /賞味期限 客タイプ 1 性別 年齢層 11. 静的モデル4 11.6 揺さぶり(16) • 汎化も使って概念を整理 導出: the/売上.製造原価は,the明細.the取引とナビゲートして得られる取引オブジェクトの集合のうち,それぞれのサブタイプが「製造」または「廃棄」で,その日時の日が,the/売上.日と一致するものについて,the明細.数量を合計したものにこの原価を乗じて得る
オブジェクト指向モデリング シラバス • 授業計画 回 月日 内容 1 9月 30日 オリエンテーション:モデルとは何か。 2 10月 7日 モデリング言語:UMLの概要 3 10月14日 静的モデル1:概念とクラス 4 10月21日 静的モデル2:関連 5 10月28日 静的モデル3:オブジェクト図 6 11月 4日 静的モデル3:オブジェクト図(続き),モデリング 7 11月11日 機能モデル1:ユースケース,シナリオ 8 11月18日 機能モデル2:要求抽出,協調図,シーケンス図,状態モデル:状態図 9 12月 2日 機能モデル2:活動図,静的モデル4:ユースケースに基づくモデリング 10 12月 9日 静的モデル4:モデルの揺さぶり 11 12月16日 実装レベル:実装モデルとプログラム,モデリング1:アナリシスパターン 12 1月13日 モデリング2:デザインパターン,モデル図の作成,モデルの評価基準 13 1月20日 モデリング3:例題によるモデル図の作成
オブジェクト指向モデリング 12. 概念モデルから実装まで 12.1 実装作業の概要 12.2 ユースケース 12.3 ドメイン層の実装 12.4 アプリケーション層の実装 12.5 ユーザインタフェース層の実装 12.6 プログラミング
12. 概念モデルから実装まで 12.1 実装作業の概要(1) • ソフトウエアプロセス • フェーズとワークフロー • 繰り返し 方向づけ 推敲 構築 移行 要求 分析 設計 制作 検査
12. 概念モデルから実装まで 12.1 実装作業の概要(2) • ドメインの実装 • 機能の実装 • アーキテクチャの実装 • レイヤー構造 • 役割の分担 人工物の作り込み ユーザインタフェース アプリケーション(機能) アプリケーション(機能) ドメイン(概念の世界) ドメイン(概念の世界) 永続化 概念レベル 実装レベル
12. 概念モデルから実装まで 12.1 実装作業の概要(3) • レイヤリングアーキテクチャ • 関心の分離 • 一方向の参照 • ドメインを純粋に保つ ユーザインタフェース • M-V-C アプリケーション(機能) ドメイン(概念の世界) 永続化
12. 概念モデルから実装まで 12.2 ユースケース(1) • ユースケース記述と現実の世界 • 情報システムとの対話と現実の活動 ユースケースの例 ユースケース名:販売を記録する アクタ:窓口係 目的: 事前条件:その販売実績は記録されていない。 基本系列: ①アクタがこのユースケースを起動する。 ②システムは販売した商品,数量,顧客タイプを指示 ③アクタはそれらの値を提示する。 ④システムはそれらの値と日時,担当者を記録する。 代替系列:なし。 事後条件:その販売実績が記録されている。 備考: ①顧客タイプとは,顧客の分類で,性別×年齢層・・ ②担当者情報は,このユースケース起動以前に・・ ③一度の取引に複数の商品が関わることがある ④注文が終わると,システムは料金を表示する 現実の世界 ①窓口で客がメニューに基づいて商品を 注文する ②受注担当が注文を聞いて,キッチン担 当(調理係)に渡す ③客は注文品ができるまで,窓口で待つ ④受注担当は,料金を計算し,請求する ⑤客は料金を支払う(窓口係は受け取る) ⑥客はできあがった商品を受け取る
店長 調理係 窓口係 12. 概念モデルから実装まで 12.2 ユースケース(2) • ユースケースによる型モデルの検証 • シーケンス図,協調図の始点 販売を記録する 日別の商品別売上げを得る カテゴリ別の商品別売上げを得る 日別の利益額を得る 商品ごとの調理時刻を記録する
カテゴリ 名称 1 * /売上 商品 1 明細 取引 1 1 * * /売上金額 /製造原価 /利益 商品名 単価 原価 日 数量 /金額 日時 {導出} 1 1 * * 廃棄 製造 販売 現物 * ロット番号 /賞味期限 客タイプ 1 性別 年齢層 12. 概念モデルから実装まで 12.3 ドメイン層の実装(1) • エスカレーションの戻し • 参照方向の限定
個人 顧客 法人 《多重》 一般 重要 個人重要 法人重要 個人一般 法人一般 12. 概念モデルから実装まで 12.3 ドメイン層の実装(2) • 多重分類の解決 顧客 (b) 単一分類 インスタンス: 個人/法人 重要/一般 顧客タイプ 1 カテゴリ * 顧客 (a) 多重分類 (c) タイプクラス
貸し出し state 12. 概念モデルから実装まで 12.3 ドメイン層の実装(3) • 動的分類の解決 貸し出し 1 * 1 《動的》 返却済み 貸出中 返却済み 貸出中 (a) 動的分類 (b) stateクラス
アプリケーション Sales getName() getTotal() ProductSales CategorySales Reciept CustomerFacade LineItemFacade ProductFacade _date _category _transaction _product _customer _date _lineItem _product Receipt() ProductSales() toString() CategorySales() LineItemFacade() ProductFacade() addLineItem() getTotal() getName() toString() toString() setCustomer() ProductFacade() getTotal() getSoldProducts() getName() $getAllCategorySales() sumSales() getDate() commit() $getAllSales() ドメイン Category * LineItem Transaction Customer Product * * * * * * 12. 概念モデルから実装まで 12.4 アプリケーション層の実装(1) • ユースケースの本体 • アプリケーションファサード(Application Facade) • ドメインクラスのコピー,ビュー • 排他制御 • アプリケーションロジック
12. 概念モデルから実装まで 12.4 アプリケーション層の実装(2) • シーケンス図による責務の配置 • メッセージ(インタフェース)の設計 • ユースケース「販売を記録する」 theActor : Reciept :Transaction :LineItem : Product sell:Usecase 起動 new new 商品,数量 addLineItem( ) $getProduct( ) LineItem( ) addLineItem( ) [注文あり] [注文終わり 会計 setCustomer( ) setCustomer( ) commit( )
theActor 売上:Usecase : /Sales : Product : LineItem : Transaction 商品別集計 new(prod.,date) そのprodを参照しているLineItemを取り出して getProduct( ) getName( ) getSales( ) getTotalQuantity(date) $getTotalQuantity(this, date) $getSoldDate(LineItem) getPrice( ) [LineItemあり] そのLineItemの日がdateと等しければ [forAll] そのLineItemの数量を累積する その累積数量に単価を掛ける 12. 概念モデルから実装まで 12.4 アプリケーション層の実装(3) • シーケンス図による責務の配置 • メッセージ(インタフェース)の設計 • ユースケース「商品別に売上集計する」
12. 概念モデルから実装まで 12.5 ユーザインタフェース層の実装 • ユーザインタフェース層 ユーザインタフェース Test _date Sell() showSales() setDate() アプリケーション Sales getName() getTotal() ProductSales CategorySales Reciept CustomerFacade LineItemFacade ProductFacade _date _category _transaction _product _customer _date _lineItem _product Receipt() ProductSales() toString() CategorySales() LineItemFacade() ProductFacade() addLineItem() getTotal() getName() toString() toString() setCustomer() ProductFacade() getTotal() getSoldProducts() getName() $getAllCategorySales() sumSales() getDate() commit() $getAllSales()
a:Transaction = :Category :Product :LineItem :Transaction :Customer :Transaction _date=021112 12. 概念モデルから実装まで 12.6 プログラミング(1) • インスタンスの生成と管理 • クラスオブジェクト • インスタンスオブジェクト • 参照の方向 1:Category 1:Product 1:LineItem 1:Transact F20:Cust 2:Product 2:LineItem 2:Category 3:Product 3:LineItem 4:LineItem 2:Transact M30:Cust
constructor 12. 概念モデルから実装まで 12.6 プログラミング(2) • リンクの実装 public class Transaction{ private Date _date; private Customer _customer; private Vector _lineItems; private static Vector $transactionList = new Vector(); public Transaction( Date date ){ _date = date; _lineItems = new Vector(); $transactionList.add(this); } public void addLineItem( LineItem lineItem ){ if(lineItem != null){ _lineItems.add( lineItem ); } } public void setCustomer( Customer customer ){ _customer = customer; } $lineItems $transactionList :LineItem :Transaction 1:LineItem 1:Transaction _lineItems 2:LineItem 4:LineItem 2:Transaction Transaction LineItem _date _customer _lineItems $transactionList _product _quantity $lineItems * *
$getSoldDate(this) :LineItem :Transaction $getTotalQuantity(バーガー, 11日) sales.getTotal() getTotalQuantity(11日) ui バーガー:ProductSales バーガー:Product :LineItemqtty=3 :Transactiondate=11日 application domain :LineItemqtty=1 :LineItemqtty=1 :Transactiondate=12日 public class ProductSales implements Sales { public int getTotal() { return _product.getTotalQuantity(_date) * _product.getPrice(); } public class Product{ public int getTotalQuantity(Date date){ return LineItem.$getTotalQuantity(this, date); } public class LineItem{ public static int $getTotalQuantity(Product product, Date date){ int _totalQuantity = 0; Iterator iter = $lineItems.iterator(); while(iter.hasNext()){ LineItem _lineItem = (LineItem)iter.next(); if( _lineItem._product == product ){ if( Transaction.$getSoldDate(_lineItem).equals(date) ){ _totalQuantity += _lineItem._quantity; } } }return _totalQuantity; }
オブジェクト指向モデリング 13. 概念モデルの理解 13.1 アナリシスパターン 13.2 責任関係 13.3 勘定
13. 概念モデルの理解 13.1 アナリシスパターン(1) • Fowler, M.,”Analysis Patterns” • 分析に現れるパターン 要求のエスカレーション 変更に強いモデル • 知識レベル • 制約記述 • 実装の考慮 アプリケーションファサード サポートパターン • よいモデル例
13. 概念モデルの理解 13.1 アナリシスパターン(1) • アナリシスパターン 責任関係(Accountability) 観測と測定 企業財務の観測 オブジェクトへの参照 在庫管理と会計(Account) 会計モデルの利用 計画 トレーディング デリバティブ トレーディングパッケージ • サポートパターン 情報システムの層別化アーキテクチャ アプリケーションファサード 型モデル設計テンプレートのためのパターン 関連パターン
1 1 営業所 1 1 1 1 事業部 地域 部門 * * * 売上 コーヒー:事業部 首都圏:地域 神奈川:部門 藤沢:営業所 東京:部門 川崎:営業所 13. 概念モデルの理解 13.2 責任関係(1) • 責任関係(accountability)パターン • 明示的なレベルを持った組織 変更に弱い 操作(メソッド)の重複,類似の属性 オブジェクト(インスタンス)図
13. 概念モデルの理解 13.2 責任関係(2) • 階層関係を持つ組織 • 類似の操作,属性はスーパタイプに持つ • 制約の変更が煩わしい • マトリックス組織にはどう対応する? {階層} 親 0..1 子 組織 制約: 制約: 親は持たない 親は部門 * * 事業部 地域 部門 営業所 制約: 制約: 親は事業部 親は地域
コーヒー:事業部 首都圏:地域 神奈川:部門 藤沢:営業所 親 親 親 子 子 子 東京:部門 川崎:営業所
{階層} {階層} 親サービス 子営業 * * * * 組織 親営業 * * * * 子サービス 事業部 地域 部門 営業所 サービス地域 サービス部門 サービスセンタ サービスチーム 制約: 制約: 制約: 親サービスはサービスセンタ,親営業は営業所 制約: 制約: 制約: 制約: 制約: 親営業は部門 13. 概念モデルの理解 13.2 責任関係(3) • 2系統の階層 • 制約変更の煩わしさが2倍に
コーヒー:事業部 首都圏:地域 首都圏:サービス地域 東京:サービス部門 東京:部門 神奈川:部門 神奈川:サービス部門 川崎:営業所 藤沢:営業所 横浜:サービスセンタ 藤沢:サービスセンタ 親営業 親サービス 子サービス 子営業 川崎:サービスチーム 藤沢:サービスチーム
インスタンス: 営業組織 サービス組織 組織構造型 型 1 1 制約: * * 営業所の親は部門…. サービスチームの親は営業所およびサービスセンタ…. * * 親 組織構造 組織 1 * * 子 1 * * 1 1 有効期間 期間 事業部 地域 部門 営業所 サービスチーム 13. 概念モデルの理解 13.2 責任関係(4) • 関連型の使用 • 組織構造の制約は,組織構造の変化に敏感
神奈川:サービス部門 神奈川:部門 親 :組織構造 :組織構造 :組織構造 :組織構造 子 営業組織:組織構造型 サービス組織:組織構造型 川崎:営業所 藤沢:営業所 横浜:サービスセンタ 藤沢:サービスセンタ 親 :組織構造 :組織構造 :組織構造 :組織構造 子 :期間 川崎:サービスチーム 藤沢:サービスチーム 2001/10/1 _ 2002/1/22
ルール 組織構造型 * 1 型 1 1 * * * * 親 組織構造 組織 1 * * 子 1 * * 1 1 有効期間 期間 事業部 地域 部門 営業所 サービスチーム 13. 概念モデルの理解 13.2 責任関係(5) • 「組織構造型」と「ルール」 • 組織構造型ごとのルール • 組織の変化に弱い
サービスチームの親は営業所およびサービスセンタ,サービスセンタの親は,….サービスチームの親は営業所およびサービスセンタ,サービスセンタの親は,…. 営業所の親は部門,部門の親は地域,... 神奈川:サービス部門 神奈川:部門 営業組織型:ルール 営業組織型:ルール 親 :組織構造 :組織構造 :組織構造 :組織構造 子 営業組織:組織構造型 サービス組織:組織構造型 川崎:営業所 藤沢:営業所 横浜:サービスセンタ 藤沢:サービスセンタ 親 :組織構造 :組織構造 :組織構造 :組織構造 子 :期間 川崎:サービスチーム 藤沢:サービスチーム 2001/10/1 _ 2002/1/22
責任関係型 1 1 型 依頼者 * * * * パーティ 責任関係 1 1 実行者 * * 1 1 * * 有効期限 1 1 組織 人 期間 13. 概念モデルの理解 13.2 責任関係(6) • 組織階層を「責任関係」として一般化 • 依頼者→実行者 • Customer-Performerの関係
依頼者 * * 責任関係型 パーティ型 1..* 1..* 実行者 * * 1..* 1..* 型 1 1 型 1 1 知識レベル 操作レベル * * 依頼者 * * * * パーティ 1 1 責任関係 * * 作業 実行者 * * * 1 1 * * 有効期限 1 期間 人 組織 13. 概念モデルの理解 13.2 責任関係(7) • 知識レベルと操作レベル • パワータイプ(ベキ型) • 操作レベルの型の制約を記述 • 鏡像関係 inv: let collx:set(責任関係)=self.the責任関係 in collX->forALL( x | x.型.依頼者->includes(x.依頼者.型) and x.型.実行者->includes(x.実行者.型))
シナリオ • 同意:責任関係 • 患者:鈴木一郎は医師:山本太郎との間で,2001年12月18日に内視鏡検査を受けることについて同意した 患者 :パーティ型 依頼者 同意:責任関係型 型 医師 :パーティ型 実行者 型 型 内視鏡検査:作業 :責任関係 依頼者 鈴木一郎 :パーティ :期間 山本太郎 :パーティ 実行者 2001/12/18