ドメイン駆動設計を支えるアーキテクチャテスト / RAKUS Meetup Osaka 5

73560128b23de542e47a318145bc781a?s=47 Yuu Kawanami
February 05, 2020

ドメイン駆動設計を支えるアーキテクチャテスト / RAKUS Meetup Osaka 5

RAKUS Meetup Osaka #5「SaaSを支える開発原則」の登壇資料

https://rakus.connpass.com/event/161744/

※本資料は Object-Oriented Conference 2020 の登壇資料のベータ版です。
完成版はこちら
https://speakerdeck.com/kawanamiyuu/object-oriented-conference-2020

73560128b23de542e47a318145bc781a?s=128

Yuu Kawanami

February 05, 2020
Tweet

Transcript

  1. 4.

    自己紹介 • かわなみゆう • @kawanamiyuu • 株式会社ラクス / Lead Engineer

    • HR Tech x SaaS の開発 • Java (Spring Boot, Doma) / Vue.js / Puppeteer • 自動テスト(が書きやすい設計を考えながらコード) を書くのがすき 4
  2. 16.

    アーキテクチャとオブジェクト指向設計原則 • (乱暴に言うと)Layer Architecture も Clean Architecture も 、DDD のような設計論も、依存関係を適切に設計したいだ

    け • その土台としてのオブジェクト指向設計原則 ◦ 単一責任の原則(SRP) ◦ 依存関係逆転の原則(DIP) 16
  3. 24.

    ArchUnit • GitHub ◦ https://github.com/TNG/ArchUnit ◦ https://github.com/TNG/ArchUnit-Examples • Twitter ◦

    https://twitter.com/archtests • Technology Radar ◦ https://www.thoughtworks.com/radar/tools/archunit ◦ 進化的アーキテクチャ x 適応度関数 24
  4. 28.

    28 @Test void DIP_依存性逆転の原則_を適用したレイヤードアーキテクチャ () { layeredArchitecture() .layer("ui").definedBy("com.example.presentation..") .layer("app").definedBy("com.example.application..") .layer("domain").definedBy("com.example.domain..")

    .layer("infra").definedBy("com.example.infrastructure..") .whereLayer("ui").mayOnlyBeAccessedByLayers("infra") .whereLayer("app").mayOnlyBeAccessedByLayers("infra", "ui") .whereLayer("domain").mayOnlyBeAccessedByLayers("infra", "app") .whereLayer("infra").mayNotBeAccessedByAnyLayer() .check(CLASSES); }
  5. 29.

    29 @Test void DIP_依存性逆転の原則_を適用したレイヤードアーキテクチャ () { layeredArchitecture() .layer("ui").definedBy("com.example.presentation..") .layer("app").definedBy("com.example.application..") .layer("domain").definedBy("com.example.domain..")

    .layer("infra").definedBy("com.example.infrastructure..") .whereLayer("ui").mayOnlyBeAccessedByLayers("infra") .whereLayer("app").mayOnlyBeAccessedByLayers("infra", "ui") .whereLayer("domain").mayOnlyBeAccessedByLayers("infra", "app") .whereLayer("infra").mayNotBeAccessedByAnyLayer() .check(CLASSES); }
  6. 38.

    38

  7. 44.

    参考資料 • Books ◦ エリック・エヴァンスのドメイン駆動設計(Eric Evans) ◦ 実践ドメイン駆動設計(Vaughn Vernon) ◦

    Clean Architecture ―達人に学ぶソフトウェアの構造と設計(Robert C.Martin) ◦ 進化的アーキテクチャ ―絶え間ない変化を支える(Neal Ford, Rebecca Parsons, Patrick Kua) • Talks ◦ ArchUnit で Java / Kotlin アプリケーションのアーキテクチャを CI する ▪ https://speakerdeck.com/kawanamiyuu/jjug-ccc-2019-spring 44