UMLについて 2017/02/12
勘違いや間違いがあったので、備忘録...
・UMLに独自の図を追加して使うことはできない。
UMLの仕様はOMG(Object Management Group:オブジェクト指向技術の標準化を行なう団体)が決めているので、この仕様にない図を使ったものはUMLとは認められない。
拡張をする場合は、UMLの仕様にあるメタ属性や制約、ステレオタイプで行う。この拡張のセットをUMLプロファイルという。
・UMLの図の種類
構造図:クラス図、オブジェクト図、パッケージ図、コンポーネント図、コンポジット構造図、配置図
振る舞い図:ユースケース図、アクティビティ図、相互作用図、ステートマシン図
なお、相互作用図は、更にシーケンス図、コミュニーケーション図、タイミング図、相互作用概略図が存在する。
以下Wikipediaにある図
・UnifiedProcess
以下のフェーズからできている
(1)方向づけ:対象システムが実現可能であるか判断する
(2)推敲:アーキテクチャを策定
(3)作成:製品レベルのシステムを作り上げる
(4)移行:利用環境に適応しているかの確認を行う
パッケージ図 その2
パッケージを描くときは、パッケージ間の依存関係を意識する。具体的には、単一方向に依存が付くような場合が望ましい。
例外はあって、Mapperパターンのデータマッパーなどは、データを管理する層とロジックの層の橋渡しをするため両方から依存が付く。
橋渡しでは、ロジック層で扱うデータをデータ保存するのに適した形に変換したりするので、両方から依存が付くのが自然で正しい。
パッケージ図
■パッケージ図
クラスをグルーピングする構成要素です。グルーピングの基準では、以下に注意する。
・閉鎖性共通の原則(Common Closure Principle)
1つのパッケージ内のクラスは、同じような理由で変更されるべきという原則
・全再利用の原則(Common Reuse Principle)
再利用するときはパッケージ丸ごと再利用する
クラス図について... その3
■分類と汎化
よく汎化のことを、ia-a関係というが注意しないといけないことがある。
それは以下のいずれもia-a関係であるということ。
・分類:ポチはボーダーコリーです。(ポチ is ボーダーコリー)
・汎化:ボーダーコリーは血統です。(ボーダーコリー is 血統)
サブタイプ化(汎化)をする際には、2つの上が混在したりしないように注意が必要となる。
■多重分類
一つのクラスに複数のサブセットタイプがつくこと。
この概念をそのまま実装することは難しい(やり方がない?)ため、概念レベルの設計で利用されることもあるけど、個人的にはわざわざ一般的でない書き方をしなくても...と思う
上の図では、Carクラスは、グレード(HighとLow)と駆動方式(4WD、FD、FR)の2つのサブクラスのセットに属している。
■関連クラス
関連クラスは関連に付くクラスであり、これにより関連に属性、操作を追加できる。
関連クラスのインスタンスは、関連両端のオブジェクトに対して1つしか存在できないという制約が付く。
このため、1つしか存在しない場合は関連クラス、1つ以上存在する場合は普通のクラスとしてモデル化する。
クラス図について... その2
UML モデリングのエッセンス 第3版 (Object Oriented SELECTION)
- 作者: マーチン・ファウラー,羽生田栄一
- 出版社/メーカー: 翔泳社
- 発売日: 2005/06/16
- メディア: 大型本
- 購入: 8人 クリック: 254回
- この商品を含むブログ (93件) を見る
5章読んでいて、使っている表現と使っていない表現があったので、復習を兼ねてまとめ。
■クラスに追加するとわかりやすくなる(具体的な書き方は上の書籍参照)
・キーワード:このクラスはインターフェースクラスだよといったことを明示する
・リスポンシビリティ:クラスの責務を明示する
・staticな操作、属性 :CやC++のstaticみたいなやつは明示しようという話
ほんとにクラスの要素ある必要あるの?とか検証に使えそう
・派生プロパティ :他のプロパティに依存する(計算できたりする)プロパティ
■クラス関連の書き方
・集約:よくいうのはhas-a関係で所有権のある場合に使う。といっても、has-a関係
でも関連で書かれていることはよくあります。
あまり深く考えずに、関連より強い関係のときに使うぐらいでいいと思う。
書いた人がいれば聞くのが一番だと思うが、かなりの確率で、特に意味はない
という答えになると思います。
・コンポジション:コンポジションクラス(所有する側)が消えるとき、所有されて
いるクラスも消えてしまうような、とても強い関係の場合に使う。
■クラス図自体の書き方
・インターフェース:すべての操作が抽象操作で、直接インスタンス化できない。
・抽象クラス:1つ以上の抽象操作(実装がない操作)をもつクラス。
直接インスタンス化できない。
2つの差異は、インターフェースはクラスの機能(振る舞い)を示すもので、抽象クラスはクラスの意味を示すもの。(間違ってたらごめんなさい)
インターフェースクラスは特に重要で、クライアントクラスがインターフェースに依存するようにして、実装に依存しないようにすることで、実装の変更がクライアントに及ばないようにする。(詳しくは依存関係逆転の法則をみてください)