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 などの実装が提供されていない
EventStore
trait を実装したい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>
で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::Event
のserde_json::from_str
でtype
field がないと怒られてしまう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
はUser
aggregate に属し、同時にUserRequest
aggregate に属することはない 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