218.6K Views
April 29, 25
スライド概要
「持続可能なソフトウェア」の探求がライフワーク。C#、.NET、WPFあたりが住処。Microsoft MVP for Development Technologies(2017/01〜)。
世界一わかりやすいClean Architecture ~ 技術レイヤー分割より大切なモノ ~ Atsushi Nakamura Copyright 2025 @nuits_jp
Easiest Clean Architecture Goals of this session Copyright 2025 @nuits_jp Slide 2
Goals of this session 全員が 「クリーンアーキテクチャチョットデキル」 ようになること Copyright 2025 @nuits_jp Slide 3
Easiest Clean Architecture Overview Copyright 2025 @nuits_jp Slide 4
Overview Clean Architectureの次の点についてお話させていただきます。 • 誤解されがちな二つのこと • Clean Architectureの本質 • 技術レイヤー分割より大切なこと • おさえるべき三つのこと Copyright 2025 @nuits_jp Slide 5 Slide 5
Easiest Clean Architecture 注意事項 Copyright 2025 @nuits_jp Slide 6
注意事項 今日お話しすることは、あくまで私の解釈です • 極端に要約しているので、これがすべてではありません • またあえて拡大解釈している箇所もあります • 書籍の記載とやや矛盾する点もあります しかし、私は今日お話しする内容こそ、Clean Architecture の本質だと思っています。 Copyright 2025 @nuits_jp Slide 7
異論・反論大歓迎 異論・反論大歓迎です。 ぜひご意見を聞かせてください。議論しましょう! Copyright 2025 @nuits_jp Slide 8
Easiest Clean Architecture About Me Copyright 2025 @nuits_jp Slide 9
About Me 中村 充志 / Atsushi Nakamura • • • • リコージャパン株式会社 所属 Enterprise(おもに金融)系SIerのITアーキテクト 最近はプロダクトオーナー風なことも 「持続可能なソフトウェア」の探求がライフワーク • Blog • Twitter(X) • GitHub https://zenn.dev/nuits_jp @nuits_jp https://github.com/nuitsjp Copyright 2025 @nuits_jp Slide 10
Easiest Clean Architecture Today’s Contents Copyright 2025 @nuits_jp Slide 11
ブログ 本日お話する内容は、下記のブログに原稿と合わせて公開します。 https://zenn.dev/nuits_jp/articles/2025-04-30-easiest-clean-architecture サンプルコードおよびPowerPointはGithubに「CC BY-SA 4.0」で公開してい ます。 https://github.com/nuitsjp/Easiest-Clean-Architecture Copyright 2025 @nuits_jp Slide 12
Easiest Clean Architecture 誤解されがちな二つのこと Copyright 2025 @nuits_jp Slide 13
Clean Architectureといえば・・・ 出典:The Clean Architecture https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html Copyright 2025 @nuits_jp Slide 14
この図が良くできてい過ぎて誤解を招く Copyright 2025 @nuits_jp Slide 15
ひとつ目の誤解 Clean Architectureとは 「関心をControllerやUse Case, Entityに分離しろ」 という意味ではないし 「レイヤーをこれらに分割しろ」 という意味でもない Copyright 2025 @nuits_jp Slide 16
ふたつ目の誤解 MVC Model(出展Wikipedia) 「データや処理の流れを一方通行にしろ」 という意味ではないし 「PresentationをMVC的に分離しろ(MVVMなどの否定)」 という意味でもない Copyright 2025 @nuits_jp Slide 17
では、どういう意味か? Copyright 2025 @nuits_jp Slide 18
本当に大切なことは一つだけ 「依存性は、内側(上位レベルの方針)だけに 向かっていなければいけない。」※ ※出典:Clean Architecture 達人に学ぶソフトウェアの構造と設計 Copyright 2025 @nuits_jp Slide 19
実現手段の図示 内側の変化に応じて、外側を呼び出したい場合どうすればよいのか? こうすればよい ※ ※ より厳密な意図は後述 Copyright 2025 @nuits_jp Slide 20
それあってますか? Copyright 2025 @nuits_jp Slide 21
はい(当者比) Copyright 2025 @nuits_jp Slide 22
Clean Architecture 発表前夜 当時、以下のようなArchitectureが着目されていました。 • Hexagonal Architecture • Onion Architecture • Screaming Architecture • DCI • BCE Copyright 2025 @nuits_jp Slide 23
Clean Architectureの図は・・・ Hexagonal architecture 共通する特徴をまとめ、汎化・例示したものにすぎない 汎化 Onion Architecture:https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/ Hexagonal architecture:https://en.wikipedia.org/wiki/Hexagonal_architecture_(software) Copyright 2025 @nuits_jp Slide 24
あくまで例示であると取れる記載もある Clean Architecture説明の冒頭に、著名なアーキテクチャ(Hexagonal, Onion, etc...)には類似の共通点が見られるとある。 そして続けてこう記載されている。 The diagram in Figure is an attempt at integrating all these architectures into a single actionable idea. (邦訳:図は、これらのすべてのアーキテクチャを単一の実行可能なアイデアに統合し たものである。) Copyright 2025 @nuits_jp Slide 25
すべてが同一アーキテクチャに帰結するとすれば 以下は、あくまで一例であることは自明 • レイヤーが4つ※1 • UIがMVC的である • Web限定 • Output PortはUse Caseとの間「だけ」にある※2 • などなど ※1 とは限らないと書籍にも明記されている ※2 eventみたいなPub/SubがUse Case限定じゃ困っちゃう Copyright 2025 @nuits_jp Slide 26
あの図は・・・ 全てのアーキテクチャはClean Architectureで説明可能であることを例示 したモデル。 Clean Architectureを採用したソフトウェアの具体例の一つにすぎない Copyright 2025 @nuits_jp Slide 27
著者は明言しています - The architecture rules are the same! (邦訳:アーキテクチャのルールはどれも同じである!) Copyright 2025 @nuits_jp Slide 28
誤解を恐れず言えば・・・ Copyright 2025 @nuits_jp Slide 29
誤解を恐れず言えば・・・ • 「あの図」の構成要素に本質的な価値はない • 本当に価値があるのは以下である • 「あの図」が実現しようとした目的 • 「あの図」に至った背景 • 「あの図」を実現する手段 Copyright 2025 @nuits_jp Slide 30
誤解を恐れず言えば・・・ • 「あの図」の構成要素に本質的な価値はない • 本当に価値があるのは以下である • 「あの図」が実現しようとした目的 • 「あの図」に至った背景 • 「あの図」を実現する手段 Copyright 2025 @nuits_jp Slide 31
目的とは 以下のような状態を実現すること 1. フレームワーク非依存 2. テスト可能 3. UI非依存 4. データベース非依存 5. 外部エージェント非依存 Copyright 2025 @nuits_jp Slide 32
一読の価値あり 目的・背景・手段 が凝縮されている Copyright 2025 @nuits_jp Slide 33 Slide 33
Easiest Clean Architecture おさえるべき三つのこと Copyright 2025 @nuits_jp Slide 34
おさえるべき三つのこと 1. 依存性は、より上位レベルの方針にのみ向けよ Copyright 2025 @nuits_jp Slide 35
おさえるべき三つのこと 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ Copyright 2025 @nuits_jp Slide 36
おさえるべき三つのこと 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ 3. 上位レベルとは相対的・再帰的であることに留意せよ Copyright 2025 @nuits_jp Slide 37
Easiest Clean Architecture さあ具体例を見てみよう! Copyright 2025 @nuits_jp Slide 38
Application Overview ※ アプリケーション「HatPepper」 • 位置情報から周辺の店舗を検索する 「コンソールアプリケーション」 • 「リクルートWebサービス」の 「グルメサーチAPI」を利用させてい ただく (いつもお世話になっております。) ※「ホットペッパー」は株式会社リクルート様の登録商標です。 ※「HatPepper」は登録商標ではありません。安心。 Copyright 2025 @nuits_jp Slide 39
Easiest Clean Architecture Layered Architecture Copyright 2025 @nuits_jp Slide 40
コンポーネント図 Copyright 2025 @nuits_jp Slide 41
クラス図 Copyright 2025 @nuits_jp Slide 42
クラス図 Copyright 2025 @nuits_jp Slide 43
クラス図 Copyright 2025 @nuits_jp Slide 44
シーケンス図 Copyright 2025 @nuits_jp Slide 45
シーケンス図 一見、そんなに 悪くなさげ? Copyright 2025 @nuits_jp Slide 46
シーケンス図 一見、そんなに 悪くなさげ? 何が悪いのか? Copyright 2025 @nuits_jp Slide 47
安定度と柔軟性のバランス配分に問題あり Copyright 2025 @nuits_jp Slide 48
柔軟性と安定度 柔軟性 安定度 Copyright 2025 @nuits_jp 高 低 中 中 低 高 Slide 49
依存関係による安定度と柔軟性のトレードオフ Copyright 2025 @nuits_jp Slide 50
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 安定度 柔軟性 Copyright 2025 @nuits_jp Slide 51
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 変更! 安定度 柔軟性 Copyright 2025 @nuits_jp Slide 52
依存関係による安定度と柔軟性のトレードオフ 影響発生 依存する側 依存される側 変更! 安定度 柔軟性 Copyright 2025 @nuits_jp Slide 53
依存関係による安定度と柔軟性のトレードオフ 影響発生 依存する側 安定度 依存される側 変更! 低 高 柔軟性 Copyright 2025 @nuits_jp Slide 54
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 低 高 変更! 安定度 柔軟性 Copyright 2025 @nuits_jp Slide 55
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 低 高 別に興味 ないなあ… 変更! 安定度 柔軟性 Copyright 2025 @nuits_jp Slide 56
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 安定度 低 高 柔軟性 高 低 別に興味 ないなあ… 変更! Copyright 2025 @nuits_jp Slide 57
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 安定度 低 高 柔軟性 高 低 安定度と柔軟性は トレードオフ! Copyright 2025 @nuits_jp Slide 58
逆説的に考えると・・・ Copyright 2025 @nuits_jp Slide 59
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 安定度 低 高 柔軟性 高 低 変更頻度の高いオブジェクトは、依存する側に設計すべし Copyright 2025 @nuits_jp Slide 60
依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 安定度 低 高 柔軟性 高 低 アプリケーションの本質的な価値を提供するオブジェク トは、軽微な変更の影響を受けてはいけない。 つまり依存される側に設計すべし。 Copyright 2025 @nuits_jp Slide 61
さて、振り返ってみよう Copyright 2025 @nuits_jp Slide 62
柔軟性と安定度 柔軟性 安定度 依存の方向 Copyright 2025 @nuits_jp 高 低 中 中 低 高 Slide 63
どこの柔軟性がもっとも重要ですか? Copyright 2025 @nuits_jp Slide 64
柔軟性と安定度 柔軟性 安定度 高 低 中 中 低 高 最重要 Copyright 2025 @nuits_jp Slide 65
このアプリケーションの本質的な価値とは? Copyright 2025 @nuits_jp Slide 66
Application Overview ※ アプリケーション「HatPepper」 • 位置情報から周辺の店舗を検索する 「コンソールアプリケーション」 • 「リクルートWebサービス」の これこそが価値の本質 「グルメサーチAPI」を利用させてい ただく (いつもお世話になっております。) ※「ホットペッパー」は株式会社リクルート様の登録商標です。 ※「HatPepper」は登録商標ではありません。安心。 Copyright 2025 @nuits_jp Slide 67
柔軟性と安定度 柔軟性 安定度 高価値 Copyright 2025 @nuits_jp 高 低 中 中 低 高 Slide 68
柔軟性と安定度 柔軟性 安定度 高 高価値 低 中→低 中→高 低→高 高→低 Copyright 2025 @nuits_jp Slide 69
柔軟性と安定度 柔軟性 安定度 依存の方向 高 低 中→低 中→高 低→高 高→低 Copyright 2025 @nuits_jp Slide 70
Easiest Clean Architecture 依存性は、より上位レベルの方針にのみ向けよ Copyright 2025 @nuits_jp Slide 71
柔軟性と安定度 柔軟性 安定度 依存の方向 高 低 中→低 中→高 低→高 高→低 Copyright 2025 @nuits_jp Slide 72
実現可能なのか? Copyright 2025 @nuits_jp Slide 73
柔軟性と安定度 柔軟性 安定度 依存の方向 制御の方向 高 低 中→低 中→高 低→高 高→低 Copyright 2025 @nuits_jp Slide 74
Easiest Clean Architecture 制御の流れと依存関係の分離 Copyright 2025 @nuits_jp Slide 75
制御の流れと依存関係の分離 一般的に 凡例 制御の流れ=依存方向 になりがち 制御の流れ 依存方向 <<具象概念>> <<具象概念>> クライアント オブジェクト サーバー オブジェクト Copyright 2025 @nuits_jp Slide 76
制御の流れと依存方向は分離しコントロールできる Copyright 2025 @nuits_jp Slide 77
制御の流れと依存関係の分離 そのためには関係のコントラクト(契約・仕様・お約束) 凡例 のコンテキスト(文脈)を制御する 制御の流れ 依存方向 <<具象概念>> クライアント オブジェクト <<抽象概念>> コントラクト <<具象概念>> サーバー オブジェクト それぞれの具象概念は抽象的な契約(仕様)に依存する Copyright 2025 @nuits_jp Slide 78
契約の文脈をコントロールする <<具象概念>> クライアント オブジェクト <<抽象概念>> コントラクト <<具象概念>> サーバー オブジェクト 凡例 制御の流れ 依存方向 文脈 Copyright 2025 @nuits_jp Slide 79
契約の文脈をコントロールする <<具象概念>> クライアント オブジェクト <<具象概念>> クライアント オブジェクト <<抽象概念>> コントラクト <<具象概念>> サーバー オブジェクト <<具象概念>> <<抽象概念>> コントラクト サーバー オブジェクト 凡例 制御の流れ 依存方向 文脈 Copyright 2025 @nuits_jp Slide 80
契約の文脈をコントロールする <<具象概念>> クライアント オブジェクト <<具象概念>> クライアント オブジェクト <<抽象概念>> コントラクト <<具象概念>> サーバー オブジェクト <<具象概念>> <<抽象概念>> コントラクト 依存性逆転の原則 サーバー オブジェクト 凡例 制御の流れ 依存方向 文脈 Copyright 2025 @nuits_jp Slide 81
具体例を見てみよう Copyright 2025 @nuits_jp Slide 82
柔軟性と安定度 この部分の 「コントラクト」 に注目する Copyright 2025 @nuits_jp Slide 83
クラス図 Copyright 2025 @nuits_jp Slide 84
クラス図 APIクライアントの 呼び出しにフォーカ スしてみる Copyright 2025 @nuits_jp Slide 85
シーケンス図 Copyright 2025 @nuits_jp Slide 86
クラス図 依存させたい方向 ここが 「コントラクト」 Copyright 2025 @nuits_jp Slide 87
クラス図 依存させたい方向 二つの問題がある ここが 「コントラクト」 Copyright 2025 @nuits_jp Slide 88
ひとつ コントラクトがGateway側に定義されている Copyright 2025 @nuits_jp Slide 89
ふたつめ コントラクトがWeb APIの文脈で記述されている Copyright 2025 @nuits_jp Slide 90
クラス図 { "results": { "results_start": 1, "results_returned": "2", "api_version": "1.26", "shop": [ { "name": "彩羽鶏 いろはどり 新宿東口店", "genre": { "catch": "新宿 月あかり 個室 居酒屋…", … }, "budget": { "average": "2500円(通常平均)…", "name": "2001~3000円", "code": "B002" }, "mobile_access": "JR新宿駅東口より徒1分… Copyright 2025 @nuits_jp Slide 91
どうすれば? Copyright 2025 @nuits_jp Slide 92
契約の文脈をコントロールする <<具象概念>> 変更前 Application <<抽象概念>> コントラクト Copyright 2025 @nuits_jp <<具象概念>> Gateway Slide 93
契約の文脈をコントロールする <<具象概念>> 変更前 変更後 Application <<具象概念>> Application <<抽象概念>> コントラクト <<抽象概念>> コントラクト Copyright 2025 @nuits_jp <<具象概念>> Gateway <<具象概念>> Gateway Slide 94
というわけで・・・ Copyright 2025 @nuits_jp Slide 95
クラス図 Copyright 2025 @nuits_jp Slide 96
クラス図 Copyright 2025 @nuits_jp Slide 97
クラス図 Copyright 2025 @nuits_jp Slide 98
クラス図 循環参照 Copyright 2025 @nuits_jp Slide 99
クラス図 Copyright 2025 @nuits_jp Slide 100
クラス図 Copyright 2025 @nuits_jp Slide 101
クラス図 Copyright 2025 @nuits_jp Slide 102
クラス図 依存の方向 制御の方向 Copyright 2025 @nuits_jp Slide 103
本当に実装できるの? Copyright 2025 @nuits_jp Slide 104
クラス図 Copyright 2025 @nuits_jp Slide 105
クラス図 Copyright 2025 @nuits_jp Slide 106
制御の流れと依存関係の分離 柔軟性 安定度 依存の方向 制御の方向 Copyright 2025 @nuits_jp 高 低 低 高 高 低 Slide 107
クラス図 Copyright 2025 @nuits_jp Slide 108
クラス図 Copyright 2025 @nuits_jp Slide 109
クラス図 Copyright 2025 @nuits_jp Slide 110
コンポーネント図 Copyright 2025 @nuits_jp Slide 111
アプリケーション構造 Controller Application Device Domain View HotPepper Copyright 2025 @nuits_jp Slide 112
おさえるべき三つのこと 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ 3. 上位レベルとは相対的・再帰的であることに留意せよ Copyright 2025 @nuits_jp Slide 113
視点を上げてみよう Copyright 2025 @nuits_jp Slide 114
Application Overview ※ アプリケーション「HatPepper」 • 位置情報から周辺の店舗を検索し 予約するグルメサイト • 「リクルートWebサービス」の 「グルメサーチAPI」を利用させてい ただく (いつもお世話になっております。) ※「ホットペッパー」は株式会社リクルート様の登録商標です。 ※「HatPepper」は登録商標ではありません。安心。 Copyright 2025 @nuits_jp Slide 115
コンテキストマップ HatPepper <core-domain> 検索 <core-domain> 予約 Copyright 2025 @nuits_jp <support-domain> ・・・・ Slide 116
コンテキストマップ HatPepper <core-domain> 検索 <core-domain> 予約 <bounded context> 検索App <bounded context> 予約App <bounded context> 検索Gateway <bounded context> 予約Gateway Copyright 2025 @nuits_jp <support-domain> ・・・・ Slide 117
コンテキストマップ HatPepper <generic-domain> HatPepper <bounded context> HotPepper <core-domain> 検索 <core-domain> 予約 <bounded context> 検索App <bounded context> 予約App <bounded context> 検索Gateway <bounded context> 予約Gateway Copyright 2025 @nuits_jp <support-domain> ・・・・ Slide 118
コンテキストマップ HatPepper <generic-domain> HatPepper <bounded context> HatPepper <bounded context> Orchestrator <core-domain> 検索 <core-domain> 予約 <bounded context> 検索App <bounded context> 予約App <bounded context> 検索Gateway <bounded context> 予約Gateway Copyright 2025 @nuits_jp <support-domain> ・・・・ Slide 119
コンテキストマップ HatPepper <generic-domain> HatPepper <bounded context> HatPepper <bounded context> Orchestrator <bounded context> Bootstrapper <core-domain> 検索 <core-domain> 予約 <bounded context> 検索App <bounded context> 予約App <bounded context> 検索Gateway <bounded context> 予約Gateway Copyright 2025 @nuits_jp <support-domain> ・・・・ Slide 120
コンテキストマップ HatPepper <generic-domain> HatPepper <bounded context> HatPepper <bounded context> Orchestrator <bounded context> Bootstrapper <core-domain> 検索 <core-domain> 予約 <bounded context> 検索App <bounded context> 予約App <bounded context> 検索Gateway <bounded context> 予約Gateway Copyright 2025 @nuits_jp <support-domain> ・・・・ Slide 121
Easiest Clean Architecture 上位レベルとは相対的・再帰的であることに留意せよ Copyright 2025 @nuits_jp Slide 122
ソフトウェアのフラクタル 境界付けられたコンテキスト 技術レイヤー 技術レイヤー Copyright 2025 @nuits_jp Slide 123
ソフトウェアのフラクタル サブドメイン 境界付けられたコンテキスト 境界付けられたコンテキスト 技術レイヤー 技術レイヤー 技術レイヤー 技術レイヤー Copyright 2025 @nuits_jp Slide 124
ソフトウェアのフラクタル ドメイン サブドメイン サブドメイン 境界付けられたコンテキスト 境界付けられたコンテキスト 技術レイヤー 技術レイヤー 技術レイヤー 技術レイヤー Copyright 2025 @nuits_jp Slide 125
ソフトウェアのフラクタル ドメイン サブドメイン 境界付けられたコンテキスト 技術レイヤー 技術レイヤー サブドメイン 境界付けられたコンテキスト 技術レイヤー 技術レイヤー ソ フ ト ウ ェ ア オ ブ ジ ェ ク ト ソフトウェア オブジェクトすべてに、ここまでの話は適用可能 • 要素間のインターフェースの文脈により、制御の流れと依存関係は制御可能 • 依存関係によって、安定性と柔軟性をコントロール可能 Copyright 2025 @nuits_jp Slide 126
アプリケーション構造 Controller Application Device Domain View HotPepper Copyright 2025 @nuits_jp Slide 127
コンテキストマップ HatPepper <generic-domain> HatPepper <bounded context> HatPepper <bounded context> Orchestrator <bounded context> Bootstrapper <core-domain> 検索 <core-domain> 予約 <bounded context> 検索App <bounded context> 予約App <bounded context> 検索Gateway <bounded context> 予約Gateway Copyright 2025 @nuits_jp <support-domain> ・・・・ Slide 128
コンテキストマップ <core-domain> 検索 <bounded context> 検索App <bounded context> 予約App <bounded context> 検索Gateway <bounded context> 予約Gateway Copyright 2025 @nuits_jp Slide 129
- The architecture rules are the same! - Copyright 2025 @nuits_jp Slide 130
Easiest Clean Architecture What is Software Architecture? Copyright 2025 @nuits_jp Slide 131
!ここからは私見成分高め! Copyright 2025 @nuits_jp Slide 132
ソフトウェア アーキテクチャといえば何を思い浮かべますか? 1. MVC 2. MVP 3. MVVM 4. MVPVM 5. クリーン アーキテクチャ 6. レイヤー アーキテクチャ 7. オニオン アーキテクチャ などなど これらはソフトウェア アーキテクチャの類型的なパターン群です Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 133
ソフトウェア アーキテクチャとは何か? ソフトウェアアーキテクチャでは、ソフトウェア システムの構成に関する一連 の重要な判断を網羅しています。これには、システムを構成する要素とイン ターフェイスの選択、要素間のコラボレーションとして指定される動作、この ような構成と動作の要素のより大きなサブシステムに対する構成、この構成の 指針となるアーキテクチャスタイルが含まれます。また、機能性、ユーザビリ ティ、復元性、パフォーマンス、再利用性、理解できること、経済的な制約、 テクノロジの制約、トレードオフ、および外観への配慮も必要です。 by Philippe Kruchten, Grady Booch, Kurt Bittner, Rich Reitman Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用 Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 134
ソフトウェア アーキテクチャとは何か? アーキテクチャは、システムを大きなレベルで分解したもので、決定事項の変 更は困難です。システムには複数のアーキテクチャが存在し、アーキテクチャ にとって重要な事項はシステムの運用中に変化します。要するに、重要な要素 は、すべてアーキテクチャということになります。 by Martin Fowler Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用 Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 135
ソフトウェア アーキテクチャとは何か? ソフトウェアアーキテクチャとは、抽象化と問題の分割によって複雑性を減ら すことを主に念頭に置いたものである。ただし、今までのところ、「ソフト ウェアアーキテクチャ」という用語に関して、万人が合意した厳密な定義は存 在しない Wikipedia「ソフトウェアアーキテクチャ」より引用 Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 136
とは言え、おおよその共通認識はある Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 137 Slide 137
ソフトウェア アーキテクチャとは何か?かみ砕くと… 1. ソフトウェアアーキテクチャとは システムアーキテクチャのうち、ソフトウェア領域のアーキテク チャである この時「システム」とは「IT」だけではなく、それらを取り巻く社 会やビジネスを含めた「仕組み」を指すことも多い ※ 元来「System」とは制度・組織・体系・系統などのこと Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 138
ソフトウェア アーキテクチャとは何か?かみ砕くと… 2. ソフトウェア アーキテクチャとは 1. ソフトウェアにおける重要な決定事項全てである 2. その中でも特につぎの2点が重要 1. ソフトウェア全体を、どのように分割するか 2. 分割した部分同士を、どう結合し相互作用させるか Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 139
ソフトウェア アーキテクチャとは何か?かみ砕くと… 3. ソフトウェアアーキテクチャを構築するのはなぜか? • 「システムの実現をサポートする」 • 「持続可能なソフトウェア」を • 「バランスよく」構築するため 4. ソフトウェアアーキテクチャのバランスとは? 1. Quality(機能・非機能) 2. Cost 3. Delivery(開発期間) アーキテクチャは非機能要求からも大きく影響をうける Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 140
ソフトウェア アーキテクチャとは何か?かみ砕くと… 5. Clean Architectureによると・・・ アーキテクチャは、次のものを与えてくれます • フレームワーク非依存 • テスト可能 • UI非依存 • データベース非依存 • 外部エージェント非依存 Copyright 2025 @nuits_jp Slide 141
Easiest Clean Architecture Clean Architectureを考えるうえで重要なポイント Copyright 2025 @nuits_jp Slide 142
ソフトウェア アーキテクチャとは何か?かみ砕くと… 2. ソフトウェア アーキテクチャとは 1. ソフトウェアにおける重要な決定事項全てである 2. その中でも特につぎの2点が重要 1. ソフトウェア全体を、どのように分割するか 2. 分割した部分同士を、どう結合し、相互作用させるか Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 143
ソフトウェア アーキテクチャとは何か?かみ砕くと… 2. ソフトウェア アーキテクチャとは 1. ソフトウェアにおける重要な決定事項全てである 2. その中でも特につぎの2点が重要 1. ソフトウェア全体を、どのように分割するか 2. 分割した部分同士を、どう結合し、相互作用させるか ソフトウェアアーキテクチャ3種の神器 Copyright 2025 @nuits_jp Copyright 2017 @nuits_jp Slide 144
ソフトウェアアーキテクチャ3種の神器 1. 関心の分離(SoC:Separation of concerns) 2. 疎結合 3. 依存性逆転の原則 Copyright 2025 @nuits_jp Slide 145
ソフトウェア アーキテクチャの3種の神器 上位の関心 Copyright 2025 @nuits_jp Slide 146
ソフトウェア アーキテクチャの3種の神器 上位の関心 関心の分離 個別の関心 個別の関心 Copyright 2025 @nuits_jp Slide 147
ソフトウェア アーキテクチャの3種の神器 上位の関心 関心の分離 上位の関心 個別の関心 ドメイン 個別の関心 サブドメイン個別の関心 サブドメイン 境界付けられたコンテキスト 境界付けられたコンテキスト 技術レイヤー Copyright 2025 @nuits_jp Slide 148
ソフトウェア アーキテクチャの3種の神器 上位の関心 直交する関心に注意 関心の分離 上位の関心 個別の関心 ドメイン 個別の関心 サブドメイン個別の関心 サブドメイン 境界付けられたコンテキスト 境界付けられたコンテキスト 技術レイヤー Copyright 2025 @nuits_jp Slide 149
ソフトウェア アーキテクチャの3種の神器 上位の関心 関心の分離 個別の関心 個別の関心 Copyright 2025 @nuits_jp Slide 150
ソフトウェア アーキテクチャの3種の神器 上位の関心 関心の分離 疎結合 個別の関心 コントラクト (≒Interface) Copyright 2025 @nuits_jp 個別の関心 Slide 151
ソフトウェア アーキテクチャの3種の神器 上位の関心 関心の分離 疎結合 個別の関心 コントラクト (≒Interface) 個別の関心 依存性逆転の原則 ( 上位の安定度と、下位の柔軟性を高めよ) Copyright 2025 @nuits_jp Slide 152
What is Clean Architecture? Copyright 2025 @nuits_jp Slide 153
Clean Architecture is ... クリーンアーキテクチャとは 「ソフトウェアアーキテクチャ3種の神器を適用した リファレンスアーキテクチャのひとつ」 Copyright 2025 @nuits_jp Slide 154
Easiest Clean Architecture まとめ Copyright 2025 @nuits_jp Slide 155
まとめ Clean Architectureとは、どんなソフトウェアにも適用可能な 普遍的なアーキテクチャの原則である Copyright 2025 @nuits_jp Slide 156
Clean Architecture is ... クリーンアーキテクチャとは 「ソフトウェアアーキテクチャ3種の神器を適用した リファレンスアーキテクチャのひとつ」 Copyright 2025 @nuits_jp Slide 157
ソフトウェア アーキテクチャの3種の神器 上位の関心 関心の分離 疎結合 個別の関心 コントラクト (≒Interface) 個別の関心 依存性逆転の原則 ( 上位の安定度と、下位の柔軟性を高めよ) Copyright 2025 @nuits_jp Slide 158
おさえるべき三つのこと 1. 依存性は、より上位レベルの方針にのみ向けよ Copyright 2025 @nuits_jp Slide 159
おさえるべき三つのこと 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ Copyright 2025 @nuits_jp Slide 160
おさえるべき三つのこと 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ 3. 上位レベルとは相対的・再帰的であることに留意せよ Copyright 2025 @nuits_jp Slide 161
誤解されがちな二つのこと Clean Architectureは、次のふたつを誤解されがち 1. 参考図の通りに関心を分離するのがClean Architectureである 2. データや処理の流れを一方通行にしろ 上記は、陥りがちな誤りであり、Clean Architectureの本質とは異なり ます。 Copyright 2025 @nuits_jp Slide 162
Clean Architectureの本当の価値 • 「この図」が実現しようとした目的 • 「この図」に至った背景 • 「この図」を実現する手段 Copyright 2025 @nuits_jp Slide 163
一読の価値あり 目的・背景・手段 が凝縮されている Copyright 2025 @nuits_jp Slide 164 Slide 164
という訳で・・・ Copyright 2025 @nuits_jp Slide 165
Today’s Goal みなさん 「クリーンアーキテクチャチョットデキル」 ようになりましたね? Copyright 2025 @nuits_jp Slide 166
Thank You! Any Questions? Copyright 2025 @nuits_jp Slide 167