プログラム再構成に関する 特許申請について

ソフトウェア工学
知能情報学部
新田直也
オブジェクト指向分析,設計



プログラミングパラダイムとして誕生したオブジェクト指向は,
その後分析,設計法へと発展.
クラス,継承などの概念は,対象領域をモデル化するのに有
用であると考えられる.
上流(要求分析)から下流(実装)に至るすべての工程でオブ
ジェクト指向を取り入れ,統一した方法論で開発を進めること
を目指す.
オブジェクト指向
要求分析
設計
実装
テスト
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図は自習課題.
 「ソフトウェアアーキテクト」を目指そう!!
