Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Takuya Kikuchi
PDF, PPTX
932 views
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
2022-02-22 GeekGig 『DONUTS×Showcase Gig』〜Goでゼロから作り直した話〜
Technology
◦
Read more
0
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 30
2
/ 30
3
/ 30
4
/ 30
5
/ 30
6
/ 30
7
/ 30
8
/ 30
9
/ 30
10
/ 30
11
/ 30
12
/ 30
13
/ 30
14
/ 30
15
/ 30
16
/ 30
17
/ 30
18
/ 30
19
/ 30
20
/ 30
21
/ 30
22
/ 30
23
/ 30
24
/ 30
25
/ 30
26
/ 30
27
/ 30
28
/ 30
29
/ 30
30
/ 30
More Related Content
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
PDF
Fluentdのお勧めシステム構成パターン
by
Kentaro Yoshida
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
by
Shin Ohno
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
by
Yoshiki Hayama
PDF
ドメイン駆動設計 基本を理解する
by
増田 亨
PDF
正しいものを正しく作る塾-設計コース
by
増田 亨
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
Fluentdのお勧めシステム構成パターン
by
Kentaro Yoshida
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
by
Shin Ohno
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
「UXデザインとは」からはじめる「本流」のUXデザインはじめの一歩 | UXデザイン基礎セミナー 第1回
by
Yoshiki Hayama
ドメイン駆動設計 基本を理解する
by
増田 亨
正しいものを正しく作る塾-設計コース
by
増田 亨
What's hot
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
PDF
ソフトウェア開発のやり方の改善
by
増田 亨
PDF
Akkaとは。アクターモデル とは。
by
Kenjiro Kubota
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
PDF
Tackling Complexity
by
Yoshitaka Kawashima
PDF
MQTTとAMQPと.NET
by
terurou
PDF
TLS, HTTP/2演習
by
shigeki_ohtsu
PDF
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
by
株式会社MonotaRO Tech Team
PDF
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
by
Amazon Web Services Japan
PDF
マイクロサービスバックエンドAPIのためのRESTとgRPC
by
disc99_
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
PDF
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
PDF
なぜOpenID Connectが必要となったのか、その歴史的背景
by
Tatsuo Kudo
PDF
ネットワークエンジニアはどこでウデマエをみがくのか?
by
Yuya Rin
PDF
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
PDF
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
by
Google Cloud Platform - Japan
PDF
例外設計における大罪
by
Takuto Wada
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
PDF
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
by
Shotaro Suzuki
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
ソフトウェア開発のやり方の改善
by
増田 亨
Akkaとは。アクターモデル とは。
by
Kenjiro Kubota
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
Tackling Complexity
by
Yoshitaka Kawashima
MQTTとAMQPと.NET
by
terurou
TLS, HTTP/2演習
by
shigeki_ohtsu
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
by
株式会社MonotaRO Tech Team
機密データとSaaSは共存しうるのか!?セキュリティー重視のユーザー層を取り込む為のネットワーク通信のアプローチ
by
Amazon Web Services Japan
マイクロサービスバックエンドAPIのためのRESTとgRPC
by
disc99_
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
なぜOpenID Connectが必要となったのか、その歴史的背景
by
Tatsuo Kudo
ネットワークエンジニアはどこでウデマエをみがくのか?
by
Yuya Rin
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
by
Google Cloud Platform - Japan
例外設計における大罪
by
Takuto Wada
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
Application development with c#, .net 6, blazor web assembly, asp.net web api...
by
Shotaro Suzuki
GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話
1.
confidential GoとDDDでモバイルオーダープラットフォームを 型安全に作り直した話 takuya kikuchi @
Showcase Gig 1 2022-02-22 GeekGig 『DONUTS×Showcase Gig』〜Goでゼロから作り直し た話〜
2.
confidential ©Showcase Gig 2 発表者 - capybara
(takuya kikuchi) - twitter: @_pochi - Engineer Group Manager @ Showcase Gig
3.
confidential ©Showcase Gig 3 GoとDDDでモバイルオーダープラットフォームを型安 全に作り直した話
4.
confidential ©Showcase Gig 4 GoとDDDでモバイルオーダープラットフォームを型安 全に作り直した話
5.
confidential ©Showcase Gig 5 モバイルオーダープラットフォーム モバイルオーダーと一言でいっても、色々あります
6.
confidential ©Showcase Gig 6 モバイルオーダープラットフォーム モバイルオーダーと一言でいっても、色々あります 注文シーン 受け取りシーン
7.
confidential ©Showcase Gig 7 モバイルオーダープラットフォーム モバイルオーダーと一言でいっても、色々あります 自宅から 注文シーン 受け取りシーン
8.
confidential ©Showcase Gig 8 モバイルオーダープラットフォーム モバイルオーダーと一言でいっても、色々あります 自宅から 注文シーン 受け取りシーン 店舗で受け取り
9.
confidential ©Showcase Gig 9 モバイルオーダープラットフォーム モバイルオーダーと一言でいっても、色々あります 自宅から 注文シーン 受け取りシーン 店舗で受け取り ロッカーで受け取り
10.
confidential ©Showcase Gig 10 モバイルオーダープラットフォーム モバイルオーダーと一言でいっても、色々あります 自宅から 注文シーン 受け取りシーン 店舗で受け取り ロッカーで受け取り 店内で食べながら
11.
confidential ©Showcase Gig 11 モバイルオーダープラットフォーム モバイルオーダーと一言でいっても、色々あります 自宅から 注文シーン 受け取りシーン 店舗で受け取り ロッカーで受け取り 店内で食べながら テーブルまで配膳
12.
confidential ©Showcase Gig 12 モバイルオーダープラットフォーム O:der Table:
店内飲食 O:der Kiosk: Kiosk端末からの注文(イートイン・テイクアウト) O:der ToGo: テイクアウト The Label Fruit: テイクアウト(ロッカー受け取り) O:der Platform: 各プロダクトの共通基盤 and more
13.
confidential ©Showcase Gig 13 モバイルオーダープラットフォーム O:der Table:
店内飲食 O:der Kiosk: Kiosk端末からの注文(イートイン・テイクアウト) O:der ToGo: テイクアウト The Label Fruit: テイクアウト(ロッカー受け取り) O:der Platform: 各プロダクトの共通基盤 and more
14.
confidential ©Showcase Gig 14 GoとDDDでモバイルオーダープラットフォームを型安 全に作り直した話
15.
confidential ©Showcase Gig 15 モバイルオーダープラットフォームを作り直すぞ! DDDをやるぞ!
16.
confidential ©Showcase Gig 16 DDD (ドメイン駆動設計) ドメイン駆動設計とはソフトウェアの設計手法である。 「複雑なドメインの設計は、モデルベースで行うべき」であり、また「大半のソフト ウェアプロジェクトでは、システムを実装するための特定の技術ではなく、ドメイ ンそのものとドメインのロジックに焦点を置くべき」であるとする。 出典: https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9 %A7%86%E5%8B%95%E8%A8%AD%E8%A8%88
17.
confidential ©Showcase Gig 17 わからん
18.
confidential ©Showcase Gig 18 なんとなくやってみよう 書籍などを参考にしつつ、チームとしてこれくらいの理解でやってみた ● いいプロダクトにはいいドメインモデルがあるらしい ●
ユビキタス言語を定めて、それを使って対話をするべきらしい ● エンジニアだけでなく、ドメインエキスパートを集めてモデリングをするとい いらしい ● ドメインモデルと実装は一致しているといいらしい ● 整合性を保ちたい範囲を集約とかいうらしい
19.
confidential ©Showcase Gig 19 ドメインモデリングした ● 登場人物 ○
プロダクトマネージャー(プロダクトに詳しい) ○ CS(飲食店のオペレーションに超詳しい) ○ エンジニア(詳しくなりたい) ● ホワイトボードツールつかって おしゃべりした ○ 「「注文」って何?」 ○ 「商品って?メニューって?」 ○ ユビキタス言語を定めていく
20.
confidential ©Showcase Gig 20 注文って何 ● お金を払う行為は伴うの? ●
ファミレスでの「注文」と、デリバリーサービスでの「注文」って一緒なの? ● 注文の単位ってなんだろう。 ○ 3人で1つずつ頼んだ料理は3注文? ○ 1人で3つ料理を頼んだらそれは3注文? Oxford Languagesの定義 ちゅうもん 【注文・註文】 《名・ス他》 1. 1. 品質・数量・形・寸法等を指定して、作らせたり送らせたりすること。 「―を取る」 2. 2. こうしてほしいと指図(さしず)をし、希望すること。 「―をつける」
21.
confidential ©Showcase Gig 21 モデルの例 ※簡略化しています
22.
confidential ©Showcase Gig 22 GoとDDDでモバイルオーダープラットフォームを型安 全に作り直した話
23.
confidential ©Showcase Gig 23 Goで実装するよ ● 全体設計 ○
Onion Architecture ● 今日は主にドメイン層とユースケース層の話をします
24.
confidential ©Showcase Gig 24 こいつを忠実に実装する
25.
confidential ©Showcase Gig 25 ドメイン層: Order
struct 定義 // Order 注文モデル type Order struct { orderID types.OrderID restaurant order_vo.Restaurant orderItems []*order_vo.OrderItem orderedAt order_vo.OrderedAt orderState order_vo.OrderState } ● すべてValue Objectとし、プリミティブ型は扱わない
26.
confidential ©Showcase Gig 26 ドメイン層: CreteOrder
// NewOrder 注文を新規に作成する func NewOrder( orderID types.OrderID, restaurant order_vo.Restaurant, orderItems []*order_vo.OrderItem, orderedAt order_vo.OrderedAt, state order_vo.OrderState, ) (*Order, error) { // 注文時間から、店舗で注文受付可能か判断す る accept, err := restaurant.IsOrderAcceptable(orderedAt) if err != nil { // 何からのエラーが発生したので注文失敗 return nil, err } if !accept { // 店舗設定により注文不可なので注文失敗 return nil, errors.New("注文受付時間 外") } // 注文オブジェクト生成 return &Order{ orderID: orderID, restaurant: restaurant, orderItems: orderItems, orderedAt: orderedAt, orderState: state, }, nil } ● Entity / ValueObjectの生成は、必ず 専用のコンストラクタを利用する。 ● 注文作成条件を満たさないような、 不正な注文オブジェクトは 生成できないようにする ● 引数なども正しいものしか 渡ってこない前提で実装できる
27.
confidential ©Showcase Gig 27 ユースケース層: CreateOrder ユースケース層の実装 ●
Entity / VOを生成して ● 永続化する それだけを行う。 「この場合注文できていいんだっ け?」というロジックはすべてドメ インモデルの中に含まれているの で、Usecase層は何もしなくてよ い。 // Create 注文を受け付ける func (o *CreateUseCase ) Create(ctx context.Context, input CreateInput ) (orderId types.OrderID, err error) { // DBトランザクション内で処理する err = o.dbClients.WritableClient. RunInWriteTx (略) (err error) { // ~~~~ 略 ~~~~ // 取得した商品情報から注文商品情報を組み立てる orderItems , err := vo.NewOrderItems (orderRequestItems , items) if err != nil { // 注文商品情報が不正 return } // 注文ステータス作成 initialState , err := vo.NewOrderState (input.InitialOrderState) if err != nil { // 注文ステータスが不正 return } // 店舗情報取得 restaurant , err := o.masterRepository. GetRestaurant (ctx, queryable, types.RestaurantID (input.RestaurantId)) if err != nil { // 店舗が不正 return } // 注文エンティティ生成 orderId = types.OrderID(numberingService. Generate()) orderEntity , err := entity.NewOrder( orderId , restaurant , orderItems , orderedAt, initialState , ) if err != nil { // 注文作成に失敗 return } // 注文を永続化 err = o.orderRepository. Persist(ctx, queryable, orderEntity) if err != nil { // ~~~~ 略 ~~~~ } return }) return orderId, nil }
28.
confidential ©Showcase Gig 28 Goで実装したよ ● DDDに従い、モデルを忠実に実装してみた ○
モデリングが終わった頃にはほぼ実装内容も決まっていて新感覚。 ○ ドメイン層はピュアなGo言語の世界なので、ユニットテストを書きやすい。プログラミングし てる!って気持ちになって楽しい。 ● Goはゴリゴリのオブジェクト指向言語というわけではないが、十分に書ける。 ○ Defined Typeがあるので、プリミティブ型に別名をつけるのが楽で快適 ● 唯一気になるのは ○ コンストラクタを経由しないオブジェクト生成を禁止できない ○ (「こうすればいけるよ」募集中です )
29.
confidential ©Showcase Gig 29 GoとDDDでモバイルオーダープラットフォームを型安 全に作り直した話
30.
confidential ©Showcase Gig 30 おしまい
Download