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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
970
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
60
Other Decks in Programming
See All in Programming
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.8k
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
340
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
160
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.3k
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
360
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
220
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
840
フィードバックで育てるAI開発
kotaminato
1
110
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
5.7k
Featured
See All Featured
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Embracing the Ebb and Flow
colly
88
5.1k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Prompt Engineering for Job Search
mfonobong
0
370
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
340
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/