気がつきたいコード
後輩に頼んでおいたコードをレビューしていたときに気がついたことがあったのでメモしておく。
後輩にお願いしたコードはどういうものか
- 日付のバリエーションチェック:yyyy/MM/DD,HH,mm
- yyyy/MM/dd:年月日
- HH:時間
- mm:分
- 年月日は JavaScript で作成されたカレンダーを選択することでテキストに入力(上記の形式でサーバに飛んでくる)
- 時は select を使い、option の値は0〜23まで
- 分も select を使い、option の値は5刻みで0〜55まで
- これらはDateに変換され Timestamp 型でデータベースに保存される
後輩はどのようなバリエーションチェックを実装したのか
- 必須:全項目が入力されているか
- 長さ:
- 年月日 → 10桁
- 時間、分 → 2桁
- 文字種:
- 年月日 → 半角数字とハイフンのみ
- 時間、分 → 半角数字のみ
- 形式:
- 年月日 → "yyyy/MM/dd" になっているか
- 時間、分 → チェックなし
これの何に引っかかるのか
このバリデーションチェックは機能している。テストケースにパスするし、組み込んで画面から打鍵してもちゃんと不正な値を捕まえてくれる。処理的には問題が無いコード。
なのだが引っかかる。こういうチェックでもエラーを防ぐことは出来ているがもっと単純にチェックすることが出来る。つまり、最終的にこれらは日付になって欲しいのだ。そこを抑えていると、こういうエラーチェックにはならない。
「入力内容を日付に変換する」
これだけ確認すればいい。
後輩のロジックでも確かに問題なく機能する。しかし、対応すべき問題の本質に気づけば、もっと単純なコードになるはずだ。