SlideShare a Scribd company logo
1 of 161
Copyright 2020 @nuits_jp
世界一わかりやすいClean Architecture
~ 誤解されがちな二つのことと、おさえるべき三つのことと本質 ~
Atsushi Nakamura
Copyright 2020 @nuits_jp Slide 2
Easiest Clean Architecture
Overview
Copyright 2020 @nuits_jp Slide 3
Clean Architectureの次の点についてお話させていただきます。
• 誤解されがちな二つのこと
• Clean Architectureの本質
• おさえるべき三つのこと
Overview
Slide 3
Copyright 2020 @nuits_jp Slide 4
Easiest Clean Architecture
注意事項
Copyright 2020 @nuits_jp Slide 5
今日お話しすることは、あくまで私の解釈です
• 極端に要約しているので、これがすべてではありません
• またあえて拡大解釈している箇所もあります
• 書籍の記載とやや矛盾する点もあります
しかし、私は今日お話しする内容こそ、CleanArchitectureの
本質だと思っています。
注意事項
Copyright 2020 @nuits_jp Slide 6
異論・反論大歓迎です。
ぜひご意見を聞かせてください。議論しましょう!
異論・反論大歓迎
Copyright 2020 @nuits_jp Slide 7
Easiest Clean Architecture
Today’s Contents
Copyright 2020 @nuits_jp Slide 8
ブログ
本日お話する内容は、下記のブログに原稿と合わせて公開しています。
Twitterに #csharptokyo のハッシュタグをつけ共有します。
https://www.nuits.jp/entry/easiest-clean-architecture-2019-09
サンプルコードおよびPowerPointはGithubに「CC BY-SA 4.0」で公開しています。
https://github.com/nuitsjp/Easiest-Clean-Architecture
Copyright 2020 @nuits_jp Slide 9
Easiest Clean Architecture
誤解されがちな二つのこと
Copyright 2020 @nuits_jp Slide 10
Clean Architectureといえば・・・
出典:TheCleanArchitecture
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
Copyright 2020 @nuits_jp Slide 11
この図が良くできてい過ぎて誤解を招く
Copyright 2020 @nuits_jp Slide 12
ひとつ目の誤解
Clean Architectureとは
「レイヤーをこれらに分割しろ」
という意味でもない
「関心をControllerやUse Case, Entityに分離しろ」
という意味ではないし
Copyright 2020 @nuits_jp Slide 13
ふたつ目の誤解
「データや処理の流れを一方通行にしろ」
という意味ではないし
「PresentationをMVC的に分離しろ(MVVMなどの否定)」
という意味でもない
MVC Model(出展Wikipedia)
Copyright 2020 @nuits_jp Slide 14
では、どういう意味か?
Copyright 2020 @nuits_jp Slide 15
図の解釈
「依存性は、内側(上位レベルの方針)だけに
向かっていなければいけない。」※
※出典:Clean Architecture 達人に学ぶソフトウェアの構造と設計
Copyright 2020 @nuits_jp Slide 16
図の解釈
こうすればよい ※
内側の変化に応じて、外側を呼び出したい場合どうすればよいのか?
※ より厳密な意図は後述
Copyright 2020 @nuits_jp Slide 17
それあってますか?
Copyright 2020 @nuits_jp Slide 18
はい(当者比)
Copyright 2020 @nuits_jp Slide 19
-The architecture rules are the same! -
(邦訳:アーキテクチャのルールはどれも同じである!)
著者は明言しています
Copyright 2020 @nuits_jp Slide 20
すべてが同一アーキテクチャに帰結するとすれば
以下は、あくまで一例であることは自明
• レイヤーが4つ※1
• UIがMVC的である
• Web限定
• Output PortはUse Caseとの間「だけ」にある※2
• などなど
※1 とは限らないと書籍にも明記されている
※2 eventみたいなPub/SubがUseCase限定じゃ困っちゃう
Copyright 2020 @nuits_jp Slide 21
あくまで例示であると取れる記載もある
Clean Architecture説明の冒頭に、著名なアーキテクチャ(Hexagonal, Onion,
etc...)には類似の共通点が見られるとある。
そして続けてこう記載されている。
The diagram in Figure is an attempt at integrating all these architectures into a single
actionable idea.
(邦訳:図は、これらのすべてのアーキテクチャを単一の実行可能なアイデアに統合し
たものである。)
Copyright 2020 @nuits_jp Slide 22
この図は・・・
全てのアーキテクチャはClean Architectureで説明可能であることを例示し
たモデル。
Clean Architectureを採用したソフトウェアの具体例の一つにすぎない
Copyright 2020 @nuits_jp Slide 23
どんなソフトウェアにも適用可能な
普遍的なアーキテクチャである
だって↓だって言うし
-The architecture rules are the same! -
(邦訳:アーキテクチャのルールはどれも同じである!)
Clean Architectureとは
Copyright 2020 @nuits_jp Slide 24
クリーンアーキテクチャを採用しない
という選択肢は「基本的には」無い
誤解を恐れず言えば・・・
Copyright 2020 @nuits_jp Slide 25
Easiest Clean Architecture
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 26
1. 依存性は、より上位レベルの方針にのみ向けよ
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 27
1. 依存性は、より上位レベルの方針にのみ向けよ
2. 制御の流れと依存方向は分離しコントロールせよ
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 28
1. 依存性は、より上位レベルの方針にのみ向けよ
2. 制御の流れと依存方向は分離しコントロールせよ
3. 上位レベルとは相対的・再帰的であることに留意せよ
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 29
Easiest Clean Architecture
さあ具体例を見てみよう!
Copyright 2020 @nuits_jp Slide 30
具体例の背景と狙い
• 田中さん(仮名)は某業種の技術営業をしています
• 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。
• 外出先でホットペッパーを調べ、お店を探究することが生きがいです
• ただ、ホットペッパーを愛しているのですが、一つだけ不満があります
• 毎日同じ条件で、都度検索することを面倒に感じています
• 田中さん(仮名)はAndroidユーザーです
背景
※「ホットペッパー」は株式会社リクルート様の登録商標です
Copyright 2020 @nuits_jp Slide 31
具体例の背景と狙い
• 田中さん(仮名)は某業種の技術営業をしています
• 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。
• 外出先でホットペッパーを調べ、お店を探究することが生きがいです
• ただ、ホットペッパーを愛しているのですが、一つだけ不満があります
• 毎日同じ条件で、都度検索することを面倒に感じています
• 田中さん(仮名)はAndroidユーザーです
背景
※「ホットペッパー」は株式会社リクルート様の登録商標です
そこで・・・
自分専用のアプリケーションを開発しよう!
Copyright 2020 @nuits_jp Slide 32
Application Overview
アプリケーション「HatPepper」※
• 「リクルートWebサービス」の「グルメサーチAPI」を
利用させていただく
• アプリケーションを起動するとダイレクトに検索結果
が表示される
• 位置情報から周辺の店舗を検索する
• 11時~14時の間はランチ営業のある店舗だけ表示する
※「HatPepper」は登録商標ではありません。安心。
Copyright 2020 @nuits_jp Slide 33
Application Overview
アプリケーション「HatPepper」※
• 「リクルートWebサービス」の「グルメサーチAPI」を
利用させていただく
• アプリケーションを起動するとダイレクトに検索結果
が表示される
• 位置情報から周辺の店舗を検索する
• 11時~14時の間はランチ営業のある店舗だけ表示する
※「HatPepper」は登録商標ではありません。安心。
1. まずレイヤーアーキテクチャで実装
2. レイヤーアーキテクチャの問題点を解説
3. クリーンアーキテクチャの適用
Copyright 2020 @nuits_jp Slide 34
Easiest Clean Architecture
LayeredArchitecture
Copyright 2020 @nuits_jp Slide 35
コンポーネント図
Copyright 2020 @nuits_jp Slide 36
クラス図
Copyright 2020 @nuits_jp Slide 37
シーケンス図
Copyright 2020 @nuits_jp Slide 38
シーケンス図
一見、そんなに
悪くなさげ?
Copyright 2020 @nuits_jp Slide 39
シーケンス図
一見、そんなに
悪くなさげ?
何が悪いのか?
Copyright 2020 @nuits_jp Slide 40
安定度と柔軟性のバランス配分に問題あり
Copyright 2020 @nuits_jp Slide 41
柔軟性と安定度
柔軟性 安定度
高
中
低
低
中
高
Copyright 2020 @nuits_jp Slide 42
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 43
依存関係による安定度と柔軟性のトレードオフ
依存する側 依存される側
安定度
柔軟性
Copyright 2020 @nuits_jp Slide 44
依存する側 依存される側
変更!
安定度
柔軟性
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 45
依存する側 依存される側
変更!
安定度
柔軟性
影響発生
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 46
依存する側 依存される側
変更!
安定度 低 高
柔軟性
影響発生
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 47
依存する側 依存される側
変更!
安定度 低 高
柔軟性
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 48
依存する側 依存される側
変更!
安定度 低 高
柔軟性
別に興味
ないなあ…
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 49
依存する側 依存される側
変更!
安定度 低 高
柔軟性 高 低
別に興味
ないなあ…
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 50
依存する側 依存される側
安定度 低 高
柔軟性 高 低
依存関係による安定度と柔軟性のトレードオフ
安定度と柔軟性は
トレードオフ!
Copyright 2020 @nuits_jp Slide 51
逆説的に考えると・・・
Copyright 2020 @nuits_jp Slide 52
依存する側 依存される側
安定度 低 高
柔軟性 高 低
変更頻度の高いオブジェクトは、依存する側に設計すべし
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 53
依存する側 依存される側
安定度 低 高
柔軟性 高 低
アプリケーションの本質的な価値を提供するオブジェク
トは、軽微な変更の影響を受けてはいけない。
つまり依存される側に設計すべし。
依存関係による安定度と柔軟性のトレードオフ
Copyright 2020 @nuits_jp Slide 54
さて、振り返ってみよう
Copyright 2020 @nuits_jp Slide 55
柔軟性と安定度
柔軟性 安定度
高
中
低
低
中
高
依存の方向
Copyright 2020 @nuits_jp Slide 56
どこの変更頻度が高く、どこが本質的な価値ですか?
Copyright 2020 @nuits_jp Slide 57
柔軟性と安定度
柔軟性 安定度
高
中
低
低
中
高
高変更頻度
Copyright 2020 @nuits_jp Slide 58
このアプリケーションの本質的な価値とは?
Copyright 2020 @nuits_jp Slide 59
Application Overview
アプリケーション「HatPepper」※
• 「リクルートWebサービス」の「グルメサーチAPI」を
利用させていただく
• アプリケーションを起動するとダイレクトに検索結果
が表示される
• 位置情報から周辺の店舗を検索する
• 11時~14時の間はランチ営業のある店舗だけ表示する
※「HatPepper」は登録商標ではありません。安心。
これこそが価値の本質
Copyright 2020 @nuits_jp Slide 60
柔軟性と安定度
柔軟性 安定度
高
中
低
低
中
高
高価値
Copyright 2020 @nuits_jp Slide 61
柔軟性と安定度
柔軟性 安定度
高
中
低
低
中
高
高価値
≒ビジネスロジック / ドメイン
Copyright 2020 @nuits_jp Slide 62
柔軟性と安定度
柔軟性 安定度
高
中→低
低→高
低
中→高
高→低
高価値
Copyright 2020 @nuits_jp Slide 63
柔軟性と安定度
柔軟性 安定度
高
中→低
低→高
低
中→高
高→低
依存の方向
Copyright 2020 @nuits_jp Slide 64
Easiest Clean Architecture
依存性は、より上位レベルの方針にのみ向けよ
Copyright 2020 @nuits_jp Slide 65
柔軟性と安定度
柔軟性 安定度
高
低
高
低
高
低
依存の方向
Copyright 2020 @nuits_jp Slide 66
実現可能なのか?
Copyright 2020 @nuits_jp Slide 67
柔軟性と安定度
柔軟性 安定度
高
低
高
低
高
低
依存の方向 制御の方向
Copyright 2020 @nuits_jp Slide 68
Easiest Clean Architecture
制御の流れと依存関係の分離
Copyright 2020 @nuits_jp Slide 69
制御の流れと依存関係の分離
凡例
制御の流れ
依存方向
クライアント
オブジェクト
サーバー
オブジェクト
一般的に
制御の流れ=依存方向
になりがち
<<具象概念>> <<具象概念>>
Copyright 2020 @nuits_jp Slide 70
制御の流れと依存方向は分離しコントロールできる
Copyright 2020 @nuits_jp Slide 71
制御の流れと依存関係の分離
凡例
制御の流れ
依存方向
クライアント
オブジェクト
サーバー
オブジェクト
そのためには関係のコントラクト(契約・仕様・お約束)
のコンテキスト(文脈)を制御する
<<具象概念>> <<具象概念>>
コントラクト
<<抽象概念>>
それぞれの具象概念は抽象的な契約(仕様)に依存する
Copyright 2020 @nuits_jp Slide 72
契約の文脈をコントロールする
クライアント
オブジェクト
<<具象概念>>
コントラクト
<<抽象概念>>
サーバー
オブジェクト
<<具象概念>>
凡例
制御の流れ
依存方向
文脈
Copyright 2020 @nuits_jp Slide 73
契約の文脈をコントロールする
クライアント
オブジェクト
<<具象概念>>
コントラクト
<<抽象概念>>
サーバー
オブジェクト
<<具象概念>>
クライアント
オブジェクト
<<具象概念>>
コントラクト
<<抽象概念>>
サーバー
オブジェクト
<<具象概念>>
凡例
制御の流れ
依存方向
文脈
Copyright 2020 @nuits_jp Slide 74
契約の文脈をコントロールする
クライアント
オブジェクト
<<具象概念>>
コントラクト
<<抽象概念>>
サーバー
オブジェクト
<<具象概念>>
クライアント
オブジェクト
<<具象概念>>
コントラクト
<<抽象概念>>
サーバー
オブジェクト
<<具象概念>>
凡例
制御の流れ
依存方向
文脈
依存性逆転の原則
Copyright 2020 @nuits_jp Slide 75
具体例を見てみよう
Copyright 2020 @nuits_jp Slide 76
柔軟性と安定度
この部分の
「コントラクト」
に注目する
Copyright 2020 @nuits_jp Slide 77
クラス図
Copyright 2020 @nuits_jp Slide 78
クラス図
APIクライアントの
呼び出しにフォーカ
スしてみる
Copyright 2020 @nuits_jp Slide 79
シーケンス図
usecaseはapiを呼び出している
Copyright 2020 @nuits_jp Slide 80
Copyright 2020 @nuits_jp Slide 81
ここが
「コントラクト」
依存させたい方向
Copyright 2020 @nuits_jp Slide 82
ここが
「コントラクト」
二つの問題がある
依存させたい方向
Copyright 2020 @nuits_jp Slide 83
ひとつ コントラクトがapi側に定義されている
Copyright 2020 @nuits_jp Slide 84
依存の方向
依存の方向
Copyright 2020 @nuits_jp Slide 85
ふたつめ コントラクトがWebAPIの文脈で記述されている
Copyright 2020 @nuits_jp Slide 86
{
"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 2020 @nuits_jp Slide 87
実装を確認して
みる
Copyright 2020 @nuits_jp Slide 88
package jp.nuits.hatpepper.usecase
class FindNearbyRestaurantsImpl(
val deviceLocationProvider: DeviceLocationProvider,
val timeProvider: TimeProvider,
val gourmetSearchApi: GourmetSearchApi
) : FindNearbyRestaurants {
override suspend fun find(): List<Restaurant> {
var deviceLocation = deviceLocationProvider.getDeviceLocation() // 現在地を取得する
// 現在時刻が11時~14時の間で有った場合、ランチ営業している店舗のみを表示する
var now = timeProvider.now()
var lunchStart = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 11, 0)
var lunchEnd = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 14, 0)
var lunchTimeOnly = now.isAfter(lunchStart) && now.isBefore(lunchEnd)
return gourmetSearchApi.find(deviceLocation, lunchTime).results.shop
.map {
Restaurant(
it.id,
it.name,
it.genre.name,
it.genre.catch,
it.photo.pc.l,
it.budget.average,
it.mobile_access)
}.toList()
}
}
APIの戻り値を詰め
なおしている
Copyright 2020 @nuits_jp Slide 89
package jp.nuits.hatpepper.usecase
class FindNearbyRestaurantsImpl(
val deviceLocationProvider: DeviceLocationProvider,
val timeProvider: TimeProvider,
val gourmetSearchApi: GourmetSearchApi
) : FindNearbyRestaurants {
override suspend fun find(): List<Restaurant> {
var deviceLocation = deviceLocationProvider.getDeviceLocation() // 現在地を取得する
// 現在時刻が11時~14時の間で有った場合、ランチ営業している店舗のみを表示する
var now = timeProvider.now()
var lunchStart = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 11, 0)
var lunchEnd = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 14, 0)
var lunchTimeOnly = now.isAfter(lunchStart) && now.isBefore(lunchEnd)
return gourmetSearchApi.find(deviceLocation, lunchTime).results.shop
.map {
Restaurant(
it.id,
it.name,
it.genre.name,
it.genre.catch,
it.photo.pc.l,
it.budget.average,
it.mobile_access)
}.toList()
}
}
usecaseがAPIのJSON形
式に依存している
APIの戻り値を詰め
なおしている
Copyright 2020 @nuits_jp Slide 90
どうすれば?
Copyright 2020 @nuits_jp Slide 91
契約の文脈をコントロールする
usecase
<<具象概念>>
コントラクト
<<抽象概念>>
infrastructure
<<具象概念>>
変更前
Copyright 2020 @nuits_jp Slide 92
契約の文脈をコントロールする
usecase
<<具象概念>>
コントラクト
<<抽象概念>>
infrastructure
<<具象概念>>
usecase
<<具象概念>>
コントラクト
<<抽象概念>>
infrastructure
<<具象概念>>
変更前
変更後
Copyright 2020 @nuits_jp Slide 93
契約の文脈をコントロールする
この依存を断ち切るこの依存を断ち切る
Copyright 2020 @nuits_jp Slide 94
契約の文脈をコントロールする
① JSON依存オブジェクトを
infrastructureへ隠蔽する
② APIのインターフェースは
usecaseの文脈で記述する
Copyright 2020 @nuits_jp Slide 95
契約の文脈をコントロールする
値の詰めなおしは
ここで実装
Copyright 2020 @nuits_jp Slide 96
契約の文脈をコントロールする
依存方向
値の詰めなおしは
ここで実装
依存の方向
Copyright 2020 @nuits_jp Slide 97
制御の流れと依存関係の分離
柔軟性 安定度
高
低
高
低
高
低
依存の方向 制御の方向
Copyright 2020 @nuits_jp Slide 98
アプリケーション構造
usecase presentation
api
location
time
Copyright 2020 @nuits_jp Slide 99
1. 依存性は、より上位レベルの方針にのみ向けよ
2. 制御の流れと依存方向は分離しコントロールせよ
3. 上位レベルとは相対的・再帰的であることに留意せよ
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 100
視点を上げてみよう
Copyright 2020 @nuits_jp Slide 101
アプリケーションを取り巻く依存関係
依存の方向
apiが外部サービスに依存している
いいのか?
Copyright 2020 @nuits_jp Slide 102
いいんです!
Copyright 2020 @nuits_jp Slide 103
具体例の背景と狙い
• 田中さん(仮名)は某業種の技術営業をしています
• 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。
• 外出先でホットペッパーを調べ、お店を探究することが生きがいです
• ただ、ホットペッパーを愛しているのですが、一つだけ不満があります
• 毎日同じ条件で、都度検索することを面倒に感じています
• 田中さん(仮名)はAndroidユーザーです
背景
※「ホットペッパー」は株式会社リクルート様の登録商標です
そこで・・・
自分専用のアプリケーションを開発しよう!
Copyright 2020 @nuits_jp Slide 104
具体例の背景と狙い
• 田中さん(仮名)は某業種の技術営業をしています
• 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。
• 外出先でホットペッパーを調べ、お店を探究することが生きがいです
• ただ、ホットペッパーを愛しているのですが、一つだけ不満があります
• 毎日同じ条件で、都度検索することを面倒に感じています
• 田中さん(仮名)はAndroidユーザーです
背景
※「ホットペッパー」は株式会社リクルート様の登録商標です
そこで・・・
自分専用のアプリケーションを開発しよう!
最上位レベルの方針!
(つまりSolution)
Copyright 2020 @nuits_jp Slide 105
依存の方向
• アプリケーションはWebサービスのインターフェースである
• 本質はWebサービスにある
• アプリケーションがWebサービスに依存してよい
※ 腐敗防止層を設けることは否定しない
apiコンポーネントはWebサービスに依存してよい※
Copyright 2020 @nuits_jp Slide 106
アプリケーション構造
usecase presentation
api
location
time
Copyright 2020 @nuits_jp Slide 107
アプリケーション構造
HatPepper
アプリ
Copyright 2020 @nuits_jp Slide 108
ホットペッパー
サービス
ソリューション構造
HatPepper
アプリ
Copyright 2020 @nuits_jp Slide 109
適切な関係性は背景によって変化する
Copyright 2020 @nuits_jp Slide 110
ソリューション構造
ホットペッパー
サービス
HatPepper
アプリ
【背景】
ホットペッパーを便利に利用するアプリケーションが欲しい!
凡例
自社サービス
他社サービス
Copyright 2020 @nuits_jp Slide 111
ソリューション構造
飲食店横断検索
アプリ
【背景】
いろんな飲食店検索サービスを横断的に活用したい!
A社
サービス
凡例
自社サービス
他社サービス
B社
サービス
C社
サービス
Copyright 2020 @nuits_jp Slide 112
ソリューション構造
飲食店情報
サービス
Web
アプリ
【背景】
まったく新しい飲食店情報サービスを始めたい!
マルチプラットで!
凡例
自社サービス
他社サービスAndroid
アプリ
iOS
アプリ
Copyright 2020 @nuits_jp Slide 113
それでもアプリケーションは・・・
Copyright 2020 @nuits_jp Slide 114
Any solution, Any Platform...
usecase presentation
api
location
time
Copyright 2020 @nuits_jp Slide 115
Easiest Clean Architecture
上位レベルとは相対的・再帰的であることに留意せよ
Copyright 2020 @nuits_jp Slide 116
システム
サブシステム
コンポーネント
ソフトウェアのフラクタル
クラス
サブシステム
クラス
コンポーネント
クラス クラス
ソフトウェア オブジェクトすべてに、ここまでの話は適用可能
• 要素間のインターフェースの文脈により、制御の流れと依存関係は制御可能
• 依存関係によって、安定性と柔軟性をコントロール可能
ソ
フ
ト
ウ
ェ
ア
オ
ブ
ジ
ェ
ク
ト
Copyright 2020 @nuits_jp Slide 117
ソフトウェア オブジェクト 代表的なコントラクト
システム OpenAPI(なんならCSVのFTP転送)
サブシステム OpenAPIやSwagger
コンポーネント プログラム インターフェース
クラス プログラム インターフェース
ソフトウェア オブジェクトとコントラクト
Copyright 2020 @nuits_jp Slide 118
-The architecture rules are the same! -
Copyright 2020 @nuits_jp Slide 119
Easiest Clean Architecture
What is SoftwareArchitecture?
Copyright 2020 @nuits_jp Slide 120
!ここからは私見成分高め!
Copyright 2020 @nuits_jp Slide 121
1. MVC
2. MVP
3. MVVM
4. MVPVM
5. クリーン アーキテクチャ
6. レイヤー アーキテクチャ
7. オニオン アーキテクチャ
などなど
これらはソフトウェア アーキテクチャの類型的なパターン群です
ソフトウェア アーキテクチャといえば何を思い浮かべますか?
Copyright 2017 @nuits_jp Slide 121
Copyright 2020 @nuits_jp Slide 122
ソフトウェア アーキテクチャとは何か?
ソフトウェアアーキテクチャでは、ソフトウェア システムの構成に関する一連
の重要な判断を網羅しています。これには、システムを構成する要素とイン
ターフェイスの選択、要素間のコラボレーションとして指定される動作、この
ような構成と動作の要素のより大きなサブシステムに対する構成、この構成の
指針となるアーキテクチャスタイルが含まれます。また、機能性、ユーザビリ
ティ、復元性、パフォーマンス、再利用性、理解できること、経済的な制約、
テクノロジの制約、トレードオフ、および外観への配慮も必要です。
by Philippe Kruchten, Grady Booch, Kurt Bittner, Rich Reitman
Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用
Copyright 2017 @nuits_jp Slide 122
Copyright 2020 @nuits_jp Slide 123
ソフトウェア アーキテクチャとは何か?
アーキテクチャは、システムを大きなレベルで分解したもので、決定事項の変
更は困難です。システムには複数のアーキテクチャが存在し、アーキテクチャ
にとって重要な事項はシステムの運用中に変化します。要するに、重要な要素
は、すべてアーキテクチャということになります。
by Martin Fowler
Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用
Copyright 2017 @nuits_jp Slide 123
Copyright 2020 @nuits_jp Slide 124
ソフトウェア アーキテクチャとは何か?
ソフトウェアアーキテクチャとは、抽象化と問題の分割によって複雑性を減ら
すことを主に念頭に置いたものである。ただし、今までのところ、「ソフト
ウェアアーキテクチャ」という用語に関して、万人が合意した厳密な定義は存
在しない
Wikipedia「ソフトウェアアーキテクチャ」より引用
Copyright 2017 @nuits_jp Slide 124
Copyright 2020 @nuits_jp Slide 125Slide 125Copyright 2017 @nuits_jp
とは言え、おおよその共通認識はある
Copyright 2020 @nuits_jp Slide 126
1. ソフトウェアアーキテクチャとは
システムアーキテクチャのうち、ソフトウェア領域のアーキテク
チャである
この時「システム」とは「IT」だけではなく、それらを取り巻く社
会やビジネスを含めた「仕組み」を指すことも多い
※ 元来「System」とは制度・組織・体系・系統などのこと
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
Copyright 2020 @nuits_jp Slide 127
2. ソフトウェア アーキテクチャとは
1. ソフトウェアにおける重要な決定事項全てである
2. その中でも特につぎの2点が重要
1. ソフトウェア全体を、どのように分割するか
2. 分割した部分同士を、どう結合し相互作用させるか
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
Copyright 2020 @nuits_jp Slide 128
3. ソフトウェアアーキテクチャを構築するのはなぜか?
• 「システムの実現をサポートする」
• 「持続可能なソフトウェア」を
• 「バランスよく」構築するため
4. ソフトウェアアーキテクチャのバランスとは?
1. Quality(機能・非機能)
2. Cost
3. Delivery(開発期間)
アーキテクチャは非機能要求からも大きく影響をうける
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
Copyright 2020 @nuits_jp Slide 129
Easiest Clean Architecture
Clean Architectureを考えるうえで重要なポイント
Copyright 2020 @nuits_jp Slide 130
2. ソフトウェア アーキテクチャとは
1. ソフトウェアにおける重要な決定事項全てである
2. その中でも特につぎの2点が重要
1. ソフトウェア全体を、どのように分割するか
2. 分割した部分同士を、どう結合し、相互作用させるか
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
Copyright 2020 @nuits_jp Slide 131
2. ソフトウェア アーキテクチャとは
1. ソフトウェアにおける重要な決定事項全てである
2. その中でも特につぎの2点が重要
1. ソフトウェア全体を、どのように分割するか
2. 分割した部分同士を、どう結合し、相互作用させるか
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
ソフトウェアアーキテクチャ3種の神器
Copyright 2020 @nuits_jp Slide 132
1. 関心の分離(SoC:Separation of concerns)
2. 疎結合
3. 依存性逆転の原則
ソフトウェアアーキテクチャ3種の神器
Copyright 2020 @nuits_jp Slide 133
上位の関心
ソフトウェア アーキテクチャの3種の神器
Copyright 2020 @nuits_jp Slide 134
上位の関心
個別の関心
ソフトウェア アーキテクチャの3種の神器
個別の関心
関心の分離
Copyright 2020 @nuits_jp Slide 135
上位の関心
個別の関心
ソフトウェア アーキテクチャの3種の神器
個別の関心
関心の分離
上位の関心 個別の関心
ソリューション サブシステム
コンポーネント クラス
Copyright 2020 @nuits_jp Slide 136
上位の関心
個別の関心
ソフトウェア アーキテクチャの3種の神器
個別の関心
関心の分離
上位の関心 個別の関心
ソリューション サブシステム
ユースケース
コンポーネント クラス(名前空間?)
Copyright 2020 @nuits_jp Slide 137
上位の関心
個別の関心
ソフトウェア アーキテクチャの3種の神器
個別の関心
関心の分離
Copyright 2020 @nuits_jp Slide 138
上位の関心
個別の関心
ソフトウェア アーキテクチャの3種の神器
個別の関心
関心の分離
疎結合
コントラクト
(≒Interface)
Copyright 2020 @nuits_jp Slide 139
上位の関心
個別の関心
ソフトウェア アーキテクチャの3種の神器
個別の関心
関心の分離
疎結合
コントラクト
(≒Interface)
依存性逆転の原則
( 上位の安定度と、下位の柔軟性を高めよ)
Copyright 2020 @nuits_jp Slide 140
What is Clean Architecture?
Copyright 2020 @nuits_jp Slide 141
Clean Architecture is ...
クリーンアーキテクチャとは
「ソフトウェアアーキテクチャ3種の神器を適用した
リファレンスアーキテクチャのひとつ」
Copyright 2020 @nuits_jp Slide 142
Easiest Clean Architecture
Clean Architectureって不可能では?
Copyright 2020 @nuits_jp Slide 143
フレームワークとアーキテクチャ
「フレーム ワークなんかと結婚 する な!」
フレーム ワーク は、 アーキテクチャの円の外側にあるものと
して扱おう。円 の内側に組み込んではいけない。
(中略)
優れ たソフトウェア アーキテクチャがあれ ば、フレームワー
ク、データベース、ウェブサーバー、その他の環境の問題や
ツールの意思決定を延期・留保 できる。 フレーム ワークの選
択肢は残されたままだ。
以下「CleanArchitecture 達人に学ぶソフトウェアの構造と設計」より引用
Copyright 2020 @nuits_jp Slide 144
よく見かける疑問
• UIフレームワークやライブラリ非依存なんて無理(無意味)
• データベースに依存しないとか無理
• SQL使わないと実装できないじゃん?
• データベースのスキーマ(データ構造)
への依存は避けられない
Copyright 2020 @nuits_jp Slide 145
よく見かける疑問
• UIフレームワークやライブラリ非依存なんて無理(無意味)
• データベースに依存しないとか無理
• SQL使わないと実装できないじゃん?
• データベースのスキーマ(データ構造)
への依存は避けられない
真に受けすぎる必要はない
Copyright 2020 @nuits_jp Slide 146
関心の粒度による上下関係
例えば・・・
今回のサンプルアプリケーションはCardViewに依存している。
これはNGなのか?
一定条件を満たせば問題ないと考えています。
HatPepper アプリケーション
usecase infrastructurepresentation
view
model
view
androidx.c
ardview
Copyright 2020 @nuits_jp Slide 147
以下のような「上位レベルの決断」の上であれば問題ない
• 開発生産性・品質を考慮した結果、androidx.cardviewを利用したほう
が「より良い」
• androidx.cardviewは十分に後方互換性を考慮して開発されており、そ
の変化をアプリケーションは許容できる・する
• ただし依存関係はpresentation内に限定する
関心の粒度による上下関係
HatPepper アプリケーション
usecase infrastructurepresentation
view
model
view
androidx.c
ardview
Copyright 2020 @nuits_jp Slide 148
そもそも
以下から切り離すというのはナンセンスですよね?
• Androidというプラットフォーム
• Kotlinというプログラミング言語
• Android StudioというIDE
• Gradleというビルドツール
• などなど
Copyright 2020 @nuits_jp Slide 149
抽象と具象は程度の問題
• 詳細(フレームワークなど)の決定を遅らせることは、イニシャ
ルコストの増加を招きがち
• 具象を早い段階で受け入れる(決定する)ことで、コストや開発
期間の圧縮や、品質の向上を図るというのも、当然検討すべき
アーキテクチャ上の「上位の方針」として受容するのは十分あり
Clean Architecture原理主義になる必要はないが
同時にAnti Clean Architectureになる必要もない
これらを・・・
Copyright 2020 @nuits_jp Slide 150
Easiest Clean Architecture
まとめ
Copyright 2020 @nuits_jp Slide 151
Clean Architectureとは、どんなソフトウェアにも適用可能な普
遍的なアーキテクチャの原則である
まとめ
Copyright 2020 @nuits_jp Slide 152
Clean Architecture is ...
クリーンアーキテクチャとは
「ソフトウェアアーキテクチャ3種の神器を適用した
リファレンスアーキテクチャのひとつ」
Copyright 2020 @nuits_jp Slide 153
上位の関心
個別の関心
ソフトウェア アーキテクチャの3種の神器
個別の関心
関心の分離
疎結合
コントラクト
(≒Interface)
依存性逆転の原則
( 上位の安定度と、下位の柔軟性を高めよ)
Copyright 2020 @nuits_jp Slide 154
1. 依存性は、より上位レベルの方針にのみ向けよ
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 155
1. 依存性は、より上位レベルの方針にのみ向けよ
2. 制御の流れと依存方向は分離しコントロールせよ
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 156
1. 依存性は、より上位レベルの方針にのみ向けよ
2. 制御の流れと依存方向は分離しコントロールせよ
3. 上位レベルとは相対的・再帰的であることに留意せよ
おさえるべき三つのこと
Copyright 2020 @nuits_jp Slide 157
Clean Architectureは、次のふたつを誤解されがち
1. 参考図の通りに関心を分離するのがClean Architectureである
2. データや処理の流れを一方通行にしろ
上記は、陥りがちな誤りであり、Clean Architectureの本質とは異なりま
す。
誤解されがちな二つのこと
Copyright 2020 @nuits_jp Slide 158
一読の価値あり
Slide 158
Copyright 2020 @nuits_jp Slide 159
という訳で・・・
Copyright 2020 @nuits_jp Slide 160
Today’s Goal
みなさん
「クリーンアーキテクチャチョットデキル」
ようになりましたね?
Copyright 2020 @nuits_jp Slide 161
ThankYou!
Any Questions?

