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
Classi リプレイスプロジェクト フロントエンドアーキテクチャ変遷 / Classi An...
Search
Wataru KASAHARA
October 03, 2019
Programming
2k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Classi リプレイスプロジェクト フロントエンドアーキテクチャ変遷 / Classi Angular Night #4
Wataru KASAHARA
October 03, 2019
More Decks by Wataru KASAHARA
See All by Wataru KASAHARA
NgRx component と component-store について / mini-ng-japan-2020
kasaharu
0
980
Deep dive into component / classi-angular-night-number-3
kasaharu
0
2.5k
Angular Way をまっすぐ歩くために / classi-angular-night-number-2
kasaharu
1
2.3k
リプレイスプロジェクトで考えるフロントエンド開発 / Classi Angular Night #1
kasaharu
3
2.7k
React 初心者が初級者になるまで / react-sakana
kasaharu
0
62
Other Decks in Programming
See All in Programming
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
120
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
620
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
390
ALB ログから Trace を気合で繋げる技術
fohte
5
530
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
380
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
240
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
490
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
130
Android CLI
fornewid
0
240
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
180
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
5.9k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
280
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Facilitating Awesome Meetings
lara
57
7.1k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
290
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Thoughts on Productivity
jonyablonski
76
5.3k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
450
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Transcript
Copyright © 2019 Classi Corp. All Rights Reserved. Classi リプレイスプロジェクト
フロントエンドアーキテクチャ変遷 2019/10/03 Classi Angular Night #4 Classi 株式会社 笠原渉
Copyright © 2019 Classi Corp. All Rights Reserved. 笠原 渉
(かさはら わたる) • Classi 株式会社 • フロントエンドエンジニア • Angular 日本ユーザー会 staff • New Angular CLI コントリビュート 1 About me @kasaharu
Copyright © 2019 Classi Corp. All Rights Reserved. Classi Angular
Night #1 時点の取り組み • Presentation Domain Separation • Redux #1 からの変化 • Layered Architecture • Command Query Separation 2 目次
Copyright © 2019 Classi Corp. All Rights Reserved. 3 当時(Classi
Angular Night #1 時点)の取り組み
Copyright © 2019 Classi Corp. All Rights Reserved. Atomic Design
• Angular CLI の Library 機能を使ったコンポーネントプロジェクトの作成 ◦ Application 側のコードと完全に分離できる NgRx • Redux like な状態管理ライブラリを導入し Store による状態の一元管 理 4 当時(Classi Angular Night #1 時点)の取り組み
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
Copyright © 2019 Classi Corp. All Rights Reserved. 6 Presentation
Domain Separation
Copyright © 2019 Classi Corp. All Rights Reserved. どういうものか •
その名の通り Presentation(UI) と Domain(ロジック) の分離 • フロントエンドアーキテクチャを検討するとき最初に考えたい ◦ MVC や MVVM などは PDS にあたる • Angular は styleguide にもあるように Component と Service を意識し て分割すれば PDS が実現できる 7 Presentation Domain Separation(PDS)
Copyright © 2019 Classi Corp. All Rights Reserved. 8 Presentation
Domain Separation(PDS) Component Presentation 層 Service Domain 層
Copyright © 2019 Classi Corp. All Rights Reserved. メリット •
変更時の影響範囲を減らす ◦ UI とロジックは変更タイミングが異なることが多い ◦ UI の変更でロジックを気にしたくない(またはその逆) • テスタビリティがあがる ◦ UI はロジックに比べるとテストが難しいのでロジックを分離するほどテストしやすい範囲が 増える • スキルセットの分離 ◦ 究極的には UI は HTML / CSS と少しのロジックになるので HTML / CSS が書けるデザ イナーがいる会社なら UI の保守をデザイナーができる(といいな) 9 Presentation Domain Separation(PDS)
Copyright © 2019 Classi Corp. All Rights Reserved. 10 Redux
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
Copyright © 2019 Classi Corp. All Rights Reserved. 12 Redux
Component Presentation 層 Service Domain 層 Selector Action Reducer State Store 層 呼び出し 購読
Copyright © 2019 Classi Corp. All Rights Reserved. メリット •
アプリケーションの状態は store を見ればわかるようになる • 状態を変更するのは action なので、いつどの action で状態が変わっ たかわかりやすくなる • アプリケーションが大きくなったときの下記問題が解決しやすい ◦ ユーザー入力を受け付けたりバックエンドからデータを取得したりとデータフローが複雑に なる ◦ ページをまたいで管理する状態が出てくる 13 Redux
Copyright © 2019 Classi Corp. All Rights Reserved. • NgRx
Effects ◦ コンポーネントの代わりにデータ fetch などの処理をまとめられる ◦ (結果としてこの役割の登場はよくなかった) • [Container | Presentational] component ◦ 状態を持つコンポーネントと状態を持たないコンポーネントの分離 14 Redux + α
Copyright © 2019 Classi Corp. All Rights Reserved. 15 Redux
+ α Presentation 層 Service Domain 層 Selector Action Reducer State Store 層 Effects Container Component Presentational Component 呼び出し 購読
Copyright © 2019 Classi Corp. All Rights Reserved. PDS •
Domain(*service.ts) が大きくなっていった(ビジネスロジックや API Wrapper) • PDS はあくまで Presntation とそれ以外の分割にしか焦点を当ててい ない ◦ Domain 部分をどう実装するかの指標がない Redux(NgRx) • Effects を多用した結果 RxJS を駆使しなければいけなくなった ◦ コードが読みにくく、テストもしづらい 16 ここまでのアーキテクチャ的な課題
Copyright © 2019 Classi Corp. All Rights Reserved. • フロントエンドエンジニアの採用難
• バックエンドエンジニアのフロントエンドへの興味 → バックエンドエンジニアでも触りやすい作りにするほうがよい 17 組織的な課題と変化
Copyright © 2019 Classi Corp. All Rights Reserved. • バックエンドエンジニアが参入しやすいつくりを目指す
• → システムアーキテクチャの採用 18 Classi Angular Night #1 以降の目標
Copyright © 2019 Classi Corp. All Rights Reserved. 19 Layered
Architecture
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
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 呼び出し 購読
Copyright © 2019 Classi Corp. All Rights Reserved. 以下も解決したい •
Presentation 層と Store の依存を切り離す • 参照系と更新系を分離 22 Layered Architecture + α
Copyright © 2019 Classi Corp. All Rights Reserved. 23 Command
Query Separation
Copyright © 2019 Classi Corp. All Rights Reserved. どういうものか •
コマンドクエリの分離 ◦ コマンド ▪ オブジェクトの状態を変更するメソッド ▪ そのメソッドは値を戻してはいけない ◦ クエリ ▪ なんらかの値を返すメソッド ▪ オブジェクトの状態を変更してはいけない • 明確に分離することで ◦ 副作用が発生しないクエリと副作用が発生するコマンドを分割 ◦ 変更容易性が上がり、テスト難易度は下がる • 今回は ◦ コマンド(*.usecase.ts)とクエリ(*.query.ts)で class を分けて CQS like に実装 24 Command Query Separation(CQS)
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 呼び出し 購読
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
Copyright © 2019 Classi Corp. All Rights Reserved. 27 まとめ
Copyright © 2019 Classi Corp. All Rights Reserved. • Classi
の半年間のアーキテクチャ変遷をご紹介 • 今のアーキテクチャのオススメポイント ◦ 各層の役割がディレクトリ構成やファイル名でおおよそ判断可能 ◦ 完全に責務が別れているため mocking しやすくテスタビリティが高くなる 28 まとめ
Copyright © 2019 Classi Corp. All Rights Reserved. - iOS
アプリ設計パターン入門 - 実践ドメイン駆動設計 - プレゼンテーションとドメインの分離 - コマンド・問い合わせの分離 - Angular - スタイルガイド - Redux - Three Principles 29 参考文献
Copyright © 2019 Classi Corp. All Rights Reserved. 30 We
are Hiring! Classiでは一緒に働く仲間を募集しています 詳細は採用ページにて - https://corp.classi.jp/careers/