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
クリーンアーキテクチャの NodeJSによる実装例
Search
Templiver
December 06, 2022
Programming
1.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クリーンアーキテクチャの NodeJSによる実装例
Templiver
December 06, 2022
More Decks by Templiver
See All by Templiver
大量データをRedisに入れる際の 容量問題にどう対処したか
terashin
0
1.6k
Other Decks in Programming
See All in Programming
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
120
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
270
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
620
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.9k
気持ちぃ〜角丸 Squircle
ryu1013
0
310
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
270
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
Designing for Performance
lara
612
70k
The agentic SEO stack - context over prompts
schlessera
0
970
Being A Developer After 40
akosma
92
590k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
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するのは何故か モックに置き換えて単体テストしやすくなる
• 引数がオブジェクトで良いのか テストの時オブジェクト生成が面倒くさい、どの情報が本当に必要なのかわからなくなる • 分岐が沢山あった時困らないか 一つの関数に対するテストケースが増える
最後に ベースとなるアーキテクチャを持ちつつも、 自分達のサービスに合わせて変えていく ベースとなるアーキテクチャが何もないと 何が良くて何が悪いかが分からず、改善しにくい