More Related Content

What's hot

ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう増田 亨
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす増田 亨
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?Yoshitaka Kawashima
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD増田 亨
 
C# における Redis 徹底活用
C# における Redis 徹底活用C# における Redis 徹底活用
C# における Redis 徹底活用Takaaki Suzuki
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣Yoshitaka Kawashima
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計増田 亨
 
ドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かうドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かう増田 亨
 
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する増田 亨
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 

What's hot (20)

ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
C# における Redis 徹底活用
C# における Redis 徹底活用C# における Redis 徹底活用
C# における Redis 徹底活用
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣ソフトウェア設計における 意思決定とそのレビューの秘訣
ソフトウェア設計における 意思決定とそのレビューの秘訣
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
ドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かうドメイン駆動設計 複雑さに立ち向かう
ドメイン駆動設計 複雑さに立ち向かう
 
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 

Similar to 世界一わかりやすいClean Architecture - DroidKaigiバージョン

世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1Atsushi Nakamura
 
世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-previewAtsushi Nakamura
 
α版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるα版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるAtsushi Nakamura
 
岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回Shigeru Kobayashi
 
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Atsushi Nakamura
 
落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug
落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug
落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug満徳 関
 
イベント企画運営の経験と実際 / The history of organizing events by me
イベント企画運営の経験と実際 / The history of organizing events by meイベント企画運営の経験と実際 / The history of organizing events by me
イベント企画運営の経験と実際 / The history of organizing events by mewhywaita
 
