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
1.4k
0
Share
クリーンアーキテクチャの NodeJSによる実装例
Templiver
December 06, 2022
More Decks by Templiver
See All by Templiver
大量データをRedisに入れる際の 容量問題にどう対処したか
terashin
0
1.5k
Other Decks in Programming
See All in Programming
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
2.1k
AI時代のUIはどこへ行く?その2!
yusukebe
7
3.2k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
310
3Dシーンの圧縮
fadis
1
530
SPMマルチモジュールで テストカバレッジを取得する技法
yosshi4486
0
130
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
11k
AIエージェントの隔離技術の徹底比較
kawayu
0
440
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
4
740
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
140
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
680
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
320
Hive Metastoreを通して学ぶIceberg REST Catalog ― 仕様から実装まで
okumin
0
310
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
370
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
350
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Optimizing for Happiness
mojombo
378
71k
Color Theory Basics | Prateek | Gurzu
gurzu
0
320
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Automating Front-end Workflow
addyosmani
1370
210k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
130
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するのは何故か モックに置き換えて単体テストしやすくなる
• 引数がオブジェクトで良いのか テストの時オブジェクト生成が面倒くさい、どの情報が本当に必要なのかわからなくなる • 分岐が沢山あった時困らないか 一つの関数に対するテストケースが増える
最後に ベースとなるアーキテクチャを持ちつつも、 自分達のサービスに合わせて変えていく ベースとなるアーキテクチャが何もないと 何が良くて何が悪いかが分からず、改善しにくい