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.4k
クリーンアーキテクチャの NodeJSによる実装例
Templiver
December 06, 2022
Tweet
Share
More Decks by Templiver
See All by Templiver
大量データをRedisに入れる際の 容量問題にどう対処したか
terashin
0
1.5k
Other Decks in Programming
See All in Programming
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
1k
Oxlintはいいぞ
yug1224
5
1.4k
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6.1k
SourceGeneratorのススメ
htkym
0
200
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
110
dchart: charts from deck markup
ajstarks
3
1k
ノイジーネイバー問題を解決する 公平なキューイング
occhi
0
110
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
390
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
Data-Centric Kaggle
isax1015
2
780
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
630
Featured
See All Featured
The agentic SEO stack - context over prompts
schlessera
0
650
Prompt Engineering for Job Search
mfonobong
0
160
Building a Scalable Design System with Sketch
lauravandoore
463
34k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
130
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
190
Building AI with AI
inesmontani
PRO
1
710
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
380
A better future with KSS
kneath
240
18k
Music & Morning Musume
bryan
47
7.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
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するのは何故か モックに置き換えて単体テストしやすくなる
• 引数がオブジェクトで良いのか テストの時オブジェクト生成が面倒くさい、どの情報が本当に必要なのかわからなくなる • 分岐が沢山あった時困らないか 一つの関数に対するテストケースが増える
最後に ベースとなるアーキテクチャを持ちつつも、 自分達のサービスに合わせて変えていく ベースとなるアーキテクチャが何もないと 何が良くて何が悪いかが分からず、改善しにくい