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. まとめ ご清聴ありがとうございました