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
実装パターンとテストパターンの紹介と組み合わせ方
Search
suzuki masayuki
September 19, 2023
Programming
250
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
実装パターンとテストパターンの紹介と組み合わせ方
suzuki masayuki
September 19, 2023
More Decks by suzuki masayuki
See All by suzuki masayuki
AIでの開発を楽にするために もう1つAIを使う
suzukimar
0
20
なぜ書き込みDBと 読み取りDBを分けるのか?
suzukimar
0
240
緊張をしちゃう人用_のLTのやりかた
suzukimar
1
100
UseCaseクラスを使って FatControllerやFatModelにしない
suzukimar
3
670
ChatGPT にいる 9人の生成AIロールとの日常
suzukimar
1
440
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
510
バイブコーディング_TDD.pdf
suzukimar
0
220
RailsでCQRS/ESをやってみたきづき
suzukimar
2
2.4k
ドメイン駆動設計の考えをもとに競合優位性や アウトカムを得る
suzukimar
0
290
Other Decks in Programming
See All in Programming
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.5k
自作OSでスライド発表する
uyuki234
1
3.8k
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
430
どこまでゆるくて許されるのか
tk3fftk
0
500
えっ!!コードを読まずに開発を!?
hananouchi
0
220
Foundation Models frameworkで画像分析
ryodeveloper
1
120
AIエージェントで 変わるAndroid開発環境
takahirom
2
680
act2-costs.pdf
sumedhbala
0
110
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
190
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
350
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.6k
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Deep Space Network (abreviated)
tonyrice
0
230
Making the Leap to Tech Lead
cromwellryan
135
10k
Everyday Curiosity
cassininazir
0
260
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Un-Boring Meetings
codingconduct
0
350
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Transcript
実装パターンとテストパターンの 紹介と組み合わせ方
© 2023 • Azit Inc. 株式会社Azitでラストワンマイル配送サービスの CREW Expressの開発をしているプログラマ 書いた記事 安全にプロダクト品質を改善できる!ほぼ100%のテストカバレッジがある世界
2022年に開発チームのコミュニケーションを改善するためにおこなったこと 理解するのが難しいシステムをドメインモデリングによって生産性をあげた話 (Qiitaのミノ駆動さん QiitaEngineerFesta_設計 のコンテスト受賞) プライベート活動 女子プロレス団体の広報活動 (登録者数が5万人をこえるYouTube チャンネルの運営) 自己紹介 鈴木まー 主な 役割 Rai lsにお ける DDDの 導入 リ ファク タリン グ 社 内勉強会な どを 含めたチームビルデ ィン グ 技術情報発 信 技術的負債が発生しないよ うにする
© 2023 • Azit Inc. LearningDDDの社内勉強会をした中で図をもとにDDDだけ に限らない実装パターンやテスト戦略などの習得に役に立 ちましたのでそれを紹介します 今日話すこと
© 2023 • Azit Inc. 役に立った図
© 2023 • Azit Inc. 今回はDDDをやっていなくても役にたつ ビジネスロジック実装とテスト戦略について話します 今回扱う範囲
© 2023 • Azit Inc. ビジネスロジック の実装
© 2023 • Azit Inc. トランザクションスクリプト アクティブレコード ドメインモデル イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード ドメインモデル イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン RailsのActiveRecordなどのORMの実装時に利用される ドメインモデル イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン RailsのActiveRecordなどのORMの実装時に利用される ドメインモデル アクティブレコードでは実装するのが難しい複雑なビジネスロジックとビジネスルールをドメインのクラスで実装する イベント駆動 ビジネスロジックの実装
© 2023 • Azit Inc. トランザクションスクリプト 単純な業務ロジックを一つの手続きで完結させる設計パターン CLI, AWS Lamdaなど
アクティブレコード クラスをテーブルとして扱い、インスタンスをテーブルの行としてあつかう設計パターン RailsのActiveRecordなどのORMの実装時に利用される ドメインモデル アクティブレコードでは実装するのが難しい複雑なビジネスロジックとビジネスルールをドメインのクラスで実装する イベント駆動 ドメインモデルなどを利用して外部からのイベントに応じて動作するビジネスロジックを実装 するパターン ビジネスロジックの実装
© 2023 • Azit Inc. 単純な業務ロジックを一つの手続きで完結させるための設計パターンです。このパターンは特 に、データ構造がシンプルで処理が少ない場合や、小規模なプロジェクトに適しています。具 体的な使用例としては、CLIツールやAWS Lambdaのようなサーバーレス関数があります。 この設計パターンの主な利点は、そのシンプリシティと効率性です。短期間での開発が必要な
場合や、複雑なビジネスロジックが不要な場合には、トランザクションスクリプトが非常に有 用です。また、このパターンは「グルーコード」としてもよく用いられ、異なるシステムや サービスを繋げる際にも役立ちます。 ただし、ビジネスロジックが複雑になると、設計が破綻します。そのような場合は、レイヤー アーキテクチャにリファクタをしたほうがいいです トランザクションスクリプト
© 2023 • Azit Inc. この設計パターンでは、クラスをデータベースのテーブルとして扱い、そのインスタンスを テーブルの行として扱います。CRUD操作は、このオブジェクト自体が行います。それにより DBを隠蔽して実装をすることができます アクティブレコードにバリデーションや関連付けを実装してRailsなどのActiveRecordとして 実装をしています
ただアクティブレコードに複雑なビジネスロジックやビジネスルールなどのドメイン知識も実 装をすると肥大化してしまうため、ドメインモデルクラスの実装を考えたほうがいいです アクティブレコード
© 2023 • Azit Inc. ビジネスロジックとビジネスルールなどのドメイン特有のことを実装しています。 内部にORMなどを利用することで、DB層(永続化層)を外部のクラスに移譲をすることでドメ インの実装に専念をすることができます。 DDDにおけるエンティティに該当していて、このクラスにバリューオブジェクトのインスタン
スをもたせる実装が一般的な実装スタイルです。 ただ、クラス関係が複雑になるのでドメインモデルを作成するかアクティブレコードで完結す るかのトレードオフを気にしたほうがいいです。 ドメインモデル
© 2023 • Azit Inc. イベント駆動とは、ユーザーが何かをしたり、システムが何かを感知したりしたときに確実に 動作することを保証する設計パターンです。例えば、銀行でお金を引き出すとき、システムは その動きに反応していろいろな作業をします。これは、何がどこで起きたかをしっかり記録し たい場合や、後で確認したい場合に便利です。 この方法は、いろいろなマイクロサービスが連携して動く場合によく使われます。
ただ、データベースのトランザクション処理について考える必要があるため実装難易度と実装 にかかる時間が多くなってしまいます。 そのため、確実に実行することを保証する実装をする場合だけこの実装方法を利用するのが良 いです イベント駆動
© 2023 • Azit Inc. テスト戦略
© 2023 • Azit Inc. このプレゼンテーションでは、統合テストを「リクエストスペック」とし て扱います。リクエストスペックは、特にRailsなどのWebフレームワーク でよく用いられる考え方で、HTTPリクエストとレスポンスをテストしま す。 これにより、APIやWebアプリケーションのエンドポイントが期待通りに動
作するかを確認します。 その前にここでいう統合テストについて
© 2023 • Azit Inc. テストピラミッド テスティングダイアモンド リバーステストピラミッド テスト戦略
テストピラミッド ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる テスト戦略 テスティングダイアモンド リバーステストピラミッド テスト戦略
© 2023 • Azit Inc. テストピラミッド ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる テスト戦略 テスティングダイアモンド ユニットテストと統合テストが多く、E2Eテストが少なめで、特に統合テ
ストに重点を置くテスト戦略。 リバーステストピラミッド テスト戦略
© 2023 • Azit Inc. テストピラミッド ユニットテストが最も多く、統合テスト、E2Eテストが次第に少なくなる テスト戦略 テスティングダイアモンド ユニットテストと統合テストが多く、E2Eテストが少なめで、特に統合テ
ストに重点を置くテスト戦略。 リバーステストピラミッド E2Eテストが最も多く、統合テスト、ユニットテストが次第に少なくな る、特定の状況のみで有用なテスト戦略。 テスト戦略
© 2023 • Azit Inc. コンテンツ タイトル
© 2023 • Azit Inc. ユニットテストが最も多く、統合テスト、エンドツーエンド(E2E)テストが次第に少なくなります。ア リケーションの開発にも役に立ちますが、一般的なAPIの開発にも有効ですが特にイベント駆動のような複 雑な実装にも有効 ユニットテストが多いことで高速なフィードバックを提供し、E2Eテストが少ないことでテストの実行時 とコストを削減します。
テストピラミッド ユニットテスト E2E 統合テスト
© 2023 • Azit Inc. E2Eテストが最も多く、統合テストとユニットテストが次第に少なくなります。特に、CLIツールのようなイ ンターフェースがあまり変更しない、またはシンプルなアプリケーションのみで有用です。 トランザクションスクリプトは単純な業務ロジックを一つの手続きで完結させるため、全体としての動作確 認が重要です。そのため、E2Eテストが多いリバーステストピラミッドは、このようなシンプルなアプリ ケーションの全体テストに適しています。
リバーステストピラミッド E2E 統合テスト ユニット テスト
© 2023 • Azit Inc. ユニットテストと統合テストが多く、E2Eテストが少なめです。特に、一般的なAPIを実装す るときに統合テストを書くのは有用です。この戦略のメリットは、統合テストが多いことでシ ステムの各部分がうまく連携しているかを確認しやすく、高速なフィードバックが得られる点 です。さらに、統合テストが多いため、シンプルなAPIの実装ではユニットテストを省略する ことも可能です。
テスティングダイアモンド ユニットテスト E2E 統合テスト
© 2023 • Azit Inc. まとめ
© 2023 • Azit Inc. 弊社は様々な技術的話題に詳しいひとや興味を持っている 人を現在の技術スタック関係なく絶賛採用募集中です WE ARE HIRING!