Slide 1

Slide 1 text

Vue.jsによるSPAの DDDについて考える(導⼊編) 2018-01-20 Gunma.web #30 堀 貴詞

Slide 2

Slide 2 text

⾃⼰紹介 • 名前: 堀 貴詞 • Twitter: @t_pori418 • JavaScript, PHP, Python … • Vue.js, Laravel … • 業務webアプリ開発

Slide 3

Slide 3 text

どのようなアプローチで ドメイン駆動設計を 実装で実現するかを考えます

Slide 4

Slide 4 text

経緯 1. 短い期間で機能継ぎ⾜しを繰り返されて 作られたシステム 2. 品質、保守性の低さ 3. システムを移⾏→DDDの考えを取り⼊れる • やっていること: SPA+APIで業務アプリ開発 vue.js + laravel を使⽤

Slide 5

Slide 5 text

今回考えるのは フロントエンドに絞ります

Slide 6

Slide 6 text

課題 画⾯主体の実装 • 画⾯(page)駆動開発になりがち • 複雑なロジックが書かれた共通コンポーネント • データ構造が画⾯依存(APIの設計にも問題あり) • テストができないコード・・・

Slide 7

Slide 7 text

フロントエンドのDDD • 部品となるコンポーネントは関⼼事で まとめて分ける • ただし最⼩コンポーネントは汎⽤的になる • データモデル,ビジネスロジックは関⼼事でま とめて分ける • ビジネスロジックやviewに渡すデータ整形処理を ドメインモデルと結びつけ整理する

Slide 8

Slide 8 text

データモデルとドメインモデル • Storeパターンの活⽤→vuexの導⼊ • 取得したデータはドメイン毎にstateで保持 • コンポーネント内の⼀時的なデータはモデルに 渡して保持

Slide 9

Slide 9 text

View Methods Data Actions Mutations State Backend API DevTool Computed Vuex Vue Components

Slide 10

Slide 10 text

View Methods Data Actions Mutations State Backend API DevTool Computed Vuex Vue Components model

Slide 11

Slide 11 text

安定したオブジェクトにする • TypeScriptの採⽤ • TypeScriptで型安全を⽬指す • 不変な値のためのオブジェクトの実装 • 基本的なデータはvuexのstateに保持している → mutationsで不正値が⼊らないかチェック • ⼀時的なデータはコンポーネントに持っている →不正値チェックは外部のクラス

Slide 12

Slide 12 text

vuex

Slide 13

Slide 13 text

失敗するTest

Slide 14

Slide 14 text

実際の処理例 action: model: method:

Slide 15

Slide 15 text

課題 • コンポーネント(view)に密結合するビジネスロ ジックがドメインモデルに切り出せない →改善できそうなところは多い • Vuexで状態管理しているデータはコミットすれ ばどこからでも容易に変更が可能である →vuexに保持しているデータを使⽤時にモデル に格納すべき?

Slide 16

Slide 16 text

まとめ • 画⾯主体、データ主体の実装にならないように • ドメインモデルに分け修正時の変更対象を狭く • 部分的なDDDの実装は有効