[230823] 날짜범위
Table of Contents
1 Disclaimer
이 글은 개인적인 기록을 위한 글이며, 정확한 정보는 아래 마틴파울러의 글을 읽는 것이 더 큰 도움이 될 것이다.
2 정리
날짜는 참으로 어렵다.
대부분의 fact는 특정 기간동안만 유효한 경우가 많다. 이런 경우 우리는 대부분 기간으로 표시한다. 이 기간은 대부분 한 쌍의 날짜로 표시된다.
만약 A가 B회사에 2022년 1월 1일에 입사하고 2023년 2월 1일에 퇴사한다고 해보자. 그리고 C가 B회사에 2023년 1월에 입사하였다고 하면, A와 C는 2023년1월1일부터 2월1일까지 함께 B회사에 속해있었다.
이런식으로 효과적으로 특정 시간에 따라 직원이 유효한지, 유효한 직원의 수는 얼마나 되는지 알 수 있다. 더해서 과거를 고칠 수도 있어야 한다. A가 사실은 2월 1일에 퇴사하지 않았고, 1월 25일에 퇴사한 것이라고 해보자. 그것을 2월 7일에 알아차렸다.
우리는 과거를 소급적용을 할 수 있어야 한다.
이렇게 유효성을 이용하는 방법은 아주 쉽다. 단점이라고는 현재 정보를 확인하려는 모든 쿼리 로직에 이 범위조건절이 모두 추가되어야 한다. 아주 번거롭지는 않은 요구사항이다.
class Company { ,,, } class Person { List employments = new ArrayList(); void addEmployment(Company c, Mfdate startDate) { employments.add(new Employment(c, startDate)); } } class Eployment { private DateRange effective; private Company company; Employment(Company company, MfDate startDate) { this.company = company; } boolean isEffectiveOn(MfDate arg) { return effective.includes(arg); } void end(MfDate endDate) { effective = new DateRange(effective.start(), endDat); } } class DateRange { Date start; Date end; public boolean includes(MfDate arg) { return !arg.before(start) && !arg.after(end); } // ,,, }