230 likes | 395 Views
47070. オブジェクト指向モデリング [6]. 2001 年 11 月 13 日. オブジェクト指向モデリング. 前回 静的モデル 1. 5.1 型の認識 5.2 関連 5.3 属性と操作 5.4 汎化関係. 人. 氏名: String 身長: Real. 人. 氏名. 氏名: String. 1..*. 人. String. 氏名. 1..*. 夏目漱石. 島崎藤村. 芥川龍之介. 氏名. 人. 静的モデル 1. 型の認識. 型 概念 名前を持つ 境界を持つ 定義 属性 ユニークであること 別名でない
E N D
47070 オブジェクト指向モデリング[6] 2001年11月13日
オブジェクト指向モデリング 前回 静的モデル1 5.1 型の認識 5.2 関連 5.3 属性と操作 5.4 汎化関係
人 氏名:String 身長:Real 人 氏名 氏名:String 1..* 人 String 氏名 1..* 夏目漱石 島崎藤村 芥川龍之介 氏名 人 静的モデル1 型の認識 • 型 • 概念 • 名前を持つ • 境界を持つ • 定義 • 属性 • ユニークであること • 別名でない • 属性でない • 集合 • 属性か型かは非常に微妙 • 基本型 • UoD,文脈,視点
著書 本 is a copy of 0..* 1..1 1冊め 実践ファンクション ポイント法 2冊め 3冊め リファクタリング UMLを使って 著書 本 静的モデル1 多重度 • インスタンスどうしの対応(リンク)数 • 対応の方向 • 0,1,* • 関連はリンクの集合 • 関連の意味 • メッセージパス • 生成 • 参照 • ナビゲーション 最小値..最大値
オブジェクト指向モデリング 第6回 静的モデル2 6.1 概念レベルでの特殊な表現 6.2 リファクタリング 6.3 オブジェクト図 6.4 関連についての補足 6.5 型についての補足 6.6 依存性 6.7 パッケージ 6.8 知識レベル テキスト 第5章 テキスト 第6章
顧客 個人 制約 個人顧客 {完全} 法人 顧客 弁別子 (discriminator) 法人顧客 個人顧客 一般 <<多重>> <<動的>> 重要 重要度 ステレオタイプ 重要顧客 一般顧客 静的モデル2 6.1 概念レベルでの特殊な表現 • 汎化 • 多重分類 • 動的分類 • 区画 • 完全区画 • 不完全区画
個人顧客 {完全} 顧客 法人顧客 個人顧客 個人顧客 {完全} <<多重>> <<動的>> 顧客 重要度 法人顧客 個人顧客 重要顧客 一般顧客 <<多重>> <<動的>> 重要度 重要顧客 一般顧客 静的モデル2 6.2 概念レベルでの特殊な表現 • 汎化の記法
一般法人 一般個人 重要法人 重要個人 静的モデル2 6.2 概念レベルでの特殊な表現 • 開発過程における型モデル • 型モデルからクラスモデルへ • モデルの観点 • 概念レベル・・・・・・型モデル • 多重分類 • 動的分類 • 仕様レベル・・・・・・シグニチャ • 実装レベル・・・・・・クラスモデル • 単一分類 • 静的分類 顧客
静的モデル2 6.3 リファクタリング • リファクタリング • クラス構造の再構築 • 責任の再割付 • システム全体の機能を変えない • 自動テスト • 進化的発展 • 最初から理想的な型/クラス構造は作れない • 悪構造であることをどう知るか 不吉なにおい コードの重複,長すぎるメソッド,巨大なクラス,多すぎる引数,変更の発散,変更の分散,属性・操作の横恋慕,データの群れ,基本データ型への執着,スイッチ文,パラレル継承,怠け者クラス,疑わしき一般化,一般的属性,メッセージの連鎖,仲介人,不適切な関係,クラスのインタフェース不一致,未熟なクラスライブラリ,データクラス,相続拒否,コメント • ボトムアップの段階的改善 実装レベル
ユーザインタフェース アプリケーション(機能) ドメイン(概念の世界) 永続化 静的モデル2 演習問題 • 1. クラス名はなぜ単数形? • 2. モデルの観点を形式的に判定できるか? • 3. ドメイン以外のクラスがあってもよいのはいつ? 概念レベル 仕様レベル 実装レベル
制約 型 関連名 個人顧客 多重度 {完全} 関連名の方向 商品種類 顧客 注文する 0..* 0..* 法人顧客 注文対象 注文主 個人顧客 関連 <<多重>> <<動的>> 重要度 弁別子 (discriminator) ロール ステレオタイプ 重要顧客 一般顧客 静的モデル2 型図
実践ファンクションポイント法: 著書 実践ファンクションポイント法 リファクタリング: 著書 リファクタリング UMLを使って: 著書 UMLを使って 「著書」型 静的モデル2 6.4 オブジェクト図 • インスタンス インスタンス名:型名
* B A * B A C D 型C A1 A1 B1 C1 A2 A2 B2 D1 A3 A3 型A 型A 型B 型B 型D c1:C b1:B a1:A a1:A d2:D b2:B 静的モデル2 6.4 オブジェクト図 • インスタンスのコラボレーション
勘定 記入 取引 2..* * 勘定科目名 /残高 金額 取引日 摘要 a:勘定 1:記入 旅費交通費 11000円 旅費交通費 8000円 3000円 1:取引 2001.11.6 つくば b:勘定 2:記入 クレジット 0円 クレジット -5000円 クレジット 2000円 -3000円 1:記入 5000円 2:取引 2001.11.31 精算 c:勘定 2:記入 現金預金 45000円 現金預金 50000円 -5000円 静的モデル2 6.4 オブジェクト図 • 型(クラス)図の理解
静的モデル2 6.5 関連についての補足 • 集約 • 集約 • 部分-全体関係 • 関連名(is a part of)は省略 • コンポジション(集約) • 強い所有 • 弱いエンティティ(weak entity) 概念レベルでは区別をしない 優等コース 授業科目 1..* 6..* ボード マス 1 9
請求先 * 顧客 注文 商品 1 1 * 納入先 * 1 請求先 * 顧客 注文 1 商品 1 * 納入先 * 1 静的モデル2 6.5 関連についての補足 • ナビゲーション可能性(navigability)の明示 • 双方向 • 単方向 演習問題46 ナビゲーション可能性はいつ決定されるべきか
静的モデル2 6.5 関連についての補足 • 限定子つき関連(qualified association) • 多重度を1にする • 限定子によって一意になるという制約を示す • 辞書などによる実装を暗示 ボード マス 位置 1 9 * 行 列 1 ボード マス 1 位置 行:{1,2,3} 列:{1,2,3} Class ボード { public マス getSquareMark(int 行, int 列); : }
著書 * /borrows is a copy of * 本 会員 borrows * 静的モデル2 6.5 関連についての補足 • 導出関連(derived association) • 計算で導き出せる関連 • 冗長 • 理解 • 導出型 • 導出属性 • 導出ロール UML FP 「/」でマーク 「著書」型 1 2 3 4 「本」型 「会員」型
ライン プロセス {ordered} * 本 著作 0..* 1 0..* {xor} 雑誌 1 静的モデル2 6.5 関連についての補足 • 関連に対する制約 • 短縮意味宣言 • { }制約 • {xor} • {順序} ステレオタイプ <<type>> 制約 {self.noOfStudents > 10} プロパティ {isAbstract = true} インスタンス図を書いてみよう
ライン プロセス {ordered} * ① 扉製造:ライン 切断: プロセス ② 塗装: プロセス ③ 組立: プロセス 梱包: プロセス ④ 静的モデル2 6.5 関連についての補足 • 関連に対する制約 • オブジェクト図 {階層} * 組織 {階層}がないと どんなオブジェクト図が書けるでしょう
勘定 記入 取引 2..* * 勘定科目名 /残高 金額 取引日 摘要 inv: self.the借方->sum(金額) = self.the貸方->sum(金額) 借方 貸方 静的モデル2 6.5 関連についての補足 • 制約 • 詳細意味宣言 • ノート • OCL(Object Constraint Language)
静的モデル1 宿題の解答例 • 6親等までを扱うための型モデルを書いてください • 養子縁組はないものとする • 離婚,再婚はないものとする 親 子 子 兄弟 親 配偶者 親 従兄弟 兄弟 兄弟 叔父叔母 親 配偶者 2 0..1 人 0..1 子 * はとこ 子 0..* 配偶者 * 従兄弟 self 子 叔父叔母 * 兄弟 * * * * inv: self.親=self.兄弟.親 and self.親.親->intersection(self.従兄弟.親.親)->notEmpty and self.親.親.親->intersection(self.はとこ.親.親.親)->notEmpty and self.子.親->includes(self, self.配偶者) and self.子.子.親->includes(self.子, self.子.配偶者) and self.子.子.子.親->includes(self.子.子, self.子.子.配偶者) : <<対称>> /兄弟関係 <<対称>> /叔父甥関係 <<対称>> /従兄弟関係 <<対称>> /はとこ関係
静的モデル1 宿題の解答例 • 6親等までを扱うための型モデルを書いてください • 養子縁組はないものとする • 離婚,再婚はないものとする 子 親 配偶者 先 先 先 先 <<対称>> /配偶関係 n n n n-1 n-1 親 配偶者 2 0..1 元 人 0..1 self 子 * 先 1 inv: self.~元(親等関係)->select(p|p.親等数=0).先=self.配偶者 and Integer.allInstances->select(n|0<n<7)->forAll(n | self.~元(親等関係)->select(p|p.親等数=n).先= self.~元(親等関係)->select(p|p.親等数=n-1).先.子) ->union(self.~元(親等関係)->select(p|p.親等数=n-1).先.親) ->union(self.~元(親等関係)->select(p|p.親等数=n).先.配偶者) ) * 1 <<対称>> /親等関係 元 親等数 *