2022-09-23 PAST #10 の J を解いた / twiq 実装メモ (3)
PAST #10 : 第10回 アルゴリズム実技検定 過去問 の J を解いた。
- J - 区間の期待値
https://atcoder.jp/contests/past202203-open/tasks/past202203_j
- 提出: https://atcoder.jp/contests/past202203-open/submissions/35066314
- 解説 AC
- ソートして良いこと・最小最大の位置を考えるところまでは見えた
X - YをA_{i+1} - A_iの和で捉えた上で寄与を求める- 寄与するかしないかを余事象から求める
A_i以下でK個を選んでしまう場合とA_{i+1}以上でK個を選んでしまう場合を除けば良い
twiq 実装メモ (3)
作業のスタックの把握。
userを解決するところまで動作させたい- repository などの実装が提供されていない
EventStoretrait を実装したいFirestoreEventStoreは一意性検査などで時間がかかってしまうInMemoryEventStoreをつくったInMemoryEventStoreを使うInMemoryUserRepositoryをつくりたいUser::from_event_streamが未実装だったEventStreamをつくった
2022-09-21 User aggregate への 2022-09-22 EventStream の適用から。
User::from_event_streamの追加
InMemoryUserRepositoryでInMemoryEventStoreから取得したVec<Event>でUseraggregate を再構築しようとして未実装なのに気づいたUseraggregate に手を入れるならEventStreamを実装しても良いかもしれない
event_store_core::Eventからdomain::aggregate::user::Eventへの変換ができないEventData::as_strがあっても良さそうevent_store_core::Eventの JSON に type field を入れるタイミングでおかしくなっている- 別トピックとして考える
Event の deserialize 。
domain::aggregate::user::Eventのserde_json::from_strでtypefield がないと怒られてしまうdomain::aggregate::user::Event::Createdでtypeを消費してしまうのでUserCreatedに含めようとしてもできない- 一方で
UserCreatedに含めておかないとEventDataにtypeが残らなくなってしまう - 何段階かに分けて複数回 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) に属する- たとえば
UserCreatedはUseraggregate に属し、同時にUserRequestaggregate に属することはない EventStreamを横断するEventを指すものとしての domain eventEventStreamごとのEventを指すものとしての aggregate eventEventTypeはEventStreamを横断しているので domain event 側に入りそう- ひとまず
event_store_core::EventTypeを追加する - それに対応する domain crate における
EventTypeを追加する event_store_core::Eventと同様に相互変換できるようにする
EventStreamType 。
EventStreamTypeも event_store_core に含めるべきか……?- 永続化された情報に含められていると、どの aggregate か分かって便利そう
- 復元時に使えそうな気もするけど
EventTypeから導出できるので必須ではなさそう - ひとまず event_store_core には
EventStreamTypeの追加なしで進める
上の子がひらがなを読むのは可能になっていて成長を感じる。
今日のコミット。
- rust-sandbox 10 commits
- twiq: Add impl {Display,FromStr} for EventType
- twiq: Fix events to use domain::event::EventType
- twiq: Add impl serde::Deserialize for EventType
- twiq: Add EventData::as_str
- twiq: Add domain::event::EventStreamType
- twiq: Add domain::event::EventType
- twiq: Add EventType::as_str
- twiq: Add Event::type
- twiq: Add event_store_core::event_type mod
- twiq: Add EventType
- rust-atcoder 1 commit