プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • オブジェクト指向
  • 【UML】UMLの種類、クラス図の基本
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【UML】UMLの種類、クラス図の基本

05.06

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

UMLの種類

幅広い用途を想定しているのでたくさんの図がある。1990年代後半に統一する目的で考案された。

構造化言語の時代では

構造化言語の時代ではシーケンス図も、コミュニケーション図もどちらも必要はなかった。構造化チャートや、フローチャート(流れ図)でほぼ静的なものと、動的な表現がどちらもできたため。

クラス図

クラス間の関係を表現

ユースケース

プログラムの構造や動作を表現するために使われる代表的な図、ソースコードの静的な情報を再現します。(継承、集約、インターフェースなど)

複合構造図

全体部分構造を持つクラス実行時の構造を表現する

コンポーネント図

ファイル、データベース、プロセスやスレッドなどのソフトウェアの実装構造を表現する。

配置図

ハードウェアやネットワークなど、システムの物理構造を表現する。

オブジェクト図

インスタンス間の関係を表現する。イメージとしてはクラス図をより具体化した図で設計資料というよりは実装の補助的な役割ために使います。

パッケージ図

パッケージ間の関係を表現する。

アクティビティ図

一連の処理における制御の流れを表現する。オブジェクト指向登場前から使われてきたフローチャート(流れ図)の発展形。

ユースケース

現実の仕事の流れを表現したい場合に使います。

シーケンス図

インスタンス間の相互作用を時系列に表現する。メソッドの呼び出しを時系列に表現します。長方形にはインスタンスの名前を記述します。

ユースケース

プログラムの構造や動作を表現するために使われる代表的な図、ソースコードの動的な情報を再現します。

コミュニケーション図

実行時のインスタンス間の相互作用(メソッド呼び出し)をインスタンスの関係を中心に表現する。基本的にシーケンス図と同じ情報を表現する。

ユースケース

プログラムの構造や動作を表現するために使われる代表的な図、ソースコードの動的な情報を再現します。

相互作用概要図

条件によって異なる動作をするシーケンス図を、アクティビティ図の中に含めることによって表現する。

タイミング図

インスタンス間の状態遷移や、相互作用を時間制約付きで表現する。

ユースケース図

システムが提供する機能と利用者の関係を表現する。

ユースケース

コンピュータに任せる仕事の範囲を表現したい場合に使う。

ステートマシン図

インスタンスの状態変化を表現する。通信や組み込みなどの制御系のソフトウェア分野で従来から使われてきた。状態遷移図に近い。

外部からのイベントにより、物の状態が変化していく様子を表現します。

クラス図とは?

従来の構造化プログラミングにはなかった概念を表現するために作られた図になります。

主に以下のようなオブジェクト指向の概念を意識して作っていくことになることが多いでしょう。

  • 汎化、特化(継承)
  • 関連
  • 集約
  • コンポジション(「合成集約」ともよぶ。)
  • 実現(インターフェース)

汎化、特化

親と子のように継承関係のある関係のことを指します。

クラス図で表現すると、下記のような白抜きの矢印になり、子クラス(サブクラス)から、親クラス(スーパークラス)へ対して矢印を伸ばします。

is-a関係

「子クラスが、親クラスの一種になっている関係のこと」ということで、「is-a関係」と呼んだりもします。

  • 犬は動物である。(dog is a animal.)
  • 日本人は人である。(Japanese is a people.)

関連

何かしらモデル同士に関連がある場合を指します。条件が加わっていくと「集約」や「コンポジション」などと特化した呼び方になっていきます。

ユースケースとしては、二つのモデルは何かしら関連はあるけどまだ設計段階で明確に決まっていない場合は関連にとどめます。もう少し具体化できる段階になったら「集約」や「コンポジション」を使って表現していくとより良いでしょう。

集約

集約は、全体と部分の関係になります。コンポジションと似ていますがコンポジションとは独立しており強い結びつきはありません。

「あるクラスが、別のクラスをフィールドとして利用している関係のこと」で、「has-a関係」と呼んだりします。

People
1
2
3
4
5
6
7
8
9
10
11
public class People {
 
String name; //名前
int weight = 60;  //体重
Book book; //本
 
void weightAsk() {
System.out.println("私の体重は" + this.weight + "kgです。");
}
 
}

Book
1
2
3
4
5
6
public class Book {
 
String name;
int totalPage;
 
}

クラス図で表現すると、下記のような関係になります。

例

空港と飛行機

空港が廃業になったとしても飛行機は別の空港に引き取られるかもしれません。

会社と社員

会社が倒産しても社員は死にませんし、別の会社に転職する可能性もあります。

  • クラスと生徒
  • 森と木

実装的には

クラスの外部でnewをするので二つのクラス間でかなり依存度が下がります。、なのでDIの観点からすると集約は良い設計と言えるでしょう。

コンポジション(合成集約)

集約の一種です。集約と似ていますが、二つの間の関係に強い結びつきがある場合を指します。

例

車とエンジン

車はエンジンがなくては動かないですし、破棄するときはどちらも破棄されます。

社員と社員証

社員が入社したら社員証が発行されて、社員が退職するタイミングで社員証もなくなるため。

  • 注文と注文明細
  • 家と部屋
  • 人と手足

実装的には

クラスの内部でnewをするので二つのクラス間でかなり依存度が上がります。(車クラスの内部でエンジンクラスをnewしたり)、なのでDIの観点からするとあまり良くないと言えるかもです。

関連、集約、コンポジションの違い

図にすると以下のような感じになります。

実現

例えば、下記のように鳥インターフェイスを、実装した鳩クラスがあったとすれば、その関係は「実現関係」にあるといいます。

1
2
3
4
5
public interface Tori {
 
public abstract void tobu();
 
}

1
2
3
4
5
6
7
public class Hato implements Tori{
 
public void tobu() {
System.out.println("鳩は飛びます。");
}
 
}

クラス図で表すのであれば、下記のような形になります。

スポンサーリンク
  • 2018 05.06
  • miyabisan2
  • コメントを書く
  • オブジェクト指向
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2021 08.28

    【オブジェクト指向】「SOLIDの原則」の概要

  2. 2022 03.26

    【オブジェクト指向】「単一責任の原則」

  3. 2018 04.30

    【Java】オブジェクト指向:カプセル化

  4. 2022 05.21

    【オブジェクト指向】「インターフェース分離の原則」について

  5. 2021 08.17

    【オブジェクト指向】ベストプラクティス(デメテルの法則なども)

  6. 2018 05.12

    【GoFのデザインパターン】「Singleton(シングルトン)」ってどんなパターン?、注意点なども。

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Java】System.out.printlnって何…

【Spring Framework】DI(依存性の注入…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー