2024/11/17
時間割に関すること
現在時刻が、時間割において何行目の何列目にある授業の時間帯なのかを計算する。
必要な値
現在の曜日
現在の時間
返す値
Result<LecturePeriod, >
LecturePeriod
いつ始まるか?(LocalTime)
いつ終わるか?(LocalTime)
時間割における位置はどこか?(TimeTablePosition)
考察:
LecturePeriodのインスタンスはsealed classのdata objectとして定義しておく?
あるLecturePeriodに対するLocalTimeやTimeTablePositionの値は、つねに不変である。
これは valで定義すれば解決する問題かt6o_o6t.icon
また、LecturePeriodの種類には基本的に変化がない。
LecturePeriodの種類が不変であることをコンパイラに伝える手段が欲しい。
何も対策しなければ、when句でLecturePeriodの値を分岐するときに分岐の記載漏れを指摘されてしまうため
この方法を単純に採用すると、LecturePeriodのインスタンス群に対する順序付きで繰り返しを行う方法が必要だ
LecturePeriodのインスタンス群を一つのlistにまとめる?
あるいはenumとして定義するか
直感的にはenumで書きそう、と思ったiNoma.icon
enumのデメリットはなんだろう?
LecturePeriod
TimeTablePosition(data class)
何行目にあるか?
何列目にあるか?
認証情報に関すること
Credentials(Entity)
username
password
(usernameしかない、passwordしかないようなデータが混入するのは困るな)
IncompleteCredentialsとして区別する。
不正状態なので、RepositoryからCredentialsを返すときはErrとして返す
RepositoryからErrが返ったとき、認証が実行できないためユーザにフィードバックする
認証など必要な操作は常にCompleteCredentialsを使う
Q. Preferenceなど、より大きい単位で読み書きしないのか?
Credentialとその他の設定データをPreferenceと呼ぶことには、UIデザインの都合上、単一の画面に描画したいという動機しかない
モデル駆動設計を採用するのであれば、Credentialより大きい、UIの影響を受けたモデルを採用すると、作業の順序が逆転していることになる。ゆえに不適切である。
Q. Credentialsは単なるエンティティだが、リポジトリから読み書きしていいの?
問題なし。エヴァンス本ではオブジェクトのライフサイクルの一つとして、リポジトリでオブジェクトを再構成したり、永続化したりする方法を紹介している
Credentials集約はCredentialsエンティティが集約ルートであり、かつそれ以外にエンティティは(いまのところ)持たない
単一のエンティティのみで構成された集約があっても良いだろう
✅ Repositoryの実装完了
Credentialsを入力できるようにする
ここで気づいたが、Credentialsの特定のプロパティがnullになる状況はあってはならない
そのほうがUIも書きやすくなる予感がある
いまはFlowを使ってCredentialsを読み取っているので、IOExceptionが起こったときのハンドリングは終端演算子を使用する箇所に置くのが正解
ポータルへのリクエストをラップしたい
ポータルへのリクエストを抽象化し、レスポンスが取得できない場合にはログインを再度試行する
どのように抽象化する?
getTimetable : TimetableDTO
TimetableリポジトリでTimetableDTOをTimetableエンティティに変換する
Timetableエンティティは集約ルートとし、各時間の授業情報は