Transcript resize
ソフトウェア工学
知能情報学部
新田直也
オブジェクト指向分析,設計
プログラミングパラダイムとして誕生したオブジェクト指向は,
その後分析,設計法へと発展.
クラス,継承などの概念は,対象領域をモデル化するのに有
用であると考えられる.
上流(要求分析)から下流(実装)に至るすべての工程でオブ
ジェクト指向を取り入れ,統一した方法論で開発を進めること
を目指す.
オブジェクト指向
要求分析
設計
実装
テスト
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: Point
コンポジション
center
move(px, py)
resize(scale)
集約
中心座標なくして円は
成り立たないので,この
場合はコンポジション
Point
x: double
y: double
getX(): double
setX(x): void
getY(): double
setY(y): void
クラス図
集約とコンポジションについての補足
全体
Javaのソースコード上では集約とコンポジションの区別はつかない.
いずれの場合も「全体のメンバが部分を参照する」という実装になる.
class Circle {
double radius;
Point center = new Center();
部分
}
void move(double px, double py) {
center.setX(px);
center.setY(py);
}
void resize(double scale) {
radius = radius * scale;
}
クラス図
関連と多重度
2つのクラスの(抽象的な)関係を示す.2つのクラス間に直接参照が
存在しなくてもよい.
特にインスタンス数の対応を示す場合,多重度を記すことができる.
関連に方向がある場合,矢印で誘導可能性を表す.
関連名
Teacher
name: String
age: int
誘導可能性
lecture
has
4..6
1
丁度1つが対応する
ことを表す多重度
student
attend
name: String
0..*
0..* name: String
grade: int
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図は自習課題.
「ソフトウェアアーキテクト」を目指そう!!