tofucodes diary

にほんごのほう

指定期間のデータを抽出するアンチパターンについて

何かしらのデータのリストから特定の期間のデータのみをフィルタしたいような時があると思います。

今回のサンプルはデータのリストから6月に作成されたデータをフィルタします。

おそらくよくありがちなコードはこんな感じではないでしょうか。

(コードはだいぶデフォルメしてます)

let dataList: [SomeData] = ...
// 2018/06/01 00:00:00 <= x <= 2018/06/30 23:59:59
let filtered = dataList.filter { Date("2018-06-01 00:00:00") <= $0.createdAt && $0.createdAt <= Date("2018-06-30 23:59:59") }

弊社のiOSアプリにもこのようなコードが存在していました(そしてバグがありました)。

これはあまり良くないです。

なぜこれが良くないかというと、比較の後ろのデータが無限に取りうるから(23:59:59.999.... <<< 越えられない壁 <<< 00:00:00)。

それを踏まえたより良い実装はこちら。

let dataList: [SomeData] = ...
// 2018/06/01 00:00:00 <= x < 2018/07/01 00:00:00
let filtered = dataList.filter { Date("2018-06-01 00:00:00") <= $0.createdAt && $0.createdAt < Date("2018-07-01 00:00:00") }

実際にSwiftのDateオブジェクトの比較でどこまで細かい秒数まで使われるか知らないので、もしかしたら問題ないかもしれないですが、

この考え方自体は、些細なことですが言語にかかわらず結構重要な気がします。