Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
擬人化で完全に理解するクリーンアーキテクチャ
Search
shimabox
February 11, 2024
Programming
19
7.9k
擬人化で完全に理解するクリーンアーキテクチャ
PHPカンファレンス関西2024 の発表資料になります
shimabox
February 11, 2024
Tweet
Share
More Decks by shimabox
See All by shimabox
並行処理を学びGuzzleと仲良くなる
shimabox
2
910
Unit of Workパターンで永続化とトランザクションを制御する
shimabox
10
5.6k
PHPDocにおける配列の型定義を少し知る
shimabox
2
3.3k
Other Decks in Programming
See All in Programming
受け取る人から提供する人になるということ
little_rubyist
0
250
Make Impossible States Impossibleを 意識してReactのPropsを設計しよう
ikumatadokoro
0
230
ActiveSupport::Notifications supporting instrumentation of Rails apps with OpenTelemetry
ymtdzzz
1
250
CSC509 Lecture 13
javiergs
PRO
0
110
Figma Dev Modeで変わる!Flutterの開発体験
watanave
0
140
cmp.Or に感動した
otakakot
3
200
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
110
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
890
役立つログに取り組もう
irof
28
9.6k
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
300
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
340
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
120
Featured
See All Featured
The Language of Interfaces
destraynor
154
24k
We Have a Design System, Now What?
morganepeng
50
7.2k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Teambox: Starting and Learning
jrom
133
8.8k
GitHub's CSS Performance
jonrohan
1030
460k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
Site-Speed That Sticks
csswizardry
0
28
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Code Review Best Practice
trishagee
64
17k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
Transcript
擬人化で完全に理解する クリーンアーキテクチャ 2024/02/11 ペチコン関西2024 by しまぶ@shimabox
自己紹介
Clean Architecture 達人に学ぶソフトウェアの構造と設計 はじめに • これからお話しすることは、この本を 読んで得た自分なりの理解に基づいて います • 発表内容で出てくる用語や概念につい
ては、ほぼほぼこの本の内容と自分の 個人的な解釈が混ざり合っていると考 えてください ※ 他には`ちょうぜつソフトウェア設計入門`など から知識を得ています
1. 各レイヤーの概要 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ アジェンダ
1. 各レイヤーの概要 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ アジェンダ
1. 各レイヤーの概要 クリーンアーキテクチャと言えば? • エンティティ ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる
• ユースケース • インターフェイスアダプター • フレームワークとドライバー ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
1. 各レイヤーの概要 クリーンアーキテクチャと言えば?上位、下位って? • エンティティ ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる
• ユースケース • インターフェイスアダプター • フレームワークとドライバー ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
1. 各レイヤーの概要 クリーンアーキテクチャと言えば?上位、下位って? • エンティティ ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる
• ユースケース • インターフェイスアダプター • フレームワークとドライバー ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる あくまでもイメージ
1. 各レイヤーの概要 エンティティ(ドメインモデル) • 企業のビジネスルール(方針) • 業務そのもの • これだけでも成り立つ •
ビジネスロジック ◦ 人間が考えるところ → 高レイヤー • 最重要
1. 各レイヤーの概要 ユースケース • アプリケーション固有のビジネスルール • エンティティ(最重要ビジネスルール)を組み合わせてやり たいことを達成する • 何ができるのかの部分
• 内部
1. 各レイヤーの概要 インターフェイスアダプター • 外部と内部との仲介役 • 外部の要求を内部に伝える • 内部からの返答を外部に返す •
関心ごとの変換 • Controller, Gateway, Presenter
1. 各レイヤーの概要 フレームワークとドライバー(インフラストラクチャー) • フレームワーク, UI, DB, API, テスト, 外部ライブラリ
な どなど • 詳細(些細なもの) ◦ プログラムの本質的な目的に直接は貢献しないが、そ れを実現するために必要な技術的なツールや仕組み ◦ 技術詳細 ◦ 技術(機械)に任せる → 低レイヤー • 外部
1. 各レイヤーの概要 クリーンアーキテクチャと言えば? 登場するのはこの4つのレイヤー (荒ぶってはいない)
1. クリーンアーキテクチャについて 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ 2. 擬人化してみる
2. 擬人化してみる レイヤーそのものを擬人化してみようと思ったが...
2. 擬人化してみる レイヤーそのものを擬人化してみようと思ったが... 挫折
2. 擬人化してみる レイヤーそのものを擬人化してみようと思ったが... シナリオを考える必要がある
2. 擬人化してみる シナリオを考えてみた バンド(ミュージシャン)が 曲をリリースする
2. 擬人化してみる 某バンド(Bump of Kitchen)を題材に考えてみた
2. 擬人化してみる 某バンド(Bump of Kitchen)を題材に考えてみた やっぱり無茶がある 😇
2. 擬人化してみる なぜ無茶があるのか • そもそもの誤解がある ◦ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない • この4つのレイヤーの役割も抽象的 ◦
中にも色々な役割/概念がある、擬人化で具体化するのは無謀 • ソースコードの依存性は常に内側(上位レベルの方針)にむける • 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ • 究極、この2つのことしか言っていない
2. 擬人化してみる なぜ無茶があるのか • そもそもの誤解がある ◦ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない • この4つのレイヤーの役割も抽象的 ◦
中にも色々な役割/概念がある、擬人化で具体化するのは無謀 • ソースコードの依存性は常に内側(上位レベルの方針)にむける • 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ • 究極、この2つのことしか言っていない • 4つのレイヤーにそこまで触れていない!!
• そもそもの誤解がある ◦ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない • この4つのレイヤーの役割も抽象的 ◦ 中にも色々な役割/概念がある、擬人化で具体化するのは無謀 • ソースコードの依存性は常に内側(上位レベルの方針)にむける
• 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ • 究極、この2つのことしか言っていない • 4つのレイヤーにそこまで触れていない!! 2. 擬人化してみる なぜ無茶があるのか
2. 擬人化してみる じゃあ、クリーンアーキテ クチャってなんだろう?
1. クリーンアーキテクチャについて 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ 3. クリーンアーキテクチャって?
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ ◦ ちょうぜつだと、ドメインモデル ◦
最上位、一番内側 と言われる • ユースケース • インターフェイスアダプター • フレームワークとドライバー ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ ◦ ちょうぜつだと、ドメインモデル ◦
最上位、一番内側 と言われる • ユースケース • インターフェイスアダプター • フレームワークとドライバー ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ ◦ ちょうぜつだと、ドメインモデル ◦
最上位、一番内側 と言われる • ユースケース • インターフェイスアダプター • フレームワークとドライバー ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる ここらへんが 重要なところ (エンティ ティが一番重 要だけど)
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ ◦ ◦ •
ユースケース • インターフェイスアダプター • フレームワークとドライバー
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ ◦ ◦ •
ユースケース • インターフェイスアダプター • フレームワークとドライバー
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ ◦ ◦ •
ユースケース • インターフェイスアダプター • フレームワークとドライバー
• エンティティ ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる • ユースケース •
インターフェイスアダプター • フレームワークとドライバー ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる ソースコードの依存性は、内側 (上位レベルの方針) だけに向かっていかなくてはならない 3. クリーンアーキテクチャって? 実装例を見てみる
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • Fooは安定度が低い Baz Bar Foo ・・・
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • Fooは安定度が低い • Barなどに変更が入るとFooに影響 が出る • FooはBarのことを知っている
• FooはBarに依存する Baz Bar Foo ・・・ ❌ 変更 ❌ 影響
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • Fooは安定度が高い Baz Bar Foo ・・・
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • Fooは安定度が高い • Barなどに変更が入ってもFooには 関係ない • FooはBarのことを知らない
Baz Bar Foo ・・・ ❌ 変更
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • Fooは安定度が高い • Barなどに変更が入ってもFooには 関係ない • FooはBarのことを知らない
• 依存されているものが多いほど安 定度は高いが... Baz Bar Foo ・・・
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • Fooは安定度が高い • Barなどに変更が入ってもFooには 関係ない • FooはBarのことを知らない
• 依存されているものが多いほど安 定度は高いが... ◦ Fooに変更が入ったら依存されている ものに影響が出る ◦ なるべく変更されにくいものとしたい Baz Bar Foo ・・・ ❌ 影響 ❌ 変更 ❌ 影響 ❌ 影響
なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • 依存しているほうの変更は影響を 与えない ◦ 影響を与えないということは変更しや すい Baz
Bar Foo ・・・ ❌ 変更
ここまでをいったん整理 3. クリーンアーキテクチャって? • 依存している ◦ 依存先の影響を受ける ▪ 安定度が低い ◦
変更しても依存先に影響を与えない ▪ 変更しやすい • 依存されている ◦ 依存元の影響を受けない ▪ 安定度が高い ◦ 変更すると依存元に影響を与える ▪ なるべく変更したくない Bar Foo 依存している (依存元) 依存されている (依存先)
ここまでをいったん整理 3. クリーンアーキテクチャって? • 依存している ◦ 依存先の影響を受ける ▪ 安定度が低い ◦
変更しても依存先に影響を与えない ▪ 変更しやすい • 依存されている ◦ 依存元の影響を受けない ▪ 安定度が高い ◦ 変更すると依存元に影響を与える ▪ なるべく変更したくない Bar Foo 依存している (依存元) 依存されている (依存先) 詳細 (技術詳細) 方針 (ビジネスルール)
• 依存されている ◦ エンティティ、ユースケース • エンティティ(ドメインモデル) ◦ 企業のビジネスルール(方針) ▪ 変わらないもの
◦ 一番大事 • ユースケース ◦ エンティティを組み合わせてやりたい ことを達成する ◦ ビジネスを行う上でここも大事 • どれも下位の影響を受けたくない 実装例をもう一度見てみる 3. クリーンアーキテクチャって?
• 依存されている ◦ エンティティ、ユースケース • エンティティ(ドメインモデル) ◦ 企業のビジネスルール(方針) ▪ 変わらないもの
◦ 一番大事 • ユースケース ◦ エンティティを組み合わせてやりたい ことを達成する ◦ ビジネスを行う上でここも大事 • どれも下位の影響を受けたくない 実装例をもう一度見てみる 3. クリーンアーキテクチャって?
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・ユースケースがフレー ムワークとドライバ(イン フラストラクチャ)に依存 していたら
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・変わると困るもの、影 響を受けたくないものに 依存する ・ここはDBに限らない、 外部のAPIだったり、フ
レームワークだったり
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・ここに抽象(Interface) を用意 ・方針(重要なもの)を 詳細(些細なもの)に依存 させない
・詳細が抽象に依存する
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる これをDIPという - 依存性逆転の原則 - Dependency
Inversion Principle
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる 依存性を注入することを DIという - 依存性の注入 -
Dependency Injection
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・UseCaseからの処理の 流れは変わらないけど、 下位への依存が無くなる ・DataAccessが上位の Interfaceに依存する(依
存先から依存元になる)
2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例をもう一度見てみる ・UseCaseからすると DataAccessが何をして いるのかは知らなくて良 い ・技術詳細に無関心でい
られる
DIPについてもう少し 3. クリーンアーキテクチャって? • BarがBazを利用するとなった場合 • 循環依存になってしまう ◦ 依存先をたどると、自分に戻ってこれ る
• 循環依存は避けたい Foo Bar Baz (変わりやす い)
DIPについてもう少し 3. クリーンアーキテクチャって? • BarがBazを利用するとなった場合 • 循環依存になってしまう ◦ 依存先をたどると、自分に戻ってこれ る
• 循環依存は避けたい ◦ 変更が入ったら伝播する ◦ もしかすると、Bazの変更がBarに伝 播してFooに伝播するかもしれない ❌ 変更 ❌ 影響 Foo Bar Baz (変わりやす い) ❌ 影響
DIPについてもう少し 3. クリーンアーキテクチャって? • Barがやりたいことをインター フェイスとして用意 • Bazがインターフェイスのお約束 に沿って実装 •
Barはインターフェイスに依存 • 循環依存しているものを有向非循 環グラフ(DAG)に戻す ◦ 依存先をたどっても、自分に戻らない 境界線 Foo Bar Baz (変わりやす い) XXX Interface
DIPについてもう少し 3. クリーンアーキテクチャって? • Bazがインターフェイスの約束事 を守っている限り • Bazの変更はBarに伝播しない 境界線 Foo
Bar Baz (変わりやす い) XXX Interface ❌ 変更
DIPについてもう少し 3. クリーンアーキテクチャって? 境界線 Foo Bar Baz (変わりやす い) XXX
Interface • 変わると困るもの、影響を受けた くないもの、変わりやすいものに 直接依存しないように依存関係を 逆転させる ◦ 抽象との会話にする ◦ インターフェイス超大事 • 依存の向きを整理する ◦ ぐちゃぐちゃした依存関係嫌ですよね • DIP超大事
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? • 依存関係逆転の原則(DIP)をめちゃくちゃ大事にしている • 抽象を使って依存関係を逆転させる ◦ 方針(上位)に詳細(下位)の変更の影響を伝播させたくない •
方針(上位)を頑張って決めて、詳細(下位)の決定は後にする ◦ DIP使っていればできるよね • クリーンアーキテクチャを作っているのではない • エンティティ === ビジネス を作っている • 円の中心でビジネスを叫びたい • これを説明するために、あの同心円の図がただある • 詳細、抽象、方針の関係性が大事
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? 誤解を恐れずに言うと
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? クリーンアーキテクチャ なんてものはない
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? クリーンな アーキテクチャへの みちしるべ
クリーンって? 3. クリーンアーキテクチャって? • 内部に異質なものがない • 依存がぐちゃぐちゃしていない • 変更に対する影響が予測可能
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? そんなのむずくね?
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? そこでSOLID原則がある
そんなのむずくね? 3. クリーンアーキテクチャって? • 依存がぐちゃぐちゃしていない • 変更に対する影響が予測可能 • この2つに関してはSOLID原則を適応していく ◦
修正範囲を絞るために単一責任の原則(SRP)があるし • 閉鎖性共通の原則(CCP)のほうがしっくりくるかも ◦ 修正の影響を広げないためにオープン・クローズドの原則(OCP) があるし ◦ 余計なものに依存しないようにインターフェイス分離の原則 (ISP)がある • と思っている(DIPは言わずもがな、リスコフの置換原則(LSV)はすいません)
そんなのむずくね? 3. クリーンアーキテクチャって? • 内部に異質なものがない • 内部にはビジネスに対する問題領域を解決するためのピュアなオブ ジェクト(エンティティ)が求められる • どうやってエンティティを抽出するか
• ガチでやるならモデリングが必要 • 詳細にどこまで依存して、どこから決別するのか検討する必要がある ◦ ActiveRecord • SOLID原則を使いながら依存を整理していく • 円の中心でエンティティを叫ばせる • アーキテクチャではなく、ビジネスを作る
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? SOLID原則を突き詰めれば クリーンになる
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? SOLID原則を突き詰めれば クリーンになる 失敗例から学ぶSOLID原則 - Speaker Deck https://speakerdeck.com/asumikam/failure-example-solid
神
けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? 依存の向きを整える
1. クリーンアーキテクチャについて 2. 擬人化してみる 3. クリーンアーキテクチャって? 4. まとめ 4. まとめ
2. 擬人化してみる 4. まとめ 4. まとめ クリーンアーキテクチャは 擬人化するものじゃないし できるものでもなかった
• 4つのレイヤーはただの例 ◦ 中にも色々な役割/概念がある ◦ エンティティを作るための抽象化された考え方 ◦ わたしは無知だった • 大事なのは、詳細、抽象、方針
• クリーンアーキテクチャなんてものはない • あるのはクリーンなアーキテクチャへの道しるべ • SOLID原則を突き詰めるとクリーンになる • 依存の向きを整えて円の中心でエンティティを叫ばせる 2. 擬人化してみる 4. まとめ 4. まとめ
クリーンアーキテクチャと言えば? 登場するのはこの4つのレイヤー (荒ぶってはいない) 4. まとめ
クリーンアーキテクチャと言えば? この4つのレイヤーなんていらなかったんや ❌❌❌❌ 4. まとめ
詳細くん、抽象ちゃん、方針さん だけでよかったんや クリーンアーキテクチャと言えば? 4. まとめ
詳細くん、抽象ちゃん、方針さん だけでよかったんや クリーンアーキテクチャと言えば? 4. まとめ 距離が空いているな?
詳細くん、抽象ちゃん、方針さん だけでよかったんや クリーンアーキテクチャと言えば? 4. まとめ 外部からうるさく言ってくる人(詳細)から ビジネスを作りたい人(方針)を守る人(抽象) の図に見えなくもない(???)
2. 擬人化してみる 4. まとめ 4. まとめ アーキテクチャではなく、 ビジネスを作る
2. 擬人化してみる 4. まとめ 4. まとめ あなたは 何を作っていますか NO ENTITY,
NO LIFE.
2. 擬人化してみる 4. まとめ 4. まとめ 擬人化では 完全に理解できなかった クリーンアーキテクチャ
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
2. 擬人化してみる 4. まとめ 4. まとめ ご清聴ありがとうございました