MENU
現役エンジニアがIT周りを解説しています!

UML 知識問題で絶対に抑えておくべきポイント

経験上よく問われる知識をまとめます!

目次

結合度と凝集度

結合度

  • モジュール間の依存度の高さを表す
  • 低いほうが良い

具体的なモジュール結合度は下の表をご覧ください。

結合度結合名説明
データ結合引数で単純なデータを渡す
スタンプ結合引数で構造体など、オブジェクトを渡す
制御結合引数の種類によって処理が変わる
外部結合単一のグローバルデータを参照しあう
共通結合複数のグローバルデータを参照しあう
内容結合他のオブジェクトの内部を参照する

凝集度

  • モジュール内のデータと処理がどれだけ関連してるかを表す
  • 高いほうが良い

具体的には、クラスのメンバ変数とメソッドの関連の強さです。

単一責任をどれだけ満たしているかというイメージになりますね。

オブジェクト指向設計原則

これについては別記事にて深堀をしていますので、そちらをご覧ください。

モデリング技法

これは基本的なUML図

  • ユースケース図
  • クラス図
  • シーケンス図
  • コミュニケーション図
  • ステートマシン図
  • アクティビティ図
  • コンポーネント図
  • 配置図

に加えて、

  • ロバストネス分析
  • CRC技法

の知識が必要です。

UML図はこちらで勉強できます。

ロバストネス分析とCRC技法は乗っていないので、解説していきます👍

ロバストネス分析

  • システムを「バウンダリ」「エンティティ」「コントロール」の3つに分けて分析する
  • コミュニケーション図やコラボレーション図を簡略化した形で書くことができる

ロバストネス図は、UML定番の「アクター」のほかに、下のような図を用いて表現します。

バウンダリ

アクターが操作する画面やボタンなどの要素です。
バウンダリは、アクターもしくはコントロールから操作されます。

エンティティ

システム内部で管理するデータです。
基本的に、一度作られたら削除されないデータとします。
エンティティは、コントロールからのみ生成、使用ができます。

コントロール

バウンダリとエンティティをつなぐ処理です。
コントロールは、コントロール同士とバウンダリのみ繋ぐことができます。

CRC技法

CRCとはClass Responsibility Collaboratorの頭文字で、クラスごとの責務と、その責務を果たすために関連するクラスを分析する技法です。

この技法では、CRCカードと呼ばれるカードを作成し、分析を行います。

CRCカード
クラス名

クラス名を記入します。

責務

クラスの持つ責務を記入します。
メンバ変数や、メソッドのイメージで、具体的に記入します。

コラボレータ

関連するクラス名を記入します。

1枚1枚手書きで書いていた時代のものだと想像します。

今ではastahやdraw.io(現app.diagrams.net)など、クラス図を簡単に書けるツールがありますね。。。

そこで現在は使っているところは少ないかと思いますが、「こういう技法がある」ということを覚えておいてください。

OCL

OCLとはオブジェクト制約言語 Object Constraint Language の頭文字です。

これはUMLだけでは表現しきれない制約を、より正確に表現することを目的として導入されました。

具体例

具体的には

context ほわらぼ inv:
    self.社員 = 0

のように記載します。

基本キーワード

使用されるキーワードは以下の通りです。

context

対象を表すキーワードです。
このキーワードの後に、指定したいクラス名などを記載します。
contextは省略可能です。
下のinvやpre、postなどと一緒に用います。

inv

必ず「真」になる条件を記載するキーワードです。
invariant:不変条件から来ています。
 context クラス名 inv :
  [条件]
のような形で、固定パターンで使用されます。

pre / post

事前条件 / 事後条件を表します。
preはpreconditionで事前、postはpostconditionで事後の意です。
 context クラス名::操作名(引数リスト) : 戻り値の型
  pre : [条件]
  post: [条件]
などのように使います。
また、「属性@pre」のように、いつの値かを示すときにも使用します。

self

contextで指定したものを、inv条件内ではselfで表します。
プロパティ名は「self.プロパティ名」でアクセスします。
具体例の「self.社員=0」では「ほわらぼの社員は0」となってしまいます。。。😥

result

操作の戻り値を表します。

implies

「ならば」を表します。

その他条件

普通の関数同様 if 演算も可能です。

if self.社員 > 0 then
  self.感情 = ウハウハ
else
  self.感情 = ボッチ
endif

※上記例はあくまで、イメージということでご理解ください!

不等号は「<>」で表せます。

また、「and」、「or」、「xor」、「not」など、基本的な条件演算子も使用可能です。

※「a xor b」はaもしくはbのどちらかが真の場合、真を表します。

ここまで制約が書けてしまうわけです!

使用できる型

基本型Boolean、 Integer(自然数)、 Real(実数)、 String
Collection型Collection、 Set、 Bag、 Sequence
その他OclType:メタクラスに相当する型
OclAny:基本型とすべてのUML型の上位クラス
Enumeration:列挙型
OclExpression:OCLの条件式を表す型
OclState:オブジェクトの状態を表す仮想型

以上が使用可能な型です。

演算

プログラミング言語同様、演算も可能です。

以下によく出てくる演算をリストにしてみます。

size()要素数
select(条件)条件が真となる要素の集合
reject(条件)条件が偽となる要素の収容
isUnique()要素が1つで他にない場合、真
isEmpty()要素が空の場合、真
notEmpty()要素が空でない場合、真
exists(条件)条件が真となる要素が1つでも存在する場合、真
forAll(条件)すべての要素に対して、条件が真となる場合、真
includes(オブジェクト)指定したオブジェクトが含まれる場合、真
includesAll(要素)指定した要素がすべて含まれる場合、真

まとめ

このページで紹介した本

いかがだったでしょうか!

参考になりましたか??

足りない部分は、ぜひ質問しに来てください!!!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
目次