C4モデル概要
C4モデルは、ソフトウェアシステムのアーキテクチャをモデリングするための簡潔なグラフィカル表記法です。Simon Brownによって考案され、異なる抽象度レベルでソフトウェアアーキテクチャを伝達する方法を提供します。
なぜC4なのか?
従来のアーキテクチャダイアグラムは以下のような問題を抱えがちです:
- 一貫性のない表記法: チームごとに異なるシンボルを使用
- 不適切な詳細レベル: 抽象的すぎるか詳細すぎるか
- 古いドキュメント: ダイアグラムが現実を反映していない
C4モデルはこれらの問題に以下の方法で対処します:
- 標準化された抽象化レベル: 高から低まで4つの明確なレベル
- シンプルな表記法: 技術者・非技術者の両方が理解しやすい
- 階層的なナビゲーション: 詳細を見るためにズームイン、コンテキストを見るためにズームアウト
4つのレベル
レベル1: システムコンテキスト
システムコンテキストダイアグラムは、あなたのシステムを中央のボックスとして表示し、その周囲にユーザーと対話する他のシステムを配置します。
目的: 全体像を示す — あなたのシステムがどのように世界に適合するか
対象者: 全員(技術者・非技術者)
含まれるもの:
- ソフトウェアシステム(中央)
- システムを使用するユーザー/ペルソナ
- システムが依存する外部システム
レベル2: コンテナ
コンテナダイアグラムは、システム内部にズームインして高レベルの技術的構成要素を表示します。
目的: 主要な技術選択と責務の分配方法を示す
対象者: 開発チーム内外の技術者
含まれるもの:
- コンテナ(アプリケーション、データストアなど)
- コンテナ間のリレーションシップ
- 外部システムへの接続
レベル3: コンポーネント
コンポーネントダイアグラムは、コンテナ内部にズームインしてその内部コンポーネントを表示します。
目的: コンテナがどのようなコンポーネントで構成され、それぞれの責務を示す
対象者: ソフトウェアアーキテクトと開発者
含まれるもの:
- コンテナ内のコンポーネント
- コンポーネント間のリレーションシップ
- 技術/実装の選択
レベル4: コード
コードダイアグラム(オプション)は、コンポーネントの実装方法を示します。
目的: 複雑または重要なコンポーネントのコードレベルの詳細を示す
対象者: 開発者
含まれるもの:
- クラス、インターフェース、関数
- 継承と実装のリレーションシップ
- デザインパターン
ArchylでのC4
Archylは以下の機能でC4モデルを実装しています:
ナビゲーション
- 任意の要素をダブルクリックして次のレベルにズームイン
- パンくずリストを使用して上位レベルに戻る
- クイックナビゲーション用のキーボードショートカット(← → ↑ ↓)
要素タイプ
各レベルには固有の要素タイプがあります:
| レベル | 要素タイプ |
|---|---|
| システムコンテキスト | システム、外部システム、ペルソナ |
| コンテナ | コンテナ、外部コンテナ |
| コンポーネント | コンポーネント |
| コード | クラス、インターフェース、関数 |
リレーションシップ
リレーションシップは任意のレベルの要素間に作成できます:
- ある要素から別の要素にドラッグ
- インタラクションを説明するラベルを追加
- 使用技術を指定
スタイリング
ダイアグラムの外観をカスタマイズ:
- 要素タイプごとの色分け
- カスタムアイコン
- オーバーレイによるグループ化
ベストプラクティス
トップから始める
常にシステムコンテキストダイアグラムから始めましょう。以下について考えることを促します:
- 誰がシステムを使用するか?
- どの外部システムに依存しているか?
- システムのスコープは何か?
シンプルに保つ
各ダイアグラムは1ページ/画面に収まるべきです。収まらない場合:
- 複数のダイアグラムに分割
- 詳細レベルを下げる
- より詳細には次のレベルを使用
一貫した命名規則
- わかりやすく説明的な名前を使用
- チームの命名規則に従う
- 広く理解されていない略語を避ける
リレーションシップを文書化する
リレーションシップは要素と同じくらい重要です:
- 常にインタラクションを説明するラベルを追加
- 該当する場合は技術/プロトコルを含める
- 通信の方向を示す
次のステップ
- システムコンテキスト - レベル1の詳細
- コンテナダイアグラム - レベル2の詳細
- コンポーネントダイアグラム - レベル3の詳細
- リレーションシップ - 要素の接続方法