擬人化で完全に理解するクリーンアーキテクチャ
by
shimabox
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
擬人化で完全に理解する クリーンアーキテクチャ 2024/02/11 ペチコン関西2024 by しまぶ@shimabox
Slide 2
Slide 2 text
自己紹介
Slide 3
Slide 3 text
Clean Architecture 達人に学ぶソフトウェアの構造と設計 はじめに ● これからお話しすることは、この本を 読んで得た自分なりの理解に基づいて います ● 発表内容で出てくる用語や概念につい ては、ほぼほぼこの本の内容と自分の 個人的な解釈が混ざり合っていると考 えてください ※ 他には`ちょうぜつソフトウェア設計入門`など から知識を得ています
Slide 4
Slide 4 text
1. 各レイヤーの概要 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ アジェンダ
Slide 5
Slide 5 text
1. 各レイヤーの概要 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ アジェンダ
Slide 6
Slide 6 text
1. 各レイヤーの概要 クリーンアーキテクチャと言えば? ● エンティティ ○ ちょうぜつだと、ドメインモデル ○ 最上位、一番内側 と言われる ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー ○ ちょうぜつだと、インフラストラク チャー ○ 最下位、一番外側 と言われる
Slide 7
Slide 7 text
1. 各レイヤーの概要 クリーンアーキテクチャと言えば?上位、下位って? ● エンティティ ○ ちょうぜつだと、ドメインモデル ○ 最上位、一番内側 と言われる ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー ○ ちょうぜつだと、インフラストラク チャー ○ 最下位、一番外側 と言われる
Slide 8
Slide 8 text
1. 各レイヤーの概要 クリーンアーキテクチャと言えば?上位、下位って? ● エンティティ ○ ちょうぜつだと、ドメインモデル ○ 最上位、一番内側 と言われる ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー ○ ちょうぜつだと、インフラストラク チャー ○ 最下位、一番外側 と言われる あくまでもイメージ
Slide 9
Slide 9 text
1. 各レイヤーの概要 エンティティ(ドメインモデル) ● 企業のビジネスルール(方針) ● 業務そのもの ● これだけでも成り立つ ● ビジネスロジック ○ 人間が考えるところ → 高レイヤー ● 最重要
Slide 10
Slide 10 text
1. 各レイヤーの概要 ユースケース ● アプリケーション固有のビジネスルール ● エンティティ(最重要ビジネスルール)を組み合わせてやり たいことを達成する ● 何ができるのかの部分 ● 内部
Slide 11
Slide 11 text
1. 各レイヤーの概要 インターフェイスアダプター ● 外部と内部との仲介役 ● 外部の要求を内部に伝える ● 内部からの返答を外部に返す ● 関心ごとの変換 ● Controller, Gateway, Presenter
Slide 12
Slide 12 text
1. 各レイヤーの概要 フレームワークとドライバー(インフラストラクチャー) ● フレームワーク, UI, DB, API, テスト, 外部ライブラリ な どなど ● 詳細(些細なもの) ○ プログラムの本質的な目的に直接は貢献しないが、そ れを実現するために必要な技術的なツールや仕組み ○ 技術詳細 ○ 技術(機械)に任せる → 低レイヤー ● 外部
Slide 13
Slide 13 text
1. 各レイヤーの概要 クリーンアーキテクチャと言えば? 登場するのはこの4つのレイヤー (荒ぶってはいない)
Slide 14
Slide 14 text
1. クリーンアーキテクチャについて 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ 2. 擬人化してみる
Slide 15
Slide 15 text
2. 擬人化してみる レイヤーそのものを擬人化してみようと思ったが...
Slide 16
Slide 16 text
2. 擬人化してみる レイヤーそのものを擬人化してみようと思ったが... 挫折
Slide 17
Slide 17 text
2. 擬人化してみる レイヤーそのものを擬人化してみようと思ったが... シナリオを考える必要がある
Slide 18
Slide 18 text
2. 擬人化してみる シナリオを考えてみた バンド(ミュージシャン)が 曲をリリースする
Slide 19
Slide 19 text
2. 擬人化してみる 某バンド(Bump of Kitchen)を題材に考えてみた
Slide 20
Slide 20 text
2. 擬人化してみる 某バンド(Bump of Kitchen)を題材に考えてみた やっぱり無茶がある 😇
Slide 21
Slide 21 text
2. 擬人化してみる なぜ無茶があるのか ● そもそもの誤解がある ○ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない ● この4つのレイヤーの役割も抽象的 ○ 中にも色々な役割/概念がある、擬人化で具体化するのは無謀 ● ソースコードの依存性は常に内側(上位レベルの方針)にむける ● 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ ● 究極、この2つのことしか言っていない
Slide 22
Slide 22 text
2. 擬人化してみる なぜ無茶があるのか ● そもそもの誤解がある ○ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない ● この4つのレイヤーの役割も抽象的 ○ 中にも色々な役割/概念がある、擬人化で具体化するのは無謀 ● ソースコードの依存性は常に内側(上位レベルの方針)にむける ● 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ ● 究極、この2つのことしか言っていない ● 4つのレイヤーにそこまで触れていない!!
Slide 23
Slide 23 text
● そもそもの誤解がある ○ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない ● この4つのレイヤーの役割も抽象的 ○ 中にも色々な役割/概念がある、擬人化で具体化するのは無謀 ● ソースコードの依存性は常に内側(上位レベルの方針)にむける ● 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ ● 究極、この2つのことしか言っていない ● 4つのレイヤーにそこまで触れていない!! 2. 擬人化してみる なぜ無茶があるのか
Slide 24
Slide 24 text
2. 擬人化してみる じゃあ、クリーンアーキテ クチャってなんだろう?
Slide 25
Slide 25 text
1. クリーンアーキテクチャについて 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ 3. クリーンアーキテクチャって?
Slide 26
Slide 26 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる ● エンティティ ○ ちょうぜつだと、ドメインモデル ○ 最上位、一番内側 と言われる ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー ○ ちょうぜつだと、インフラストラク チャー ○ 最下位、一番外側 と言われる
Slide 27
Slide 27 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる ● エンティティ ○ ちょうぜつだと、ドメインモデル ○ 最上位、一番内側 と言われる ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー ○ ちょうぜつだと、インフラストラク チャー ○ 最下位、一番外側 と言われる
Slide 28
Slide 28 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる ● エンティティ ○ ちょうぜつだと、ドメインモデル ○ 最上位、一番内側 と言われる ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー ○ ちょうぜつだと、インフラストラク チャー ○ 最下位、一番外側 と言われる ここらへんが 重要なところ (エンティ ティが一番重 要だけど)
Slide 29
Slide 29 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる ● エンティティ ○ ○ ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー
Slide 30
Slide 30 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる ● エンティティ ○ ○ ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー
Slide 31
Slide 31 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる ● エンティティ ○ ○ ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー
Slide 32
Slide 32 text
● エンティティ ○ ちょうぜつだと、ドメインモデル ○ 最上位、一番内側 と言われる ● ユースケース ● インターフェイスアダプター ● フレームワークとドライバー ○ ちょうぜつだと、インフラストラク チャー ○ 最下位、一番外側 と言われる ソースコードの依存性は、内側 (上位レベルの方針) だけに向かっていかなくてはならない 3. クリーンアーキテクチャって? 実装例を見てみる
Slide 33
Slide 33 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる
Slide 34
Slide 34 text
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? ● Fooは安定度が低い Baz Bar Foo ・・・
Slide 35
Slide 35 text
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? ● Fooは安定度が低い ● Barなどに変更が入るとFooに影響 が出る ● FooはBarのことを知っている ● FooはBarに依存する Baz Bar Foo ・・・ ❌ 変更 ❌ 影響
Slide 36
Slide 36 text
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? ● Fooは安定度が高い Baz Bar Foo ・・・
Slide 37
Slide 37 text
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? ● Fooは安定度が高い ● Barなどに変更が入ってもFooには 関係ない ● FooはBarのことを知らない Baz Bar Foo ・・・ ❌ 変更
Slide 38
Slide 38 text
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? ● Fooは安定度が高い ● Barなどに変更が入ってもFooには 関係ない ● FooはBarのことを知らない ● 依存されているものが多いほど安 定度は高いが... Baz Bar Foo ・・・
Slide 39
Slide 39 text
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? ● Fooは安定度が高い ● Barなどに変更が入ってもFooには 関係ない ● FooはBarのことを知らない ● 依存されているものが多いほど安 定度は高いが... ○ Fooに変更が入ったら依存されている ものに影響が出る ○ なるべく変更されにくいものとしたい Baz Bar Foo ・・・ ❌ 影響 ❌ 変更 ❌ 影響 ❌ 影響
Slide 40
Slide 40 text
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? ● 依存しているほうの変更は影響を 与えない ○ 影響を与えないということは変更しや すい Baz Bar Foo ・・・ ❌ 変更
Slide 41
Slide 41 text
ここまでをいったん整理 3. クリーンアーキテクチャって? ● 依存している ○ 依存先の影響を受ける ■ 安定度が低い ○ 変更しても依存先に影響を与えない ■ 変更しやすい ● 依存されている ○ 依存元の影響を受けない ■ 安定度が高い ○ 変更すると依存元に影響を与える ■ なるべく変更したくない Bar Foo 依存している (依存元) 依存されている (依存先)
Slide 42
Slide 42 text
ここまでをいったん整理 3. クリーンアーキテクチャって? ● 依存している ○ 依存先の影響を受ける ■ 安定度が低い ○ 変更しても依存先に影響を与えない ■ 変更しやすい ● 依存されている ○ 依存元の影響を受けない ■ 安定度が高い ○ 変更すると依存元に影響を与える ■ なるべく変更したくない Bar Foo 依存している (依存元) 依存されている (依存先) 詳細 (技術詳細) 方針 (ビジネスルール)
Slide 43
Slide 43 text
● 依存されている ○ エンティティ、ユースケース ● エンティティ(ドメインモデル) ○ 企業のビジネスルール(方針) ■ 変わらないもの ○ 一番大事 ● ユースケース ○ エンティティを組み合わせてやりたい ことを達成する ○ ビジネスを行う上でここも大事 ● どれも下位の影響を受けたくない 実装例をもう一度見てみる 3. クリーンアーキテクチャって?
Slide 44
Slide 44 text
● 依存されている ○ エンティティ、ユースケース ● エンティティ(ドメインモデル) ○ 企業のビジネスルール(方針) ■ 変わらないもの ○ 一番大事 ● ユースケース ○ エンティティを組み合わせてやりたい ことを達成する ○ ビジネスを行う上でここも大事 ● どれも下位の影響を受けたくない 実装例をもう一度見てみる 3. クリーンアーキテクチャって?
Slide 45
Slide 45 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・ユースケースがフレー ムワークとドライバ(イン フラストラクチャ)に依存 していたら
Slide 46
Slide 46 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・変わると困るもの、影 響を受けたくないものに 依存する ・ここはDBに限らない、 外部のAPIだったり、フ レームワークだったり
Slide 47
Slide 47 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・ここに抽象(Interface) を用意 ・方針(重要なもの)を 詳細(些細なもの)に依存 させない ・詳細が抽象に依存する
Slide 48
Slide 48 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる これをDIPという - 依存性逆転の原則 - Dependency Inversion Principle
Slide 49
Slide 49 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる 依存性を注入することを DIという - 依存性の注入 - Dependency Injection
Slide 50
Slide 50 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・UseCaseからの処理の 流れは変わらないけど、 下位への依存が無くなる ・DataAccessが上位の Interfaceに依存する(依 存先から依存元になる)
Slide 51
Slide 51 text
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・UseCaseからすると DataAccessが何をして いるのかは知らなくて良 い ・技術詳細に無関心でい られる
Slide 52
Slide 52 text
DIPについてもう少し 3. クリーンアーキテクチャって? ● BarがBazを利用するとなった場合 ● 循環依存になってしまう ○ 依存先をたどると、自分に戻ってこれ る ● 循環依存は避けたい Foo Bar Baz (変わりやす い)
Slide 53
Slide 53 text
DIPについてもう少し 3. クリーンアーキテクチャって? ● BarがBazを利用するとなった場合 ● 循環依存になってしまう ○ 依存先をたどると、自分に戻ってこれ る ● 循環依存は避けたい ○ 変更が入ったら伝播する ○ もしかすると、Bazの変更がBarに伝 播してFooに伝播するかもしれない ❌ 変更 ❌ 影響 Foo Bar Baz (変わりやす い) ❌ 影響
Slide 54
Slide 54 text
DIPについてもう少し 3. クリーンアーキテクチャって? ● Barがやりたいことをインター フェイスとして用意 ● Bazがインターフェイスのお約束 に沿って実装 ● Barはインターフェイスに依存 ● 循環依存しているものを有向非循 環グラフ(DAG)に戻す ○ 依存先をたどっても、自分に戻らない 境界線 Foo Bar Baz (変わりやす い) XXX Interface
Slide 55
Slide 55 text
DIPについてもう少し 3. クリーンアーキテクチャって? ● Bazがインターフェイスの約束事 を守っている限り ● Bazの変更はBarに伝播しない 境界線 Foo Bar Baz (変わりやす い) XXX Interface ❌ 変更
Slide 56
Slide 56 text
DIPについてもう少し 3. クリーンアーキテクチャって? 境界線 Foo Bar Baz (変わりやす い) XXX Interface ● 変わると困るもの、影響を受けた くないもの、変わりやすいものに 直接依存しないように依存関係を 逆転させる ○ 抽象との会話にする ○ インターフェイス超大事 ● 依存の向きを整理する ○ ぐちゃぐちゃした依存関係嫌ですよね ● DIP超大事
Slide 57
Slide 57 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? ● 依存関係逆転の原則(DIP)をめちゃくちゃ大事にしている ● 抽象を使って依存関係を逆転させる ○ 方針(上位)に詳細(下位)の変更の影響を伝播させたくない ● 方針(上位)を頑張って決めて、詳細(下位)の決定は後にする ○ DIP使っていればできるよね ● クリーンアーキテクチャを作っているのではない ● エンティティ === ビジネス を作っている ● 円の中心でビジネスを叫びたい ● これを説明するために、あの同心円の図がただある ● 詳細、抽象、方針の関係性が大事
Slide 58
Slide 58 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? 誤解を恐れずに言うと
Slide 59
Slide 59 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? クリーンアーキテクチャ なんてものはない
Slide 60
Slide 60 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? クリーンな アーキテクチャへの みちしるべ
Slide 61
Slide 61 text
クリーンって? 3. クリーンアーキテクチャって? ● 内部に異質なものがない ● 依存がぐちゃぐちゃしていない ● 変更に対する影響が予測可能
Slide 62
Slide 62 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? そんなのむずくね?
Slide 63
Slide 63 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? そこでSOLID原則がある
Slide 64
Slide 64 text
そんなのむずくね? 3. クリーンアーキテクチャって? ● 依存がぐちゃぐちゃしていない ● 変更に対する影響が予測可能 ● この2つに関してはSOLID原則を適応していく ○ 修正範囲を絞るために単一責任の原則(SRP)があるし ● 閉鎖性共通の原則(CCP)のほうがしっくりくるかも ○ 修正の影響を広げないためにオープン・クローズドの原則(OCP) があるし ○ 余計なものに依存しないようにインターフェイス分離の原則 (ISP)がある ● と思っている(DIPは言わずもがな、リスコフの置換原則(LSV)はすいません)
Slide 65
Slide 65 text
そんなのむずくね? 3. クリーンアーキテクチャって? ● 内部に異質なものがない ● 内部にはビジネスに対する問題領域を解決するためのピュアなオブ ジェクト(エンティティ)が求められる ● どうやってエンティティを抽出するか ● ガチでやるならモデリングが必要 ● 詳細にどこまで依存して、どこから決別するのか検討する必要がある ○ ActiveRecord ● SOLID原則を使いながら依存を整理していく ● 円の中心でエンティティを叫ばせる ● アーキテクチャではなく、ビジネスを作る
Slide 66
Slide 66 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? SOLID原則を突き詰めれば クリーンになる
Slide 67
Slide 67 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? SOLID原則を突き詰めれば クリーンになる 失敗例から学ぶSOLID原則 - Speaker Deck https://speakerdeck.com/asumikam/failure-example-solid 神
Slide 68
Slide 68 text
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? 依存の向きを整える
Slide 69
Slide 69 text
1. クリーンアーキテクチャについて 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ 4. まとめ
Slide 70
Slide 70 text
2. 擬人化してみる 4. まとめ 4. まとめ クリーンアーキテクチャは 擬人化するものじゃないし できるものでもなかった
Slide 71
Slide 71 text
● 4つのレイヤーはただの例 ○ 中にも色々な役割/概念がある ○ エンティティを作るための抽象化された考え方 ○ わたしは無知だった ● 大事なのは、詳細、抽象、方針 ● クリーンアーキテクチャなんてものはない ● あるのはクリーンなアーキテクチャへの道しるべ ● SOLID原則を突き詰めるとクリーンになる ● 依存の向きを整えて円の中心でエンティティを叫ばせる 2. 擬人化してみる 4. まとめ 4. まとめ
Slide 72
Slide 72 text
クリーンアーキテクチャと言えば? 登場するのはこの4つのレイヤー (荒ぶってはいない) 4. まとめ
Slide 73
Slide 73 text
クリーンアーキテクチャと言えば? この4つのレイヤーなんていらなかったんや ❌❌❌❌ 4. まとめ
Slide 74
Slide 74 text
詳細くん、抽象ちゃん、方針さん だけでよかったんや クリーンアーキテクチャと言えば? 4. まとめ
Slide 75
Slide 75 text
詳細くん、抽象ちゃん、方針さん だけでよかったんや クリーンアーキテクチャと言えば? 4. まとめ 距離が空いているな?
Slide 76
Slide 76 text
詳細くん、抽象ちゃん、方針さん だけでよかったんや クリーンアーキテクチャと言えば? 4. まとめ 外部からうるさく言ってくる人(詳細)から ビジネスを作りたい人(方針)を守る人(抽象) の図に見えなくもない(???)
Slide 77
Slide 77 text
2. 擬人化してみる 4. まとめ 4. まとめ アーキテクチャではなく、 ビジネスを作る
Slide 78
Slide 78 text
2. 擬人化してみる 4. まとめ 4. まとめ あなたは 何を作っていますか NO ENTITY, NO LIFE.
Slide 79
Slide 79 text
2. 擬人化してみる 4. まとめ 4. まとめ 擬人化では 完全に理解できなかった クリーンアーキテクチャ
Slide 80
Slide 80 text
2. 擬人化してみる 4. まとめ 4. まとめ 参考 ● Clean Architecture 達人に学ぶソフトウェアの構造と設計 ○ https://www.amazon.co.jp/dp/B07FSBHS2V ● ちょうぜつソフトウェア設計入門 ○ https://www.amazon.co.jp/dp/B0BNH1J2W2 ● Software Design (ソフトウェアデザイン) 2023年6月号 ○ https://www.amazon.co.jp/dp/B0C4K9X2XV ○ クリーンアーキテクチャとは何か? ● 世界一わかりやすいClean Architecture - nuits.jp blog ○ https://www.nuits.jp/entry/easiest-clean-architecture-2019-09 ● Javaでクリーンアーキテクチャする方法 ○ https://logmi.jp/tech/articles/323233
Slide 81
Slide 81 text
2. 擬人化してみる 4. まとめ 4. まとめ ご清聴ありがとうございました