[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方
[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方
[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方Shigeki Morizane
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考えるAtsushi Nakamura
 

Similar to 世界一わかりやすいClean Architecture - DroidKaigiバージョン (9)

世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1
 
世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview
 
α版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるα版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考える
 
岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回
 
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
 
落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug
落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug
落とし穴をファシリテートしよう! - XP祭り2015LT祭り #xpjug
 
イベント企画運営の経験と実際 / The history of organizing events by me
イベント企画運営の経験と実際 / The history of organizing events by meイベント企画運営の経験と実際 / The history of organizing events by me
イベント企画運営の経験と実際 / The history of organizing events by me
 
[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方
[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方
[JISA][変革リーダー養成部会]組織の中で自分を活かす生き方
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える
 

More from Atsushi Nakamura

Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトSettings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトAtsushi Nakamura
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021Atsushi Nakamura
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Atsushi Nakamura
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Atsushi Nakamura
 
継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版Atsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そうAtsushi Nakamura
 
Old:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうOld:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうAtsushi Nakamura
 
Xamarin.forms navigation overview
Xamarin.forms navigation overviewXamarin.forms navigation overview
Xamarin.forms navigation overviewAtsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そうAtsushi Nakamura
 
Blue monkey architecture overview
Blue monkey architecture overviewBlue monkey architecture overview
Blue monkey architecture overviewAtsushi Nakamura
 
Xamarin Dev days 2 xamarin.forms ja
Xamarin Dev days 2   xamarin.forms jaXamarin Dev days 2   xamarin.forms ja
Xamarin Dev days 2 xamarin.forms jaAtsushi Nakamura
 
Why prism for xamarin.forms
Why prism for xamarin.formsWhy prism for xamarin.forms
Why prism for xamarin.formsAtsushi Nakamura
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Atsushi Nakamura
 

More from Atsushi Nakamura (13)

Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトSettings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0
 
継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
 
Old:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうOld:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そう
 
Xamarin.forms navigation overview
Xamarin.forms navigation overviewXamarin.forms navigation overview
Xamarin.forms navigation overview
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
 
Blue monkey architecture overview
Blue monkey architecture overviewBlue monkey architecture overview
Blue monkey architecture overview
 
Xamarin Dev days 2 xamarin.forms ja
Xamarin Dev days 2   xamarin.forms jaXamarin Dev days 2   xamarin.forms ja
Xamarin Dev days 2 xamarin.forms ja
 
Why prism for xamarin.forms
Why prism for xamarin.formsWhy prism for xamarin.forms
Why prism for xamarin.forms
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性
 

Recently uploaded

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (9)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

世界一わかりやすいClean Architecture - DroidKaigiバージョン

  • 1. Copyright 2020 @nuits_jp 世界一わかりやすいClean Architecture ~ 誤解されがちな二つのことと、おさえるべき三つのことと本質 ~ Atsushi Nakamura
  • 2. Copyright 2020 @nuits_jp Slide 2 Easiest Clean Architecture Overview
  • 3. Copyright 2020 @nuits_jp Slide 3 Clean Architectureの次の点についてお話させていただきます。 • 誤解されがちな二つのこと • Clean Architectureの本質 • おさえるべき三つのこと Overview Slide 3
  • 4. Copyright 2020 @nuits_jp Slide 4 Easiest Clean Architecture 注意事項
  • 5. Copyright 2020 @nuits_jp Slide 5 今日お話しすることは、あくまで私の解釈です • 極端に要約しているので、これがすべてではありません • またあえて拡大解釈している箇所もあります • 書籍の記載とやや矛盾する点もあります しかし、私は今日お話しする内容こそ、CleanArchitectureの 本質だと思っています。 注意事項
  • 6. Copyright 2020 @nuits_jp Slide 6 異論・反論大歓迎です。 ぜひご意見を聞かせてください。議論しましょう! 異論・反論大歓迎
  • 7. Copyright 2020 @nuits_jp Slide 7 Easiest Clean Architecture Today’s Contents
  • 8. Copyright 2020 @nuits_jp Slide 8 ブログ 本日お話する内容は、下記のブログに原稿と合わせて公開しています。 Twitterに #csharptokyo のハッシュタグをつけ共有します。 https://www.nuits.jp/entry/easiest-clean-architecture-2019-09 サンプルコードおよびPowerPointはGithubに「CC BY-SA 4.0」で公開しています。 https://github.com/nuitsjp/Easiest-Clean-Architecture
  • 9. Copyright 2020 @nuits_jp Slide 9 Easiest Clean Architecture 誤解されがちな二つのこと
  • 10. Copyright 2020 @nuits_jp Slide 10 Clean Architectureといえば・・・ 出典:TheCleanArchitecture https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
  • 11. Copyright 2020 @nuits_jp Slide 11 この図が良くできてい過ぎて誤解を招く
  • 12. Copyright 2020 @nuits_jp Slide 12 ひとつ目の誤解 Clean Architectureとは 「レイヤーをこれらに分割しろ」 という意味でもない 「関心をControllerやUse Case, Entityに分離しろ」 という意味ではないし
  • 13. Copyright 2020 @nuits_jp Slide 13 ふたつ目の誤解 「データや処理の流れを一方通行にしろ」 という意味ではないし 「PresentationをMVC的に分離しろ(MVVMなどの否定)」 という意味でもない MVC Model(出展Wikipedia)
  • 14. Copyright 2020 @nuits_jp Slide 14 では、どういう意味か?
  • 15. Copyright 2020 @nuits_jp Slide 15 図の解釈 「依存性は、内側(上位レベルの方針)だけに 向かっていなければいけない。」※ ※出典:Clean Architecture 達人に学ぶソフトウェアの構造と設計
  • 16. Copyright 2020 @nuits_jp Slide 16 図の解釈 こうすればよい ※ 内側の変化に応じて、外側を呼び出したい場合どうすればよいのか? ※ より厳密な意図は後述
  • 17. Copyright 2020 @nuits_jp Slide 17 それあってますか?
  • 18. Copyright 2020 @nuits_jp Slide 18 はい(当者比)
  • 19. Copyright 2020 @nuits_jp Slide 19 -The architecture rules are the same! - (邦訳:アーキテクチャのルールはどれも同じである!) 著者は明言しています
  • 20. Copyright 2020 @nuits_jp Slide 20 すべてが同一アーキテクチャに帰結するとすれば 以下は、あくまで一例であることは自明 • レイヤーが4つ※1 • UIがMVC的である • Web限定 • Output PortはUse Caseとの間「だけ」にある※2 • などなど ※1 とは限らないと書籍にも明記されている ※2 eventみたいなPub/SubがUseCase限定じゃ困っちゃう
  • 21. Copyright 2020 @nuits_jp Slide 21 あくまで例示であると取れる記載もある Clean Architecture説明の冒頭に、著名なアーキテクチャ(Hexagonal, Onion, etc...)には類似の共通点が見られるとある。 そして続けてこう記載されている。 The diagram in Figure is an attempt at integrating all these architectures into a single actionable idea. (邦訳:図は、これらのすべてのアーキテクチャを単一の実行可能なアイデアに統合し たものである。)
  • 22. Copyright 2020 @nuits_jp Slide 22 この図は・・・ 全てのアーキテクチャはClean Architectureで説明可能であることを例示し たモデル。 Clean Architectureを採用したソフトウェアの具体例の一つにすぎない
  • 23. Copyright 2020 @nuits_jp Slide 23 どんなソフトウェアにも適用可能な 普遍的なアーキテクチャである だって↓だって言うし -The architecture rules are the same! - (邦訳:アーキテクチャのルールはどれも同じである!) Clean Architectureとは
  • 24. Copyright 2020 @nuits_jp Slide 24 クリーンアーキテクチャを採用しない という選択肢は「基本的には」無い 誤解を恐れず言えば・・・
  • 25. Copyright 2020 @nuits_jp Slide 25 Easiest Clean Architecture おさえるべき三つのこと
  • 26. Copyright 2020 @nuits_jp Slide 26 1. 依存性は、より上位レベルの方針にのみ向けよ おさえるべき三つのこと
  • 27. Copyright 2020 @nuits_jp Slide 27 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ おさえるべき三つのこと
  • 28. Copyright 2020 @nuits_jp Slide 28 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ 3. 上位レベルとは相対的・再帰的であることに留意せよ おさえるべき三つのこと
  • 29. Copyright 2020 @nuits_jp Slide 29 Easiest Clean Architecture さあ具体例を見てみよう!
  • 30. Copyright 2020 @nuits_jp Slide 30 具体例の背景と狙い • 田中さん(仮名)は某業種の技術営業をしています • 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。 • 外出先でホットペッパーを調べ、お店を探究することが生きがいです • ただ、ホットペッパーを愛しているのですが、一つだけ不満があります • 毎日同じ条件で、都度検索することを面倒に感じています • 田中さん(仮名)はAndroidユーザーです 背景 ※「ホットペッパー」は株式会社リクルート様の登録商標です
  • 31. Copyright 2020 @nuits_jp Slide 31 具体例の背景と狙い • 田中さん(仮名)は某業種の技術営業をしています • 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。 • 外出先でホットペッパーを調べ、お店を探究することが生きがいです • ただ、ホットペッパーを愛しているのですが、一つだけ不満があります • 毎日同じ条件で、都度検索することを面倒に感じています • 田中さん(仮名)はAndroidユーザーです 背景 ※「ホットペッパー」は株式会社リクルート様の登録商標です そこで・・・ 自分専用のアプリケーションを開発しよう!
  • 32. Copyright 2020 @nuits_jp Slide 32 Application Overview アプリケーション「HatPepper」※ • 「リクルートWebサービス」の「グルメサーチAPI」を 利用させていただく • アプリケーションを起動するとダイレクトに検索結果 が表示される • 位置情報から周辺の店舗を検索する • 11時~14時の間はランチ営業のある店舗だけ表示する ※「HatPepper」は登録商標ではありません。安心。
  • 33. Copyright 2020 @nuits_jp Slide 33 Application Overview アプリケーション「HatPepper」※ • 「リクルートWebサービス」の「グルメサーチAPI」を 利用させていただく • アプリケーションを起動するとダイレクトに検索結果 が表示される • 位置情報から周辺の店舗を検索する • 11時~14時の間はランチ営業のある店舗だけ表示する ※「HatPepper」は登録商標ではありません。安心。 1. まずレイヤーアーキテクチャで実装 2. レイヤーアーキテクチャの問題点を解説 3. クリーンアーキテクチャの適用
  • 34. Copyright 2020 @nuits_jp Slide 34 Easiest Clean Architecture LayeredArchitecture
  • 35. Copyright 2020 @nuits_jp Slide 35 コンポーネント図
  • 36. Copyright 2020 @nuits_jp Slide 36 クラス図
  • 37. Copyright 2020 @nuits_jp Slide 37 シーケンス図
  • 38. Copyright 2020 @nuits_jp Slide 38 シーケンス図 一見、そんなに 悪くなさげ?
  • 39. Copyright 2020 @nuits_jp Slide 39 シーケンス図 一見、そんなに 悪くなさげ? 何が悪いのか?
  • 40. Copyright 2020 @nuits_jp Slide 40 安定度と柔軟性のバランス配分に問題あり
  • 41. Copyright 2020 @nuits_jp Slide 41 柔軟性と安定度 柔軟性 安定度 高 中 低 低 中 高
  • 42. Copyright 2020 @nuits_jp Slide 42 依存関係による安定度と柔軟性のトレードオフ
  • 43. Copyright 2020 @nuits_jp Slide 43 依存関係による安定度と柔軟性のトレードオフ 依存する側 依存される側 安定度 柔軟性
  • 44. Copyright 2020 @nuits_jp Slide 44 依存する側 依存される側 変更! 安定度 柔軟性 依存関係による安定度と柔軟性のトレードオフ
  • 45. Copyright 2020 @nuits_jp Slide 45 依存する側 依存される側 変更! 安定度 柔軟性 影響発生 依存関係による安定度と柔軟性のトレードオフ
  • 46. Copyright 2020 @nuits_jp Slide 46 依存する側 依存される側 変更! 安定度 低 高 柔軟性 影響発生 依存関係による安定度と柔軟性のトレードオフ
  • 47. Copyright 2020 @nuits_jp Slide 47 依存する側 依存される側 変更! 安定度 低 高 柔軟性 依存関係による安定度と柔軟性のトレードオフ
  • 48. Copyright 2020 @nuits_jp Slide 48 依存する側 依存される側 変更! 安定度 低 高 柔軟性 別に興味 ないなあ… 依存関係による安定度と柔軟性のトレードオフ
  • 49. Copyright 2020 @nuits_jp Slide 49 依存する側 依存される側 変更! 安定度 低 高 柔軟性 高 低 別に興味 ないなあ… 依存関係による安定度と柔軟性のトレードオフ
  • 50. Copyright 2020 @nuits_jp Slide 50 依存する側 依存される側 安定度 低 高 柔軟性 高 低 依存関係による安定度と柔軟性のトレードオフ 安定度と柔軟性は トレードオフ!
  • 51. Copyright 2020 @nuits_jp Slide 51 逆説的に考えると・・・
  • 52. Copyright 2020 @nuits_jp Slide 52 依存する側 依存される側 安定度 低 高 柔軟性 高 低 変更頻度の高いオブジェクトは、依存する側に設計すべし 依存関係による安定度と柔軟性のトレードオフ
  • 53. Copyright 2020 @nuits_jp Slide 53 依存する側 依存される側 安定度 低 高 柔軟性 高 低 アプリケーションの本質的な価値を提供するオブジェク トは、軽微な変更の影響を受けてはいけない。 つまり依存される側に設計すべし。 依存関係による安定度と柔軟性のトレードオフ
  • 54. Copyright 2020 @nuits_jp Slide 54 さて、振り返ってみよう
  • 55. Copyright 2020 @nuits_jp Slide 55 柔軟性と安定度 柔軟性 安定度 高 中 低 低 中 高 依存の方向
  • 56. Copyright 2020 @nuits_jp Slide 56 どこの変更頻度が高く、どこが本質的な価値ですか?
  • 57. Copyright 2020 @nuits_jp Slide 57 柔軟性と安定度 柔軟性 安定度 高 中 低 低 中 高 高変更頻度
  • 58. Copyright 2020 @nuits_jp Slide 58 このアプリケーションの本質的な価値とは?
  • 59. Copyright 2020 @nuits_jp Slide 59 Application Overview アプリケーション「HatPepper」※ • 「リクルートWebサービス」の「グルメサーチAPI」を 利用させていただく • アプリケーションを起動するとダイレクトに検索結果 が表示される • 位置情報から周辺の店舗を検索する • 11時~14時の間はランチ営業のある店舗だけ表示する ※「HatPepper」は登録商標ではありません。安心。 これこそが価値の本質
  • 60. Copyright 2020 @nuits_jp Slide 60 柔軟性と安定度 柔軟性 安定度 高 中 低 低 中 高 高価値
  • 61. Copyright 2020 @nuits_jp Slide 61 柔軟性と安定度 柔軟性 安定度 高 中 低 低 中 高 高価値 ≒ビジネスロジック / ドメイン
  • 62. Copyright 2020 @nuits_jp Slide 62 柔軟性と安定度 柔軟性 安定度 高 中→低 低→高 低 中→高 高→低 高価値
  • 63. Copyright 2020 @nuits_jp Slide 63 柔軟性と安定度 柔軟性 安定度 高 中→低 低→高 低 中→高 高→低 依存の方向
  • 64. Copyright 2020 @nuits_jp Slide 64 Easiest Clean Architecture 依存性は、より上位レベルの方針にのみ向けよ
  • 65. Copyright 2020 @nuits_jp Slide 65 柔軟性と安定度 柔軟性 安定度 高 低 高 低 高 低 依存の方向
  • 66. Copyright 2020 @nuits_jp Slide 66 実現可能なのか?
  • 67. Copyright 2020 @nuits_jp Slide 67 柔軟性と安定度 柔軟性 安定度 高 低 高 低 高 低 依存の方向 制御の方向
  • 68. Copyright 2020 @nuits_jp Slide 68 Easiest Clean Architecture 制御の流れと依存関係の分離
  • 69. Copyright 2020 @nuits_jp Slide 69 制御の流れと依存関係の分離 凡例 制御の流れ 依存方向 クライアント オブジェクト サーバー オブジェクト 一般的に 制御の流れ=依存方向 になりがち <<具象概念>> <<具象概念>>
  • 70. Copyright 2020 @nuits_jp Slide 70 制御の流れと依存方向は分離しコントロールできる
  • 71. Copyright 2020 @nuits_jp Slide 71 制御の流れと依存関係の分離 凡例 制御の流れ 依存方向 クライアント オブジェクト サーバー オブジェクト そのためには関係のコントラクト(契約・仕様・お約束) のコンテキスト(文脈)を制御する <<具象概念>> <<具象概念>> コントラクト <<抽象概念>> それぞれの具象概念は抽象的な契約(仕様)に依存する
  • 72. Copyright 2020 @nuits_jp Slide 72 契約の文脈をコントロールする クライアント オブジェクト <<具象概念>> コントラクト <<抽象概念>> サーバー オブジェクト <<具象概念>> 凡例 制御の流れ 依存方向 文脈
  • 73. Copyright 2020 @nuits_jp Slide 73 契約の文脈をコントロールする クライアント オブジェクト <<具象概念>> コントラクト <<抽象概念>> サーバー オブジェクト <<具象概念>> クライアント オブジェクト <<具象概念>> コントラクト <<抽象概念>> サーバー オブジェクト <<具象概念>> 凡例 制御の流れ 依存方向 文脈
  • 74. Copyright 2020 @nuits_jp Slide 74 契約の文脈をコントロールする クライアント オブジェクト <<具象概念>> コントラクト <<抽象概念>> サーバー オブジェクト <<具象概念>> クライアント オブジェクト <<具象概念>> コントラクト <<抽象概念>> サーバー オブジェクト <<具象概念>> 凡例 制御の流れ 依存方向 文脈 依存性逆転の原則
  • 75. Copyright 2020 @nuits_jp Slide 75 具体例を見てみよう
  • 76. Copyright 2020 @nuits_jp Slide 76 柔軟性と安定度 この部分の 「コントラクト」 に注目する
  • 77. Copyright 2020 @nuits_jp Slide 77 クラス図
  • 78. Copyright 2020 @nuits_jp Slide 78 クラス図 APIクライアントの 呼び出しにフォーカ スしてみる
  • 79. Copyright 2020 @nuits_jp Slide 79 シーケンス図 usecaseはapiを呼び出している
  • 81. Copyright 2020 @nuits_jp Slide 81 ここが 「コントラクト」 依存させたい方向
  • 82. Copyright 2020 @nuits_jp Slide 82 ここが 「コントラクト」 二つの問題がある 依存させたい方向
  • 83. Copyright 2020 @nuits_jp Slide 83 ひとつ コントラクトがapi側に定義されている
  • 84. Copyright 2020 @nuits_jp Slide 84 依存の方向 依存の方向
  • 85. Copyright 2020 @nuits_jp Slide 85 ふたつめ コントラクトがWebAPIの文脈で記述されている
  • 86. Copyright 2020 @nuits_jp Slide 86 { "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分…
  • 87. Copyright 2020 @nuits_jp Slide 87 実装を確認して みる
  • 88. Copyright 2020 @nuits_jp Slide 88 package jp.nuits.hatpepper.usecase class FindNearbyRestaurantsImpl( val deviceLocationProvider: DeviceLocationProvider, val timeProvider: TimeProvider, val gourmetSearchApi: GourmetSearchApi ) : FindNearbyRestaurants { override suspend fun find(): List<Restaurant> { var deviceLocation = deviceLocationProvider.getDeviceLocation() // 現在地を取得する // 現在時刻が11時~14時の間で有った場合、ランチ営業している店舗のみを表示する var now = timeProvider.now() var lunchStart = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 11, 0) var lunchEnd = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 14, 0) var lunchTimeOnly = now.isAfter(lunchStart) && now.isBefore(lunchEnd) return gourmetSearchApi.find(deviceLocation, lunchTime).results.shop .map { Restaurant( it.id, it.name, it.genre.name, it.genre.catch, it.photo.pc.l, it.budget.average, it.mobile_access) }.toList() } } APIの戻り値を詰め なおしている
  • 89. Copyright 2020 @nuits_jp Slide 89 package jp.nuits.hatpepper.usecase class FindNearbyRestaurantsImpl( val deviceLocationProvider: DeviceLocationProvider, val timeProvider: TimeProvider, val gourmetSearchApi: GourmetSearchApi ) : FindNearbyRestaurants { override suspend fun find(): List<Restaurant> { var deviceLocation = deviceLocationProvider.getDeviceLocation() // 現在地を取得する // 現在時刻が11時~14時の間で有った場合、ランチ営業している店舗のみを表示する var now = timeProvider.now() var lunchStart = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 11, 0) var lunchEnd = LocalDateTime.of(now.year, now.month, now.dayOfMonth, 14, 0) var lunchTimeOnly = now.isAfter(lunchStart) && now.isBefore(lunchEnd) return gourmetSearchApi.find(deviceLocation, lunchTime).results.shop .map { Restaurant( it.id, it.name, it.genre.name, it.genre.catch, it.photo.pc.l, it.budget.average, it.mobile_access) }.toList() } } usecaseがAPIのJSON形 式に依存している APIの戻り値を詰め なおしている
  • 90. Copyright 2020 @nuits_jp Slide 90 どうすれば?
  • 91. Copyright 2020 @nuits_jp Slide 91 契約の文脈をコントロールする usecase <<具象概念>> コントラクト <<抽象概念>> infrastructure <<具象概念>> 変更前
  • 92. Copyright 2020 @nuits_jp Slide 92 契約の文脈をコントロールする usecase <<具象概念>> コントラクト <<抽象概念>> infrastructure <<具象概念>> usecase <<具象概念>> コントラクト <<抽象概念>> infrastructure <<具象概念>> 変更前 変更後
  • 93. Copyright 2020 @nuits_jp Slide 93 契約の文脈をコントロールする この依存を断ち切るこの依存を断ち切る
  • 94. Copyright 2020 @nuits_jp Slide 94 契約の文脈をコントロールする ① JSON依存オブジェクトを infrastructureへ隠蔽する ② APIのインターフェースは usecaseの文脈で記述する
  • 95. Copyright 2020 @nuits_jp Slide 95 契約の文脈をコントロールする 値の詰めなおしは ここで実装
  • 96. Copyright 2020 @nuits_jp Slide 96 契約の文脈をコントロールする 依存方向 値の詰めなおしは ここで実装 依存の方向
  • 97. Copyright 2020 @nuits_jp Slide 97 制御の流れと依存関係の分離 柔軟性 安定度 高 低 高 低 高 低 依存の方向 制御の方向
  • 98. Copyright 2020 @nuits_jp Slide 98 アプリケーション構造 usecase presentation api location time
  • 99. Copyright 2020 @nuits_jp Slide 99 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ 3. 上位レベルとは相対的・再帰的であることに留意せよ おさえるべき三つのこと
  • 100. Copyright 2020 @nuits_jp Slide 100 視点を上げてみよう
  • 101. Copyright 2020 @nuits_jp Slide 101 アプリケーションを取り巻く依存関係 依存の方向 apiが外部サービスに依存している いいのか?
  • 102. Copyright 2020 @nuits_jp Slide 102 いいんです!
  • 103. Copyright 2020 @nuits_jp Slide 103 具体例の背景と狙い • 田中さん(仮名)は某業種の技術営業をしています • 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。 • 外出先でホットペッパーを調べ、お店を探究することが生きがいです • ただ、ホットペッパーを愛しているのですが、一つだけ不満があります • 毎日同じ条件で、都度検索することを面倒に感じています • 田中さん(仮名)はAndroidユーザーです 背景 ※「ホットペッパー」は株式会社リクルート様の登録商標です そこで・・・ 自分専用のアプリケーションを開発しよう!
  • 104. Copyright 2020 @nuits_jp Slide 104 具体例の背景と狙い • 田中さん(仮名)は某業種の技術営業をしています • 田中さん(仮名)は「ホットペッパーグルメ※」が大好きです。愛しています。 • 外出先でホットペッパーを調べ、お店を探究することが生きがいです • ただ、ホットペッパーを愛しているのですが、一つだけ不満があります • 毎日同じ条件で、都度検索することを面倒に感じています • 田中さん(仮名)はAndroidユーザーです 背景 ※「ホットペッパー」は株式会社リクルート様の登録商標です そこで・・・ 自分専用のアプリケーションを開発しよう! 最上位レベルの方針! (つまりSolution)
  • 105. Copyright 2020 @nuits_jp Slide 105 依存の方向 • アプリケーションはWebサービスのインターフェースである • 本質はWebサービスにある • アプリケーションがWebサービスに依存してよい ※ 腐敗防止層を設けることは否定しない apiコンポーネントはWebサービスに依存してよい※
  • 106. Copyright 2020 @nuits_jp Slide 106 アプリケーション構造 usecase presentation api location time
  • 107. Copyright 2020 @nuits_jp Slide 107 アプリケーション構造 HatPepper アプリ
  • 108. Copyright 2020 @nuits_jp Slide 108 ホットペッパー サービス ソリューション構造 HatPepper アプリ
  • 109. Copyright 2020 @nuits_jp Slide 109 適切な関係性は背景によって変化する
  • 110. Copyright 2020 @nuits_jp Slide 110 ソリューション構造 ホットペッパー サービス HatPepper アプリ 【背景】 ホットペッパーを便利に利用するアプリケーションが欲しい! 凡例 自社サービス 他社サービス
  • 111. Copyright 2020 @nuits_jp Slide 111 ソリューション構造 飲食店横断検索 アプリ 【背景】 いろんな飲食店検索サービスを横断的に活用したい! A社 サービス 凡例 自社サービス 他社サービス B社 サービス C社 サービス
  • 112. Copyright 2020 @nuits_jp Slide 112 ソリューション構造 飲食店情報 サービス Web アプリ 【背景】 まったく新しい飲食店情報サービスを始めたい! マルチプラットで! 凡例 自社サービス 他社サービスAndroid アプリ iOS アプリ
  • 113. Copyright 2020 @nuits_jp Slide 113 それでもアプリケーションは・・・
  • 114. Copyright 2020 @nuits_jp Slide 114 Any solution, Any Platform... usecase presentation api location time
  • 115. Copyright 2020 @nuits_jp Slide 115 Easiest Clean Architecture 上位レベルとは相対的・再帰的であることに留意せよ
  • 116. Copyright 2020 @nuits_jp Slide 116 システム サブシステム コンポーネント ソフトウェアのフラクタル クラス サブシステム クラス コンポーネント クラス クラス ソフトウェア オブジェクトすべてに、ここまでの話は適用可能 • 要素間のインターフェースの文脈により、制御の流れと依存関係は制御可能 • 依存関係によって、安定性と柔軟性をコントロール可能 ソ フ ト ウ ェ ア オ ブ ジ ェ ク ト
  • 117. Copyright 2020 @nuits_jp Slide 117 ソフトウェア オブジェクト 代表的なコントラクト システム OpenAPI(なんならCSVのFTP転送) サブシステム OpenAPIやSwagger コンポーネント プログラム インターフェース クラス プログラム インターフェース ソフトウェア オブジェクトとコントラクト
  • 118. Copyright 2020 @nuits_jp Slide 118 -The architecture rules are the same! -
  • 119. Copyright 2020 @nuits_jp Slide 119 Easiest Clean Architecture What is SoftwareArchitecture?
  • 120. Copyright 2020 @nuits_jp Slide 120 !ここからは私見成分高め!
  • 121. Copyright 2020 @nuits_jp Slide 121 1. MVC 2. MVP 3. MVVM 4. MVPVM 5. クリーン アーキテクチャ 6. レイヤー アーキテクチャ 7. オニオン アーキテクチャ などなど これらはソフトウェア アーキテクチャの類型的なパターン群です ソフトウェア アーキテクチャといえば何を思い浮かべますか? Copyright 2017 @nuits_jp Slide 121
  • 122. Copyright 2020 @nuits_jp Slide 122 ソフトウェア アーキテクチャとは何か? ソフトウェアアーキテクチャでは、ソフトウェア システムの構成に関する一連 の重要な判断を網羅しています。これには、システムを構成する要素とイン ターフェイスの選択、要素間のコラボレーションとして指定される動作、この ような構成と動作の要素のより大きなサブシステムに対する構成、この構成の 指針となるアーキテクチャスタイルが含まれます。また、機能性、ユーザビリ ティ、復元性、パフォーマンス、再利用性、理解できること、経済的な制約、 テクノロジの制約、トレードオフ、および外観への配慮も必要です。 by Philippe Kruchten, Grady Booch, Kurt Bittner, Rich Reitman Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用 Copyright 2017 @nuits_jp Slide 122
  • 123. Copyright 2020 @nuits_jp Slide 123 ソフトウェア アーキテクチャとは何か? アーキテクチャは、システムを大きなレベルで分解したもので、決定事項の変 更は困難です。システムには複数のアーキテクチャが存在し、アーキテクチャ にとって重要な事項はシステムの運用中に変化します。要するに、重要な要素 は、すべてアーキテクチャということになります。 by Martin Fowler Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用 Copyright 2017 @nuits_jp Slide 123
  • 124. Copyright 2020 @nuits_jp Slide 124 ソフトウェア アーキテクチャとは何か? ソフトウェアアーキテクチャとは、抽象化と問題の分割によって複雑性を減ら すことを主に念頭に置いたものである。ただし、今までのところ、「ソフト ウェアアーキテクチャ」という用語に関して、万人が合意した厳密な定義は存 在しない Wikipedia「ソフトウェアアーキテクチャ」より引用 Copyright 2017 @nuits_jp Slide 124
  • 125. Copyright 2020 @nuits_jp Slide 125Slide 125Copyright 2017 @nuits_jp とは言え、おおよその共通認識はある
  • 126. Copyright 2020 @nuits_jp Slide 126 1. ソフトウェアアーキテクチャとは システムアーキテクチャのうち、ソフトウェア領域のアーキテク チャである この時「システム」とは「IT」だけではなく、それらを取り巻く社 会やビジネスを含めた「仕組み」を指すことも多い ※ 元来「System」とは制度・組織・体系・系統などのこと ソフトウェア アーキテクチャとは何か?かみ砕くと… Copyright 2017 @nuits_jp
  • 127. Copyright 2020 @nuits_jp Slide 127 2. ソフトウェア アーキテクチャとは 1. ソフトウェアにおける重要な決定事項全てである 2. その中でも特につぎの2点が重要 1. ソフトウェア全体を、どのように分割するか 2. 分割した部分同士を、どう結合し相互作用させるか ソフトウェア アーキテクチャとは何か?かみ砕くと… Copyright 2017 @nuits_jp
  • 128. Copyright 2020 @nuits_jp Slide 128 3. ソフトウェアアーキテクチャを構築するのはなぜか? • 「システムの実現をサポートする」 • 「持続可能なソフトウェア」を • 「バランスよく」構築するため 4. ソフトウェアアーキテクチャのバランスとは? 1. Quality(機能・非機能) 2. Cost 3. Delivery(開発期間) アーキテクチャは非機能要求からも大きく影響をうける ソフトウェア アーキテクチャとは何か?かみ砕くと… Copyright 2017 @nuits_jp
  • 129. Copyright 2020 @nuits_jp Slide 129 Easiest Clean Architecture Clean Architectureを考えるうえで重要なポイント
  • 130. Copyright 2020 @nuits_jp Slide 130 2. ソフトウェア アーキテクチャとは 1. ソフトウェアにおける重要な決定事項全てである 2. その中でも特につぎの2点が重要 1. ソフトウェア全体を、どのように分割するか 2. 分割した部分同士を、どう結合し、相互作用させるか ソフトウェア アーキテクチャとは何か?かみ砕くと… Copyright 2017 @nuits_jp
  • 131. Copyright 2020 @nuits_jp Slide 131 2. ソフトウェア アーキテクチャとは 1. ソフトウェアにおける重要な決定事項全てである 2. その中でも特につぎの2点が重要 1. ソフトウェア全体を、どのように分割するか 2. 分割した部分同士を、どう結合し、相互作用させるか ソフトウェア アーキテクチャとは何か?かみ砕くと… Copyright 2017 @nuits_jp ソフトウェアアーキテクチャ3種の神器
  • 132. Copyright 2020 @nuits_jp Slide 132 1. 関心の分離(SoC:Separation of concerns) 2. 疎結合 3. 依存性逆転の原則 ソフトウェアアーキテクチャ3種の神器
  • 133. Copyright 2020 @nuits_jp Slide 133 上位の関心 ソフトウェア アーキテクチャの3種の神器
  • 134. Copyright 2020 @nuits_jp Slide 134 上位の関心 個別の関心 ソフトウェア アーキテクチャの3種の神器 個別の関心 関心の分離
  • 135. Copyright 2020 @nuits_jp Slide 135 上位の関心 個別の関心 ソフトウェア アーキテクチャの3種の神器 個別の関心 関心の分離 上位の関心 個別の関心 ソリューション サブシステム コンポーネント クラス
  • 136. Copyright 2020 @nuits_jp Slide 136 上位の関心 個別の関心 ソフトウェア アーキテクチャの3種の神器 個別の関心 関心の分離 上位の関心 個別の関心 ソリューション サブシステム ユースケース コンポーネント クラス(名前空間?)
  • 137. Copyright 2020 @nuits_jp Slide 137 上位の関心 個別の関心 ソフトウェア アーキテクチャの3種の神器 個別の関心 関心の分離
  • 138. Copyright 2020 @nuits_jp Slide 138 上位の関心 個別の関心 ソフトウェア アーキテクチャの3種の神器 個別の関心 関心の分離 疎結合 コントラクト (≒Interface)
  • 139. Copyright 2020 @nuits_jp Slide 139 上位の関心 個別の関心 ソフトウェア アーキテクチャの3種の神器 個別の関心 関心の分離 疎結合 コントラクト (≒Interface) 依存性逆転の原則 ( 上位の安定度と、下位の柔軟性を高めよ)
  • 140. Copyright 2020 @nuits_jp Slide 140 What is Clean Architecture?
  • 141. Copyright 2020 @nuits_jp Slide 141 Clean Architecture is ... クリーンアーキテクチャとは 「ソフトウェアアーキテクチャ3種の神器を適用した リファレンスアーキテクチャのひとつ」
  • 142. Copyright 2020 @nuits_jp Slide 142 Easiest Clean Architecture Clean Architectureって不可能では?
  • 143. Copyright 2020 @nuits_jp Slide 143 フレームワークとアーキテクチャ 「フレーム ワークなんかと結婚 する な!」 フレーム ワーク は、 アーキテクチャの円の外側にあるものと して扱おう。円 の内側に組み込んではいけない。 (中略) 優れ たソフトウェア アーキテクチャがあれ ば、フレームワー ク、データベース、ウェブサーバー、その他の環境の問題や ツールの意思決定を延期・留保 できる。 フレーム ワークの選 択肢は残されたままだ。 以下「CleanArchitecture 達人に学ぶソフトウェアの構造と設計」より引用
  • 144. Copyright 2020 @nuits_jp Slide 144 よく見かける疑問 • UIフレームワークやライブラリ非依存なんて無理(無意味) • データベースに依存しないとか無理 • SQL使わないと実装できないじゃん? • データベースのスキーマ(データ構造) への依存は避けられない
  • 145. Copyright 2020 @nuits_jp Slide 145 よく見かける疑問 • UIフレームワークやライブラリ非依存なんて無理(無意味) • データベースに依存しないとか無理 • SQL使わないと実装できないじゃん? • データベースのスキーマ(データ構造) への依存は避けられない 真に受けすぎる必要はない
  • 146. Copyright 2020 @nuits_jp Slide 146 関心の粒度による上下関係 例えば・・・ 今回のサンプルアプリケーションはCardViewに依存している。 これはNGなのか? 一定条件を満たせば問題ないと考えています。 HatPepper アプリケーション usecase infrastructurepresentation view model view androidx.c ardview
  • 147. Copyright 2020 @nuits_jp Slide 147 以下のような「上位レベルの決断」の上であれば問題ない • 開発生産性・品質を考慮した結果、androidx.cardviewを利用したほう が「より良い」 • androidx.cardviewは十分に後方互換性を考慮して開発されており、そ の変化をアプリケーションは許容できる・する • ただし依存関係はpresentation内に限定する 関心の粒度による上下関係 HatPepper アプリケーション usecase infrastructurepresentation view model view androidx.c ardview
  • 148. Copyright 2020 @nuits_jp Slide 148 そもそも 以下から切り離すというのはナンセンスですよね? • Androidというプラットフォーム • Kotlinというプログラミング言語 • Android StudioというIDE • Gradleというビルドツール • などなど
  • 149. Copyright 2020 @nuits_jp Slide 149 抽象と具象は程度の問題 • 詳細(フレームワークなど)の決定を遅らせることは、イニシャ ルコストの増加を招きがち • 具象を早い段階で受け入れる(決定する)ことで、コストや開発 期間の圧縮や、品質の向上を図るというのも、当然検討すべき アーキテクチャ上の「上位の方針」として受容するのは十分あり Clean Architecture原理主義になる必要はないが 同時にAnti Clean Architectureになる必要もない これらを・・・
  • 150. Copyright 2020 @nuits_jp Slide 150 Easiest Clean Architecture まとめ
  • 151. Copyright 2020 @nuits_jp Slide 151 Clean Architectureとは、どんなソフトウェアにも適用可能な普 遍的なアーキテクチャの原則である まとめ
  • 152. Copyright 2020 @nuits_jp Slide 152 Clean Architecture is ... クリーンアーキテクチャとは 「ソフトウェアアーキテクチャ3種の神器を適用した リファレンスアーキテクチャのひとつ」
  • 153. Copyright 2020 @nuits_jp Slide 153 上位の関心 個別の関心 ソフトウェア アーキテクチャの3種の神器 個別の関心 関心の分離 疎結合 コントラクト (≒Interface) 依存性逆転の原則 ( 上位の安定度と、下位の柔軟性を高めよ)
  • 154. Copyright 2020 @nuits_jp Slide 154 1. 依存性は、より上位レベルの方針にのみ向けよ おさえるべき三つのこと
  • 155. Copyright 2020 @nuits_jp Slide 155 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ おさえるべき三つのこと
  • 156. Copyright 2020 @nuits_jp Slide 156 1. 依存性は、より上位レベルの方針にのみ向けよ 2. 制御の流れと依存方向は分離しコントロールせよ 3. 上位レベルとは相対的・再帰的であることに留意せよ おさえるべき三つのこと
  • 157. Copyright 2020 @nuits_jp Slide 157 Clean Architectureは、次のふたつを誤解されがち 1. 参考図の通りに関心を分離するのがClean Architectureである 2. データや処理の流れを一方通行にしろ 上記は、陥りがちな誤りであり、Clean Architectureの本質とは異なりま す。 誤解されがちな二つのこと
  • 158. Copyright 2020 @nuits_jp Slide 158 一読の価値あり Slide 158
  • 159. Copyright 2020 @nuits_jp Slide 159 という訳で・・・
  • 160. Copyright 2020 @nuits_jp Slide 160 Today’s Goal みなさん 「クリーンアーキテクチャチョットデキル」 ようになりましたね?
  • 161. Copyright 2020 @nuits_jp Slide 161 ThankYou! Any Questions?