Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

擬人化で完全に理解するクリーンアーキテクチャ

shimabox
February 11, 2024

 擬人化で完全に理解するクリーンアーキテクチャ

PHPカンファレンス関西2024 の発表資料になります

shimabox

February 11, 2024
Tweet

More Decks by shimabox

Other Decks in Programming

Transcript

  1. Clean Architecture 達人に学ぶソフトウェアの構造と設計 はじめに • これからお話しすることは、この本を 読んで得た自分なりの理解に基づいて います • 発表内容で出てくる用語や概念につい

    ては、ほぼほぼこの本の内容と自分の 個人的な解釈が混ざり合っていると考 えてください ※ 他には`ちょうぜつソフトウェア設計入門`など から知識を得ています
  2. 1. 各レイヤーの概要 クリーンアーキテクチャと言えば? • エンティティ  ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる

    • ユースケース  • インターフェイスアダプター  • フレームワークとドライバー  ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
  3. 1. 各レイヤーの概要 クリーンアーキテクチャと言えば?上位、下位って? • エンティティ  ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる

    • ユースケース  • インターフェイスアダプター  • フレームワークとドライバー  ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
  4. 1. 各レイヤーの概要 クリーンアーキテクチャと言えば?上位、下位って? • エンティティ  ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる

    • ユースケース  • インターフェイスアダプター  • フレームワークとドライバー  ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる あくまでもイメージ
  5. 1. 各レイヤーの概要 フレームワークとドライバー(インフラストラクチャー) • フレームワーク, UI, DB, API, テスト, 外部ライブラリ

    な どなど • 詳細(些細なもの) ◦ プログラムの本質的な目的に直接は貢献しないが、そ れを実現するために必要な技術的なツールや仕組み ◦ 技術詳細 ◦ 技術(機械)に任せる → 低レイヤー • 外部
  6. 2. 擬人化してみる なぜ無茶があるのか • そもそもの誤解がある ◦ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない • この4つのレイヤーの役割も抽象的 ◦

    中にも色々な役割/概念がある、擬人化で具体化するのは無謀 • ソースコードの依存性は常に内側(上位レベルの方針)にむける • 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ • 究極、この2つのことしか言っていない
  7. 2. 擬人化してみる なぜ無茶があるのか • そもそもの誤解がある ◦ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない • この4つのレイヤーの役割も抽象的 ◦

    中にも色々な役割/概念がある、擬人化で具体化するのは無謀 • ソースコードの依存性は常に内側(上位レベルの方針)にむける • 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ • 究極、この2つのことしか言っていない • 4つのレイヤーにそこまで触れていない!!
  8. • そもそもの誤解がある ◦ レイヤーをこの4つに分割しろとは言っていない、そんなルールはない • この4つのレイヤーの役割も抽象的 ◦ 中にも色々な役割/概念がある、擬人化で具体化するのは無謀 • ソースコードの依存性は常に内側(上位レベルの方針)にむける

    • 方針(上位)を頑張って決めて、詳細(下位)の決定を遅らせろ • 究極、この2つのことしか言っていない • 4つのレイヤーにそこまで触れていない!! 2. 擬人化してみる なぜ無茶があるのか
  9. 2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ  ◦ ちょうぜつだと、ドメインモデル ◦

    最上位、一番内側 と言われる • ユースケース  • インターフェイスアダプター  • フレームワークとドライバー  ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
  10. 2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ  ◦ ちょうぜつだと、ドメインモデル ◦

    最上位、一番内側 と言われる • ユースケース  • インターフェイスアダプター  • フレームワークとドライバー  ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる
  11. 2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ  ◦ ちょうぜつだと、ドメインモデル ◦

    最上位、一番内側 と言われる • ユースケース  • インターフェイスアダプター  • フレームワークとドライバー  ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる ここらへんが 重要なところ (エンティ ティが一番重 要だけど)
  12. 2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ  ◦ ◦ •

    ユースケース  • インターフェイスアダプター  • フレームワークとドライバー 
  13. 2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ  ◦ ◦ •

    ユースケース  • インターフェイスアダプター  • フレームワークとドライバー 
  14. 2. 擬人化してみる 3. クリーンアーキテクチャって? 実装例を見てみる • エンティティ  ◦ ◦ •

    ユースケース  • インターフェイスアダプター  • フレームワークとドライバー 
  15. • エンティティ  ◦ ちょうぜつだと、ドメインモデル ◦ 最上位、一番内側 と言われる • ユースケース  •

    インターフェイスアダプター  • フレームワークとドライバー  ◦ ちょうぜつだと、インフラストラク チャー ◦ 最下位、一番外側 と言われる ソースコードの依存性は、内側 (上位レベルの方針) だけに向かっていかなくてはならない 3. クリーンアーキテクチャって? 実装例を見てみる
  16. なぜ依存の向きにこだわるのか 3. クリーンアーキテクチャって? • Fooは安定度が高い • Barなどに変更が入ってもFooには 関係ない • FooはBarのことを知らない

    • 依存されているものが多いほど安 定度は高いが... ◦ Fooに変更が入ったら依存されている ものに影響が出る ◦ なるべく変更されにくいものとしたい Baz Bar Foo ・・・ ❌ 影響 ❌ 変更 ❌ 影響 ❌ 影響
  17. ここまでをいったん整理 3. クリーンアーキテクチャって? • 依存している ◦ 依存先の影響を受ける ▪ 安定度が低い ◦

    変更しても依存先に影響を与えない ▪ 変更しやすい • 依存されている ◦ 依存元の影響を受けない ▪ 安定度が高い ◦ 変更すると依存元に影響を与える ▪ なるべく変更したくない Bar Foo 依存している (依存元) 依存されている (依存先)
  18. ここまでをいったん整理 3. クリーンアーキテクチャって? • 依存している ◦ 依存先の影響を受ける ▪ 安定度が低い ◦

    変更しても依存先に影響を与えない ▪ 変更しやすい • 依存されている ◦ 依存元の影響を受けない ▪ 安定度が高い ◦ 変更すると依存元に影響を与える ▪ なるべく変更したくない Bar Foo 依存している (依存元) 依存されている (依存先) 詳細 (技術詳細) 方針 (ビジネスルール)
  19. • 依存されている ◦ エンティティ、ユースケース • エンティティ(ドメインモデル) ◦ 企業のビジネスルール(方針) ▪ 変わらないもの

    ◦ 一番大事 • ユースケース ◦ エンティティを組み合わせてやりたい ことを達成する ◦ ビジネスを行う上でここも大事 • どれも下位の影響を受けたくない 実装例をもう一度見てみる 3. クリーンアーキテクチャって?
  20. • 依存されている ◦ エンティティ、ユースケース • エンティティ(ドメインモデル) ◦ 企業のビジネスルール(方針) ▪ 変わらないもの

    ◦ 一番大事 • ユースケース ◦ エンティティを組み合わせてやりたい ことを達成する ◦ ビジネスを行う上でここも大事 • どれも下位の影響を受けたくない 実装例をもう一度見てみる 3. クリーンアーキテクチャって?
  21. DIPについてもう少し 3. クリーンアーキテクチャって? • BarがBazを利用するとなった場合 • 循環依存になってしまう ◦ 依存先をたどると、自分に戻ってこれ る

    • 循環依存は避けたい ◦ 変更が入ったら伝播する ◦ もしかすると、Bazの変更がBarに伝 播してFooに伝播するかもしれない ❌ 変更 ❌ 影響 Foo Bar Baz (変わりやす い) ❌ 影響
  22. DIPについてもう少し 3. クリーンアーキテクチャって? • Barがやりたいことをインター フェイスとして用意 • Bazがインターフェイスのお約束 に沿って実装 •

    Barはインターフェイスに依存 • 循環依存しているものを有向非循 環グラフ(DAG)に戻す ◦ 依存先をたどっても、自分に戻らない 境界線 Foo Bar Baz (変わりやす い) XXX Interface
  23. DIPについてもう少し 3. クリーンアーキテクチャって? 境界線 Foo Bar Baz (変わりやす い) XXX

    Interface • 変わると困るもの、影響を受けた くないもの、変わりやすいものに 直接依存しないように依存関係を 逆転させる ◦ 抽象との会話にする ◦ インターフェイス超大事 • 依存の向きを整理する ◦ ぐちゃぐちゃした依存関係嫌ですよね • DIP超大事
  24. けっきょく、クリーンアーキテクチャって? 3. クリーンアーキテクチャって? • 依存関係逆転の原則(DIP)をめちゃくちゃ大事にしている • 抽象を使って依存関係を逆転させる ◦ 方針(上位)に詳細(下位)の変更の影響を伝播させたくない •

    方針(上位)を頑張って決めて、詳細(下位)の決定は後にする ◦ DIP使っていればできるよね • クリーンアーキテクチャを作っているのではない • エンティティ === ビジネス を作っている • 円の中心でビジネスを叫びたい • これを説明するために、あの同心円の図がただある • 詳細、抽象、方針の関係性が大事
  25. そんなのむずくね? 3. クリーンアーキテクチャって? • 依存がぐちゃぐちゃしていない • 変更に対する影響が予測可能 • この2つに関してはSOLID原則を適応していく ◦

    修正範囲を絞るために単一責任の原則(SRP)があるし • 閉鎖性共通の原則(CCP)のほうがしっくりくるかも ◦ 修正の影響を広げないためにオープン・クローズドの原則(OCP) があるし ◦ 余計なものに依存しないようにインターフェイス分離の原則 (ISP)がある • と思っている(DIPは言わずもがな、リスコフの置換原則(LSV)はすいません)
  26. そんなのむずくね? 3. クリーンアーキテクチャって? • 内部に異質なものがない • 内部にはビジネスに対する問題領域を解決するためのピュアなオブ ジェクト(エンティティ)が求められる • どうやってエンティティを抽出するか

    • ガチでやるならモデリングが必要 • 詳細にどこまで依存して、どこから決別するのか検討する必要がある ◦ ActiveRecord • SOLID原則を使いながら依存を整理していく • 円の中心でエンティティを叫ばせる • アーキテクチャではなく、ビジネスを作る
  27. • 4つのレイヤーはただの例 ◦ 中にも色々な役割/概念がある ◦ エンティティを作るための抽象化された考え方 ◦ わたしは無知だった • 大事なのは、詳細、抽象、方針

    • クリーンアーキテクチャなんてものはない • あるのはクリーンなアーキテクチャへの道しるべ • SOLID原則を突き詰めるとクリーンになる • 依存の向きを整えて円の中心でエンティティを叫ばせる 2. 擬人化してみる 4. まとめ 4. まとめ
  28. 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