Slide 1

Slide 1 text

Copyright © 2019 Classi Corp. All Rights Reserved. Classi リプレイスプロジェクト
 フロントエンドアーキテクチャ変遷
 2019/10/03 Classi Angular Night #4 
 Classi 株式会社 笠原渉

Slide 2

Slide 2 text

Copyright © 2019 Classi Corp. All Rights Reserved. 笠原 渉 (かさはら わたる)
 ● Classi 株式会社
 ● フロントエンドエンジニア
 ● Angular 日本ユーザー会 staff
 ● New Angular CLI コントリビュート
 1 About me
 @kasaharu

Slide 3

Slide 3 text

Copyright © 2019 Classi Corp. All Rights Reserved. Classi Angular Night #1 時点の取り組み
 ● Presentation Domain Separation
 ● Redux
 
 #1 からの変化
 ● Layered Architecture
 ● Command Query Separation
 
 2 目次


Slide 4

Slide 4 text

Copyright © 2019 Classi Corp. All Rights Reserved. 3 当時(Classi Angular Night #1 時点)の取り組み

Slide 5

Slide 5 text

Copyright © 2019 Classi Corp. All Rights Reserved. Atomic Design
 ● Angular CLI の Library 機能を使ったコンポーネントプロジェクトの作成
 ○ Application 側のコードと完全に分離できる 
 
 NgRx
 ● Redux like な状態管理ライブラリを導入し Store による状態の一元管 理
 
 4 当時(Classi Angular Night #1 時点)の取り組み


Slide 6

Slide 6 text

Copyright © 2019 Classi Corp. All Rights Reserved. Atomic Design
 ● Angular CLI の Library 機能を使ったコンポーネントプロジェクトの作成
 ○ Application 側のコードと完全に分離できる 
 
 NgRx
 ● Redux like な状態管理ライブラリを導入し Store による状態の一元管 理
 
 5 当時(Classi Angular Night #1 時点)のアーキテクチャ
 → Presentation Domain Separation
 → Redux


Slide 7

Slide 7 text

Copyright © 2019 Classi Corp. All Rights Reserved. 6 Presentation Domain Separation

Slide 8

Slide 8 text

Copyright © 2019 Classi Corp. All Rights Reserved. どういうものか
 ● その名の通り Presentation(UI) と Domain(ロジック) の分離
 ● フロントエンドアーキテクチャを検討するとき最初に考えたい
 ○ MVC や MVVM などは PDS にあたる 
 ● Angular は styleguide にもあるように Component と Service を意識し て分割すれば PDS が実現できる
 7 Presentation Domain Separation(PDS)


Slide 9

Slide 9 text

Copyright © 2019 Classi Corp. All Rights Reserved. 8 Presentation Domain Separation(PDS)
 Component Presentation 層 Service Domain 層

Slide 10

Slide 10 text

Copyright © 2019 Classi Corp. All Rights Reserved. メリット
 ● 変更時の影響範囲を減らす
 ○ UI とロジックは変更タイミングが異なることが多い 
 ○ UI の変更でロジックを気にしたくない(またはその逆) 
 ● テスタビリティがあがる
 ○ UI はロジックに比べるとテストが難しいのでロジックを分離するほどテストしやすい範囲が 増える
 ● スキルセットの分離
 ○ 究極的には UI は HTML / CSS と少しのロジックになるので HTML / CSS が書けるデザ イナーがいる会社なら UI の保守をデザイナーができる(といいな) 
 9 Presentation Domain Separation(PDS)


Slide 11

Slide 11 text

Copyright © 2019 Classi Corp. All Rights Reserved. 10 Redux

Slide 12

Slide 12 text

Copyright © 2019 Classi Corp. All Rights Reserved. どういうものか - Redux の 3 原則
 ● Single Source of Truth
 ○ アプリケーション全体の状態が単一の store に格納される 
 ● State is read-only
 ○ 状態を変更するのは常に action の発行でのみ実施 
 ● Changes are made with pure functions
 ○ 状態の更新は Reducer を使った pure function で実施 
 11 Redux


Slide 13

Slide 13 text

Copyright © 2019 Classi Corp. All Rights Reserved. 12 Redux
 Component Presentation 層 Service Domain 層 Selector Action Reducer State Store 層 呼び出し
 購読


Slide 14

Slide 14 text

Copyright © 2019 Classi Corp. All Rights Reserved. メリット
 ● アプリケーションの状態は store を見ればわかるようになる
 ● 状態を変更するのは action なので、いつどの action で状態が変わっ たかわかりやすくなる
 ● アプリケーションが大きくなったときの下記問題が解決しやすい
 ○ ユーザー入力を受け付けたりバックエンドからデータを取得したりとデータフローが複雑に なる
 ○ ページをまたいで管理する状態が出てくる 
 13 Redux


Slide 15

Slide 15 text

Copyright © 2019 Classi Corp. All Rights Reserved. ● NgRx Effects
 ○ コンポーネントの代わりにデータ fetch などの処理をまとめられる 
 ○ (結果としてこの役割の登場はよくなかった) 
 ● [Container | Presentational] component
 ○ 状態を持つコンポーネントと状態を持たないコンポーネントの分離 
 14 Redux + α


Slide 16

Slide 16 text

Copyright © 2019 Classi Corp. All Rights Reserved. 15 Redux + α
 Presentation 層 Service Domain 層 Selector Action Reducer State Store 層 Effects Container Component Presentational Component 呼び出し
 購読


Slide 17

Slide 17 text

Copyright © 2019 Classi Corp. All Rights Reserved. PDS
 ● Domain(*service.ts) が大きくなっていった(ビジネスロジックや API Wrapper)
 ● PDS はあくまで Presntation とそれ以外の分割にしか焦点を当ててい ない
 ○ Domain 部分をどう実装するかの指標がない 
 
 Redux(NgRx)
 ● Effects を多用した結果 RxJS を駆使しなければいけなくなった
 ○ コードが読みにくく、テストもしづらい 
 16 ここまでのアーキテクチャ的な課題


Slide 18

Slide 18 text

Copyright © 2019 Classi Corp. All Rights Reserved. ● フロントエンドエンジニアの採用難
 ● バックエンドエンジニアのフロントエンドへの興味
 
 → バックエンドエンジニアでも触りやすい作りにするほうがよい
 17 組織的な課題と変化


Slide 19

Slide 19 text

Copyright © 2019 Classi Corp. All Rights Reserved. ● バックエンドエンジニアが参入しやすいつくりを目指す
 ● → システムアーキテクチャの採用
 18 Classi Angular Night #1 以降の目標


Slide 20

Slide 20 text

Copyright © 2019 Classi Corp. All Rights Reserved. 19 Layered Architecture

Slide 21

Slide 21 text

Copyright © 2019 Classi Corp. All Rights Reserved. どういうものか
 ● Presentation, Application, Domain, Infrastructure に分割
 
 ● Presentation
 ○ PDS の P と同じ
 ● Domain
 ○ 型情報やビジネスロジックを配置(Angular にとらわれない TS で実装) 
 ○ アプリケーションフレームワークにも依存しないのが理想 
 ● Infrastructure
 ○ API Wrapper や GoogleAnalytics のための Adapter などを配置 
 ● Application
 ○ Domain, Infrastructure 以外を配置 
 20 Layered Architecture


Slide 22

Slide 22 text

Copyright © 2019 Classi Corp. All Rights Reserved. 21 Layered Architecture
 Container Component Presentation 層 Service Application 層 Presentational Component Domain 層 Infrastructure 層 Repository Selector Action Reducer State Store 層 Model 呼び出し
 購読


Slide 23

Slide 23 text

Copyright © 2019 Classi Corp. All Rights Reserved. 以下も解決したい
 ● Presentation 層と Store の依存を切り離す
 ● 参照系と更新系を分離
 22 Layered Architecture + α


Slide 24

Slide 24 text

Copyright © 2019 Classi Corp. All Rights Reserved. 23 Command Query Separation

Slide 25

Slide 25 text

Copyright © 2019 Classi Corp. All Rights Reserved. どういうものか
 ● コマンドクエリの分離
 ○ コマンド
 ■ オブジェクトの状態を変更するメソッド
 ■ そのメソッドは値を戻してはいけない
 ○ クエリ
 ■ なんらかの値を返すメソッド
 ■ オブジェクトの状態を変更してはいけない
 ● 明確に分離することで
 ○ 副作用が発生しないクエリと副作用が発生するコマンドを分割 
 ○ 変更容易性が上がり、テスト難易度は下がる 
 ● 今回は
 ○ コマンド(*.usecase.ts)とクエリ(*.query.ts)で class を分けて CQS like に実装 
 
 24 Command Query Separation(CQS)


Slide 26

Slide 26 text

Copyright © 2019 Classi Corp. All Rights Reserved. 25 Command Query Separation(CQS)
 Container Component Presentation 層 Application 層 Presentational Component Domain 層 Infrastructure 層 Repository Selector Action Reducer State Store 層 Usecase Query Model 呼び出し
 購読


Slide 27

Slide 27 text

Copyright © 2019 Classi Corp. All Rights Reserved. メリット
 ● 各層の責務が明確になる
 ○ HttpClient を利用した API call → Repository 
 ■ ※ Repository : DDD の Repository というよりは Clean Architecture の Gateway に近い
 ○ Container component 毎に必要な処理をまとめ Store への action dispatch をおこなう → Usecase
 ○ 該当する View に必要な state を selector 経由で取得 → Query 
 ○ ビジネスロジックを Angular に依存しない pure TypeScript で書く → Domain 
 ● バックエンドエンジニアにも馴染みのあるシステムアーキテクチャ採用
 
 26 Layered Architecture + CQS


Slide 28

Slide 28 text

Copyright © 2019 Classi Corp. All Rights Reserved. 27 まとめ

Slide 29

Slide 29 text

Copyright © 2019 Classi Corp. All Rights Reserved. ● Classi の半年間のアーキテクチャ変遷をご紹介
 ● 今のアーキテクチャのオススメポイント
 ○ 各層の役割がディレクトリ構成やファイル名でおおよそ判断可能 
 ○ 完全に責務が別れているため mocking しやすくテスタビリティが高くなる 
 28 まとめ


Slide 30

Slide 30 text

Copyright © 2019 Classi Corp. All Rights Reserved. - iOS アプリ設計パターン入門
 - 実践ドメイン駆動設計
 - プレゼンテーションとドメインの分離
 - コマンド・問い合わせの分離
 - Angular - スタイルガイド
 - Redux - Three Principles
 29 参考文献


Slide 31

Slide 31 text

Copyright © 2019 Classi Corp. All Rights Reserved. 30 We are Hiring!
 Classiでは一緒に働く仲間を募集しています 詳細は採用ページにて - https://corp.classi.jp/careers/