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
実装パターンとテストパターンの紹介と組み合わせ方
Search
suzuki masayuki
September 19, 2023
Programming
280
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
53
なぜ書き込みDBと 読み取りDBを分けるのか?
suzukimar
0
270
緊張をしちゃう人用_のLTのやりかた
suzukimar
1
150
UseCaseクラスを使って FatControllerやFatModelにしない
suzukimar
3
760
ChatGPT にいる 9人の生成AIロールとの日常
suzukimar
1
470
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
590
バイブコーディング_TDD.pdf
suzukimar
0
240
RailsでCQRS/ESをやってみたきづき
suzukimar
2
2.5k
ドメイン駆動設計の考えをもとに競合優位性や アウトカムを得る
suzukimar
0
310
Other Decks in Programming
See All in Programming
Performance Optimization With LLMs
xleitix
0
240
オーケストレーション記述言語 Katari
yukikurage
0
240
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
180
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
310
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.8k
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.8k
ChromeでローカルLLM
ryu1013
0
200
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
2k
Railsバージョンを4倍にした話
optim
0
960
Spec-driven Development with AI
simas
PRO
0
2.3k
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
200
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
210
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Technical Leadership for Architectural Decision Making
baasie
3
640
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
How to train your dragon (web standard)
notwaldorf
96
6.9k
HDC tutorial
michielstock
2
1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Bash Introduction
62gerente
615
220k
Being A Developer After 40
akosma
PRO
92
590k
Agile that works and the tools we love
rasmusluckow
331
22k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
121
120k
Un-Boring Meetings
codingconduct
0
490
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!