Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Classi リプレイスプロジェクト フロントエンドアーキテクチャ変遷 / Classi An...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
990
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
63
Other Decks in Programming
See All in Programming
新卒PdEのリアル
ryu1013
1
490
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
150
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
180
スマート反転とウェブアクセシビリティ
camiha
0
200
What We Talk About When We Talk About XP
m_seki
2
600
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
ALB ログから Trace を気合で繋げる技術
fohte
7
890
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
450
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
920
Webの地図
yosuke_furukawa
PRO
6
4.3k
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
200
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
Featured
See All Featured
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
640
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
330
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Designing for Performance
lara
611
70k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
330
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
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/