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