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