Skip to content

Instantly share code, notes, and snippets.

@suzuki-hoge
Last active August 7, 2019 02:39
Show Gist options
  • Save suzuki-hoge/551b57c947b15140a015937e7b644ddf to your computer and use it in GitHub Desktop.
Save suzuki-hoge/551b57c947b15140a015937e7b644ddf to your computer and use it in GitHub Desktop.
Domain Modeling Made Functional

Domain Modeling Made Functional

@suzuki-hoge
Copy link
Author

  • integrity: value object や entity ( agregate? ) の組み立て不正
  • consistency: ある entity が存在するべきなのにしないような、データ不整
  • invariant: 発注数は 1 - 1000 等の、不変性
  • Smart constructors - HaskellWiki

@suzuki-hoge
Copy link
Author

a useful guideline is “only update one aggregate per transaction.”

@suzuki-hoge
Copy link
Author

A classic example is transferring money between two accounts, where one account increases and the other decreases.

@suzuki-hoge
Copy link
Author

コンテキストをまたぐ集約の整合性をとる場合、当然依存させたりはしない

メッセージででもやりとりして、失敗したら詫びるなり補正するなりする
全部のエラーを実装するよりはるかにコストが低い

同一コンテキストの場合でも、トランザクションは集約ごとに切った方が良い

ただし送金の様な業務的に捉えてトランザクションが1つの場合(減額と増額)は一緒のトランザクションにした方が良い

@suzuki-hoge
Copy link
Author

consistency: 一貫性
integrity: 完全性

@suzuki-hoge
Copy link
Author

integrity: システムの堅牢さ
consistency: 業務の正しさ

@suzuki-hoge
Copy link
Author

suzuki-hoge commented Apr 1, 2019

イベントの方向と供給者とかは別の話
連携方法を決めたりするだけ

@suzuki-hoge
Copy link
Author

10. working with domain errors

ドメインエラーとそれ以外をわけよう

ドメインエラーは業務の単位で分けよう

在庫切れ -> ドメインエキスパートとフローを考える
住所検証システムが落ちてて検証できない -> また別のフローを考える

先日のマイクロサービスアーキテクチャででた機能低下の話と同じ?
全部落とさないで、別の方法で業務を継続できるのが望ましいのかな

アマゾンはカートシステムが落ちたら電話で受け付ける機能が有効になる、みたいな話

@suzuki-hoge
Copy link
Author

全てのエラーを設計時に掘り下げることはしないが、ドメインエラーかどうかは判断しよう
ドメインエラーなら列挙型に追加したりしよう

@suzuki-hoge
Copy link
Author

インフラエラーがドメインエラーになるかはケースバイケース

↑ 機能低下の話に繋がるのかな

あとは僕らでも特典がつけられなくても受付はやるみたいなケースもあるし

@suzuki-hoge
Copy link
Author

僕らは今は domain / panic, infra ( runtime ) みたいになってるな

@suzuki-hoge
Copy link
Author

例外(フロー)は必ずしもレイヤーで決まらない

uc で決まる

量販店だと即時だけど月末(まで)処理なら翌営業日、とか

@suzuki-hoge
Copy link
Author

そう考えると、エラーマッピングは api の上ではなくて api と service の間とかになるのかな

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment