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
クリーンアーキテクチャの NodeJSによる実装例
Search
Templiver
December 06, 2022
Programming
0
1.2k
クリーンアーキテクチャの NodeJSによる実装例
Templiver
December 06, 2022
Tweet
Share
More Decks by Templiver
See All by Templiver
大量データをRedisに入れる際の 容量問題にどう対処したか
terashin
0
710
Other Decks in Programming
See All in Programming
敵対的ポイフル
futabato
0
130
Domain-Driven Transformation
hschwentner
2
1.5k
Java 22 Overview
kishida
1
190
From Spring Boot 2 to Spring Boot 3 with Java 21 and Jakarta EE
ivargrimstad
0
500
Introducing Kotlin Multiplatform in an existing mobile app - Workshop Edition | AndroidMakers Paris
prof18
0
150
PHPの次期バージョンはこの時期どうなっているのか - Internalsの開発体制について - PHPカンファレンス小田原
youkidearitai
PRO
1
220
AppRouter Panel Talk
yosuke_furukawa
PRO
1
460
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
280
DMMプラットフォームがTiDB Cloudを採用した背景
pospome
9
4.2k
Node.js v22 で変わること
yosuke_furukawa
PRO
11
3.9k
Goのmultiple errorsについて (2024年4月版)
syumai
4
1.2k
効率化に挑戦してみたらモバイル開発が少し快適になった話
ryunakayama
0
140
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
How to train your dragon (web standard)
notwaldorf
75
5.2k
Building Your Own Lightsaber
phodgson
100
5.7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
123
39k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
A Tale of Four Properties
chriscoyier
152
22k
Rebuilding a faster, lazier Slack
samanthasiow
74
8.2k
The Pragmatic Product Professional
lauravandoore
26
5.8k
Adopting Sorbet at Scale
ufuk
69
8.6k
A Modern Web Designer's Workflow
chriscoyier
689
190k
Fontdeck: Realign not Redesign
paulrobertlloyd
76
4.9k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Transcript
クリーンアーキテクチャの NodeJSによる実装例
1. クリーンアーキテクチャ
クリーンアーキテクチャとは? コントローラー - コントローラー - ミドルウェア - DTO リポジトリ -
リポジトリ - UnitOfWork - DTO ユースケース(サービス) - ユースケース ドメイン - ドメインサービス - ドメインモデル - バリデーター - 便利関数 - 外部ライブラリのラッパー - 設定/環境変数オブジェクト DIP 下に 依存
コントローラーとは? 1. リクエストからサービスが必要な情報を抽出 2. サービスが返す情報をレスポンスの形にする
コントローラーとは? 取得系APIの例 (ts) DTOをドメインモデルに変換 ドメインモデルをDTOに変換 レスポンスでのみ必要な値などは このタイミングで生成する
コントローラーとは? 更新系APIの例 (ts)
DTOとは? 外部とのやり取りに使うパラメータなどの マッピング先オブジェクト
DTOとは? DTOの例 (ts)
リポジトリとは? 外部のサービス(DBやAPIなど)と データのやり取りをする
リポジトリとは? リポジトリの例 (ts)
UnitOfWork(UoW)とは? トランザクション処理をハンドリングする
UnitOfWork(UoW)とは? UoWの例 (ts) 生成 UoWのファクトリ例 (ts)
UnitOfWork(UoW)とは? UoWの使用例 (ts) UoWを生成 トランザクションの開始 トランザクションのコミット ロールバック
ユースケース(サービス)とは? ドメインロジックやリポジトリなどがする処理の フローを制御する
ユースケース(サービス)とは? リポジトリのインタフェースに依 存(DIP) ユースケースの例 (ts) リポジトリ ユースケース リポジトリの インタフェース
ドメインサービスとは? ドメインモデルとして定義すると違和感のある ドメインロジックを処理する
※ ドメインロジックとは? サービス固有のロジック
ドメインサービスとは? ドメインサービスの例 (ts)
ドメインモデルとは? ドメインロジックを処理する
ドメインモデルとは? ドメインモデルの例 (ts)
プリミティブ型のみに依存する関数 便利関数とは?
便利関数とは? 便利関数の例 (ts)
外部ライブラリのラッパーとは? 外部ライブラリのラッパー例 (ts) 処理の差し込みが可能
※ 値オブジェクト 基本、値オブジェクトは使わない 必要になったら データの入れ替えがより大変になるので
※ 値オブジェクト 値オブジェクトの例 (ts) :期間を表す
2. アーキテクチャの評価
デメリットは? • データの入れ替えが大変 • DIPが起こるところの書き方が冗長
デメリット: データの入れ替えが大変 例: APIリクエストパラメータ -> ドメインモデル 例: SQLレスポンス -> ドメインモデル
メリットは? • ドメインロジックを再利用しやすい • ドメインロジックの記述箇所を特定するのが容易 • 変更箇所を最小限にできるため、改善しやすい • 処理が適切な粒度で分けられて、コードの見通しが良くなる •
実装をモックで置き換えられるので、テストが書きやすい
3. その他、開発で気をつけていること
開発の方針 • 関数にわかりやすい名前をつける わかりやすい関数名さえあればコメントは基本いらない • 適切な粒度で関数に切り出す 目安は、わかりやすい関数名がつけられる粒度 関数名だけで処理を書いて、後でその実装を書く • テストが書きやすいかを意識する
• 何がドメインロジックかよく考える • ドメインロジックはできる限りドメインモデルに定義する そうしないと、再利用性の低いコードになる(ドメインモデル貧血症になる...)
適切な粒度で関数に切り出すには? こういう関数があったら良いな、 という気持ちで関数名で 処理の流れを書く 関数名に対応する実装を書く
テストが書きやすいかを意識するとはどういうことか • どういう粒度でテストしたいか 適切な粒度で処理を切り出し、名前をつけられる • 変数をここに定義して良いのか グローバル変数などを使うと、見えない情報によってテストしづらくなる • DIするのは何故か モックに置き換えて単体テストしやすくなる
• 引数がオブジェクトで良いのか テストの時オブジェクト生成が面倒くさい、どの情報が本当に必要なのかわからなくなる • 分岐が沢山あった時困らないか 一つの関数に対するテストケースが増える
最後に ベースとなるアーキテクチャを持ちつつも、 自分達のサービスに合わせて変えていく ベースとなるアーキテクチャが何もないと 何が良くて何が悪いかが分からず、改善しにくい