blog.bouzuya.net

2022-09-23 PAST #10 の J を解いた / twiq 実装メモ (3)

PAST #10 : 第10回 アルゴリズム実技検定 過去問 の J を解いた。


twiq 実装メモ (3)

作業のスタックの把握。

  • user を解決するところまで動作させたい
  • repository などの実装が提供されていない
  • EventStore trait を実装したい
  • FirestoreEventStore は一意性検査などで時間がかかってしまう
  • InMemoryEventStore をつくった
  • InMemoryEventStore を使う InMemoryUserRepository をつくりたい
  • User::from_event_stream が未実装だった
  • EventStream をつくった

2022-09-21 User aggregate への 2022-09-22 EventStream の適用から。

User::from_event_stream の追加

  • InMemoryUserRepositoryInMemoryEventStore から取得した Vec<Event>User aggregate を再構築しようとして未実装なのに気づいた
  • User aggregate に手を入れるなら EventStream を実装しても良いかもしれない
  • event_store_core::Event から domain::aggregate::user::Event への変換ができない
  • EventData::as_str があっても良さそう
  • event_store_core::Event の JSON に type field を入れるタイミングでおかしくなっている
  • 別トピックとして考える

Event の deserialize 。

  • domain::aggregate::user::Eventserde_json::from_strtype field がないと怒られてしまう
  • domain::aggregate::user::Event::Createdtype を消費してしまうので UserCreated に含めようとしてもできない
  • 一方で UserCreated に含めておかないと EventDatatype が残らなくなってしまう
  • 何段階かに分けて複数回 deserialize すると良さそう
  • event type で適切な aggregate event に処理を振り分ける
  • aggregate event でも event type で適切な event に処理を振り分ける
  • event type は全体で一意でないといけない
  • EventData に event type が埋もれているのはまずそう
  • まずいと考える理由は event type で判定したい場合に EventData を parse して取り出さないといけないから
  • domain event / aggregate event / event という階層は良くないかもしれない
  • 良くないと考える理由は aggregate event と domain event で 2 つの type を定義する必要が出るので
  • event をフラットに扱った上で aggregate event に使う形を取るほうが良いかもしれない
  • EventType を別トピックで考えよう

EventType

  • EventType とは何か
  • Event の分類の 1 つ
  • 他の分類として EventStream がある
  • Event は 1 つの EventType を持つ
  • EventType は 1 つの aggregate (≒ EventStream type) に属する
  • たとえば UserCreatedUser aggregate に属し、同時に UserRequest aggregate に属することはない
  • EventStream を横断する Event を指すものとしての domain event
  • EventStream ごとの Event を指すものとしての aggregate event
  • EventTypeEventStream を横断しているので domain event 側に入りそう
  • ひとまず event_store_core::EventType を追加する
  • それに対応する domain crate における EventType を追加する
  • event_store_core::Event と同様に相互変換できるようにする

EventStreamType

  • EventStreamType も event_store_core に含めるべきか……?
  • 永続化された情報に含められていると、どの aggregate か分かって便利そう
  • 復元時に使えそうな気もするけど EventType から導出できるので必須ではなさそう
  • ひとまず event_store_core には EventStreamType の追加なしで進める

上の子がひらがなを読むのは可能になっていて成長を感じる。


今日のコミット。