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
関数型DDD入門
Search
いなたつ
May 05, 2024
0
77
関数型DDD入門
いなたつ
May 05, 2024
Tweet
Share
More Decks by いなたつ
See All by いなたつ
KC3 Shinkan Fes 2024 ~ブロックチェーン~
inatatsu
0
68
月刊Nemtus 20231028
inatatsu
0
120
Slide.pdf
inatatsu
0
130
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
94
13k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Faster Mobile Websites
deanohume
306
31k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Statistics for Hackers
jakevdp
797
220k
Transcript
関数型DDD入門 inatatsu
自己紹介 稲垣 達大 inatatsu 株式会社 OpeningLine アプリケーションエンジニア プロジェクトマネージャー 年 齢
24 大 学 理工学部 情報学科 大学院 エレクトロニクス系工学専攻 ボルダリング・ゲーム 趣 味
会社紹介 創業日:2017年4月12日 会社名の意味:本を開いた1ページ目 創業者:佐々木亮一(現CEO) 事業内容: ・ブロックチェーンを扱う自社製品販売 ・PLM導入支援業務 ・ソフトウェア受託開発業務
ドメイン駆動設計 「ドメイン」知識に基づいた設計手法 P ドメインモデルに落とし込7 P ビジネス要件が維持しやすい
関数型プログラミング 純粋関数を用い状態変化やデータのミューテーションを避けるプログラミング c 入力が同じなら出力は常に同Y c テストと保守が容易になC c バグが減る
代数的データ型 型を組み合わせて作る型で直積型と直和型で構成される 直積型 複数の型を「AND」で組み合わせて表現される 例) 直和型 複数の型を「OR」でいずれかの型として表現される 例)
データモデリング ブログシステムの記事(Post)についてのデータモデリングを考える q タイトt q コンテンA q 著I q 状態
(ドラフト,レビュー済み,レビュー落ち,修正版,公開 etc... q レビュワー (optional q レビューコメント (optional q 公開日時 (optional q 更新日時 (optional)
データモデリング ブログシステムの記事(Post)についてのデータモデリングを考える 記事の公c レビュー済みなら公開可h 記事のレビュ ドラフトもしくは修正版に対して実行可h
リジェクトする場合はレビューコメントを付けU 記事の編集・削B ドラフトの場合自A 公開済みの場合は承認が必要
データモデリング ブログシステムの記事(Post)についてのデータモデリングを考える 記事の公c レビュー済みなら公開可h 記事のレビュ ドラフトもしくは修正版に対して実行可h
リジェクトする場合はレビューコメントを付けU 記事の編集・削B ドラフトの場合自A 公開済みの場合は承認が必要
データモデリング ブログシステムの記事(Post)についてのデータモデリングを考える g レビュー未承認の記事に対して公開日時を設定可W g 未承認の記事を公開してしま g 公開済みの記事に対して状態の変更が可W g 公開済み
-> ドラフトへの巻き戻a g データ不整合の可能性
関数型DDD的データモデリング 記事の状態ごとにデータモデリングを考える DraftPost I タイトE I コンテン@ I 著者 I
記事のレビュー承P I 記事のレビュー却下
関数型DDD的データモデリング 記事の状態ごとにデータモデリングを考える ApprovedPost E タイトT E コンテンH E 著F E
レビュワー E 記事の公開
関数型DDD的データモデリング 記事の状態ごとにデータモデリングを考える PublishedPost H タイトX H コンテンR H 著I H
公開日G H 最終更新日時 H 記事の更新
関数型DDD的データモデリング 記事の状態ごとにデータモデリングを考える RejectedPost F タイトU F コンテンI F 著G F
レビュワB F レビューコメント F 記事の修正
関数型DDD的データモデリング 記事の状態ごとにデータモデリングを考える AppliedReviewChangePost W タイトi W コンテンa W 著X W
レビュワS W レビューコメンd W 新しいタイトi W 新しいコンテンツ W 記事のレビュー承r W 記事のレビュー却下
全域関数と部分関数 全域関数 全ての引数で値が定義されている関数 部分関数 引数によって未定義となる領域が存在する関数
全域関数と部分関数 head関数 : リストの先頭要素を返す関数 (部分関数) 空配列の場合 先頭要素が存在しないためエラー 空配列以外の場合 配列の先頭要素を返す
全域関数と部分関数 head関数 : NotEmptyListの先頭要素を返す関数 (全域関数) 全てのNotEmptyList 先頭要素を返す 1つ以上の要素を持つリストのクラスを作る (NotEmptyList)
全域関数と部分関数 Postの公開操作 Draft状態 -> Error Approve状態 -> 公開日時の設定 Reject状態 ->
Error ApplyReviewChange状態 -> Error Publish状態 -> Error
全域関数と部分関数 Postの公開操作 DraftPost -> 定義無し (実行不可) RejectedPost -> 定義無し (実行不可)
AppliedReviewChangePost -> 定義無し (実行不可) PublishedPost -> 定義無し (実行不可) ApprovedPost -> approvedPost.publish(now)
まとめ 抽象的データ型を活用したデータモデリングを行うことにより といった恩恵が得られる a テストが容易になS a 予期せぬバグが減S a 型レベルで堅牢になる