結合度と凝集度
結合度
- モジュール間の依存度の高さを表す
- 低いほうが良い
具体的なモジュール結合度は下の表をご覧ください。
結合度 | 結合名 | 説明 |
---|---|---|
低 | データ結合 | 引数で単純なデータを渡す |
スタンプ結合 | 引数で構造体など、オブジェクトを渡す | |
制御結合 | 引数の種類によって処理が変わる | |
外部結合 | 単一のグローバルデータを参照しあう | |
共通結合 | 複数のグローバルデータを参照しあう | |
高 | 内容結合 | 他のオブジェクトの内部を参照する |
凝集度
- モジュール内のデータと処理がどれだけ関連してるかを表す
- 高いほうが良い
具体的には、クラスのメンバ変数とメソッドの関連の強さです。
単一責任をどれだけ満たしているかというイメージになりますね。
オブジェクト指向設計原則
これについては別記事にて深堀をしていますので、そちらをご覧ください。
モデリング技法
これは基本的なUML図
- ユースケース図
- クラス図
- シーケンス図
- コミュニケーション図
- ステートマシン図
- アクティビティ図
- コンポーネント図
- 配置図
に加えて、
- ロバストネス分析
- CRC技法
の知識が必要です。
UML図はこちらで勉強できます。
ロバストネス分析とCRC技法は乗っていないので、解説していきます👍
ロバストネス分析
- システムを「バウンダリ」「エンティティ」「コントロール」の3つに分けて分析する
- コミュニケーション図やコラボレーション図を簡略化した形で書くことができる
ロバストネス図は、UML定番の「アクター」のほかに、下のような図を用いて表現します。
- バウンダリ
-
アクターが操作する画面やボタンなどの要素です。
バウンダリは、アクターもしくはコントロールから操作されます。 - エンティティ
-
システム内部で管理するデータです。
基本的に、一度作られたら削除されないデータとします。
エンティティは、コントロールからのみ生成、使用ができます。 - コントロール
-
バウンダリとエンティティをつなぐ処理です。
コントロールは、コントロール同士とバウンダリのみ繋ぐことができます。
CRC技法
CRCとはClass Responsibility Collaboratorの頭文字で、クラスごとの責務と、その責務を果たすために関連するクラスを分析する技法です。
この技法では、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(要素) | 指定した要素がすべて含まれる場合、真 |
まとめ
このページで紹介した本
いかがだったでしょうか!
参考になりましたか??
足りない部分は、ぜひ質問しに来てください!!!