ソフトウェア工学 知能情報学部 新田直也 オブジェクト指向分析,設計 プログラミングパラダイムとして誕生したオブジェクト指向は, その後分析,設計法へと発展. クラス,継承などの概念は,対象領域をモデル化するのに有 用であると考えられる. 上流(要求分析)から下流(実装)に至るすべての工程でオブ ジェクト指向を取り入れ,統一した方法論で開発を進めること を目指す. オブジェクト指向 要求分析 設計 実装 テスト UMLの歴史 UML(Unified Modeling Language, 統一モデリ ング言語) G. Booch, J. Rumbaugh, I. Jacobson (Three Amigos)による.(1995, 6年) 上記3人の3つの分析・設計方法論が源流. ただし,UMLは方法論ではなく表記法. G. Booch: Booch法 J. Rumbaugh: OMT法 I. Jacobson: OOSE法 方法論の統一は困難. 表記法の乱立は開発現場に混乱. 3人は後に Rational Software社を設立,2002年,同 社はIBM社によって21億ドルで買収される. UMLの重要性 よいモデリング(分析,設計)がよいソフトウェアを作る. 分析,設計技術者の不足. 顧客との意思疎通にUMLは大変有用. http://www.atmarkit.co.jp/fjava/survey/survey0202/survey0202.html UMLの構成 UMLは表記法のみを統一. 以下の図によって構成される. クラス図 シーケンス図(インタラクション図,相互作用図) ユースケース図 主に要求分析工程で用いる オブジェクト図 コラボレーション図 ステートチャート図 アクティビティ図 コンポーネント図 主に実装工程で用いる 配置図 最も重要なのはクラス図. クラス図 クラスを長方形で表す. 《クラス図での表記》 クラス名 Circle 属性 radius: double x: double y: double 操作 move(px, py) resize(scale) 《Javaのソースコード》 class Circle { double radius; double x; double y; } void move(double px, double py) { x = px; y = py; } void resize(double scale) { radius = radius * scale; } クラス図 抽象クラスとインタフェース 《抽象クラスの表記》 クラス名を斜体に Shape move(px, py) resize(scale) 抽象メソッドは 斜体に 《interface》を 頭に記す 《インタフェースの表記》 《interface》 MouseListner mouseClicked(e) mousePressed(e) mouseReleased(e) mouseEntered(e) mouseExited(e) クラス図 継承と実現(実装) 《interface》 MouseListner mouseClicked(e) mousePressed(e) mouseReleased(e) mouseEntered(e) mouseExited(e) Shape move(px, py) resize(scale) 実現 できる限り親を上側に, 無理なら左側に配置する 継承 Circle radius x y move(px, py) resize(scale) クラス図 集約とコンポジション 一方が全体,一方が部分になる関係. 双方の生存期間が一致する場合がコンポジション,一致 しない場合が集約. Circle radius: double コンポジション center move(px, py) resize(scale) 集約 中心座標なくして円は 成り立たないので,この 場合はコンポジション Point x: double y: double getX(): double setX(x): void getY(): double setY(y): void クラス図 集約とコンポジションについての補足 全体 Javaのソースコード上では集約とコンポジションの区別はつかない. いずれの場合も「全体のメンバが部分を参照する」という実装にな る. class Circle extends Shape { double radius; Point center = new Point(); 部分 } void move(double px, double py) { center.setX(px); center.setY(py); } void resize(double scale) { radius = radius * scale; } クラス図 関連と多重度 2つのクラスの(抽象的な)関係を示す.2つのクラス間に直接参照が 存在しなくてもよい. 特にインスタンス数の対応を示す場合,多重度を記すことができる. 関連に方向がある場合,矢印で誘導可能性を表す. 関連名 Teacher 誘導可能性 Lecture has 4..6 name: String 1 age: int 丁度1つが対応する ことを表す多重度 Student name: String attend name: String grade: int 0..* 0..* age: int day: int grade: int time: int classroom: int 4~6個が対応 それぞれ0個以上が対応 クラス図 依存関係 一方のクラスが他方のクラスに何らかの形で依存してい る関係.一方のクラスが他方のクラスのインスタンスを生 成する関係が代表的. Circle CircleCommand name: String create radius: double center: Point move(px, py) resize(scale) クラス図のまとめ クラス図だけでほとんどのことが記述できる. オブジェクト指向プログラミング言語の理解が基本. クラス図に書かれた設計の意図を読み取れるように なるには多少の訓練が必要. クラス図は設計の主に静的な側面を記述したもの. Javaなどのソースコードから自動生成(リバースエ ンジニアリング)するツールがある. 設計の動的な側面を記述するUML図のうち最も多 く使われるがシーケンス図. シーケンス図 時 間 経 過 オブジェクト間の通信を時間の流れに従って記述し オブジェクト たもの. オブジェクト名 : クラス名 オブジェクト名 : クラス名 生成 メッセージ 生存線 活 性 区 間 生 存 期 間 消滅 復帰 シーケンス図 Circle, Pointの例. : Circle center : Point move(px,py) setX(px) setY(py) シーケンス図 メッセージ 同期メッセージ: 通常のメソッド呼び出しに対応.送信後は受信側に直ち に制御が移る.送信側は制御が受信側から返されるまで 動作を停止する. 復帰まで 動作を停止 復帰 非同期メッセージ: マルチタスク,マルチスレッドなどで用いられる.送信側は 送信後も動作を続ける.メッセージは送信後,すぐに受信 側で処理されるとは限らない. 送信後も 動作を続行 シーケンス図 自己メッセージ 自分で自分を呼び出す.再帰呼び出し. resize() getRadius() setRadius() class Circle { double radius; : double getRadius(void) { return radius; } void setRadius(double r) { radius = r; } void resize(double scale) { setRadius(getRadius() * scale); } } シーケンス図のまとめ システムの動的振る舞いの一局面を示したもの. クラス図の補足説明として使われる場合が多い. あらゆる動的振る舞いを記述することは不可能. 多くのデザインパターンは,クラス図とシーケンス図を 使って説明される. Javaなどのソースコードからシーケンス図を生成す ることは困難である. ユースケース図 各利用者から見たシステムの機能(使い方)を表す. 学生 講義情報システム システム 境界線 シラバス参照 教官 《include》 シラバス更新 アクター ユースケース ユースケース図について 実は,一番重要な図. 「何を作るか」を整理して書くことができる. 当たり前すぎて忘れられがち. 顧客にとって一番関心がある部分. 特に,大きなシステムは利用者が複数存在する場 合が多く,それがシステムの複雑度を増大してい る. ユースケース図を元にクラス図を構築するロバスト ネス分析という手法があり,注目されている.ロバス トネス分析はたとえば以下を参照のこと. http://www.ogis-ri.co.jp/otc/hiroba/technical/RobustnessAnalysis/RA1/ 本日のまとめ 今後UMLはソフトウェア技術者の必須要件に. UML図を基にした開発手法としてRUP(Rational Unified Process)やMDA(Model Driven Architecture)が有名. あくまでも基本はオブジェクト指向プログラミング. 設計のノウハウを積むには経験が必要. ただし,「実装や保守工程で楽をしたい」という観点を持つ と習得し易い. 説明できなかったUML図は自習課題. 「ソフトウェアアーキテクト」を目指そう!!
© Copyright 2024 ExpyDoc