C4モデルとは

ソフトウェアのアーキテクチャを表現するためのモデル。

  • コンテキスト(context)
  • コンテナ(containers)
  • コンポーネント(components)
  • コード(code) で構成される。

C4モデルは特別な表記法を規定していない。以下、ダイアグラムの図はThe C4 model for visualising software architectureを参考に作成した。

flowchart TD
	ソフトウェアシステム:::system
	ソフトウェアシステム --> containerA(コンテナ)
	ソフトウェアシステム --> containerB(コンテナ)
	ソフトウェアシステム --> containerC(コンテナ)
	componentA1:::dot
	containerA:::dot --> componentA1(コンポーネント)
	componentA:::dot
    containerB --> componentA(コンポーネント)
	containerB --> componentB(コンポーネント)
	containerB --> componentC(コンポーネント)
	containerB:::container
	componentC:::dot
 	componentA2:::dot
	containerC:::dot --> componentA2(コンポーネント)
	componentB --> codeA(コード)
	componentB --> codeB(コード)
	componentB --> codeC(コード)
	componentB:::component
	codeA:::code
	codeB:::code
	codeC:::code
	classDef dot fill:#eef,stroke:#f66,stroke-width:2px,color:#aaa,stroke-dasharray: 5 5
	classDef system fill:#faa,stroke:#333,color:#fff,stroke-width:4px
	classDef container fill:#44f,stroke:#333,color:#fff,stroke-width:4px
	classDef component fill:#77f,stroke:#333,color:#fff,stroke-width:4px
	classDef code fill:#aaf,stroke:#333,color:#fff,stroke-width:4px

レベル1 システムコンテキスト ダイアグラム

対象システムが、それを使用する人や関連する他システムとの関係性、どのような位置づけにあるかを図示する。

flowchart TD
	pbc(((銀行の顧客))) --> |口座残高参照,支払いに使用|ibs(インターネットバンキングシステム):::system
	ibs --> |口座情報取得,支払いに使用|mbs(メインフレームバンキングシステム)
	ibs --> |メール送信に使用|es(E-mailシステム)
	es --> |メール送信|pbc
	classDef system fill:#faa,stroke:#333,color:#fff,stroke-width:4px

システムコンテキスト ダイアグラムの例

レベル2 コンテナ ダイアグラム

ソフトウェアシステムを拡大したもので、それを構成するコンテナ(アプリケーション、データストア、マイクロサービスなど)を図示する。

flowchart TB
	subgraph インターネットバンキングシステム
		direction TB
		wa(Webアプリケーション\nJava ans Spring MVC):::container
		spa(シングルページアプリケーション\nJavaScript and Angular):::container
		mba(モバイルアプリケーション\nXamarin):::container
		wa --> |顧客のブラウザへ配信|spa
		spa --> |API呼び出し JSON,HTTPS|api(APIアプリケーション\nJava ans Spring MVC):::container
		mba --> |API呼び出し JSON,HTTPS|api
		api --> |読み込み, 書き込み|db[(データベース\nOracle Database)]:::container
	end
	pbc(((銀行の顧客)))
	pbc --> |サイトを開き使用|wa
	pbc --> |口座残高参照,支払いに使用|spa
	pbc --> |口座残高参照,支払いに使用|mba
	es --> |メール送信|pbc
	api --> |メール送信に使用|es(E-mailシステム)
	api --> |API呼び出し XML,HTTPS|mbs(メインフレームバンキングシステム)
	classDef container fill:#44f,stroke:#333,color:#fff,stroke-width:4px

コンテナ ダイアグラムの例

レベル3 コンポーネント ダイアグラム

個々のコンテナにズームインし、その中のコンポーネントを表示する。コードベースのなかの実際の抽象概念(たとえば、コードのグループ化など)にマップする。

flowchart TB
	spa(シングルページアプリケーション\nJavaScript and Angular):::container
	mba(モバイルアプリケーション\nXamarin):::container
	subgraph APIアプリケーション
		sic(サインインコントローラ\nSprint MVC Rest Controller):::component
		sic --> |使用する|sc(セキュリティコンポーネント\nSpring Bean):::component
		rpc(パスワードリセットコントローラ):::component
		rpc --> |使用する|sc
		rpc --> |使用する|ec(E-mailコンポーネント):::component
		asc(アカウントサマリコントローラ\nSprint MVC Rest Controller):::component
		asc --> |使用する|mbsf(メインフレームバンキング\nシステムFacade\nSprint Bean):::component
	end
	spa --> |APIコール\nJSON, HTTPS|sic
	spa --> |APIコール\nJSON, HTTPS|rpc
	spa --> |APIコール\nJSON, HTTPS|asc
	mba --> |APIコール\nJSON, HTTPS|sic
	mba --> |APIコール\nJSON, HTTPS|rpc
	mba --> |APIコール\nJSON, HTTPS|asc
	sc --> |読み込み,書き込み|db[(データベース\nOracle Database)]:::container
	ec --> |メール送信で使用|es(E-mailシステム)
	mbsf --> |APIコール\nXML, HTTPS|mbs(メインフレームバンキングシステム)
	classDef container fill:#44f,stroke:#333,color:#fff,stroke-width:4px
	classDef component fill:#77f,stroke:#333,color:#fff,stroke-width:4px

コンポーネント ダイアグラムの例

レベル4 コード

コンポーネントがどのように実装されているかを示す。

---
title: com.bigbankplc.intenetbanking.componet.mainframe
---
classDiagram
	MainframeBankingSystemFacadeImpl ..> BankingSystemConnection : +uses
	MainframeBankingSystemFacadeImpl ..> GetBalanceRequest : +creates
	MainframeBankingSystemFacadeImpl ..> GetBalanceResponse: +parses
	MainframeBankingSystemFacadeImpl ..> MainframeBankingSystemException : +throws
	BankingSystemConnection ..> AbstractRequest : +sends
	BankingSystemConnection ..> AbstractResponse : +receives
	MainframeBankingSystemException --|> InternetBankingSystemException
	GetBalanceRequest --|> AbstractRequest
	GetBalanceResponse --|> AbstractResponse

参考