Object)하루 시간대별 계산(TimeOfDayCalc)을 prev데코객체로 처리(Plan7)
구간처리에 사용되는 prev데코객체를 시간대별 계산에 적용하기
📜 제목으로 보기
- TimeOfDayCalc를 암묵적 index로 묶인 컬렉션필드 -> prev데코객체로 처리하도록 변경하기
- 구간처리를 해줄 prev데코객체 생성 및 필드 1개로 소유하기
- prev데코객체는 시작특이점객체로 필드초기화하니, 생성자는 정의해줄 필요 없이 체이닝setter로 받되, 매번 다음타자로 업데이트하고, 현재 rule을 prev필드에 저장하게 한다.
- 기존 전략메서드는 놔두고, public 기본메서드로 새로 작성후, 다음타자로 업데이트까지 필요한 틀을 잡는다.
- prev데코객체의 개별처리 메서드는, 자신의to와 prev의 to로 인해 정해놓은개별구간만 처리하지만, 전체 처리할 구간을 duration으로 변형된 인자를 받는다. (Duration.ofSecconds()나 기존 start+end (localdatetime) -> between()활용)
- [추가] 처리해야할 구간이 처음부터 시작안할 수 있다. 그럴 경우, a-b 구간을 = 0-b구간 처리 - 0-a구간처리로 나눠서 처리해야한다. -> 물어보고 중간구간이면, 2번 계산후 차이를 구해야한다. (데코객체 자체가 0부터 시작하는 구간으로 인지하고 비교 등 연산하기 때문)
- prev데코객체들이 개별구간을 처리하기 전에 확인해야할 2가지
- 01 내 자신이 시작특이점은 아닌지 확인한다.(prev필드 == null) -> 차후에는 외부 반복문 돌릴 때, 조건에 걸려서 없어진다. 처음 Rule객체 작성 및 테스트시에 넣는다.
- 02 처리할 구간이 나보다는 작아도 되지만, 내 하한인 (prev의 to)보다는 커야 일을 한다. -> prev데코객체 생성시에는 내 처리구간의 끝(to)를 LocalTime으로 받더라도, 연산은 0(시)부터 시작하는 구간으로 변환해야한다.
- 03 쪼개놓은 모든 구간은 반복문으로 돌아가므로, 외부에선 값을 누적하고 있다면, 내가 일을 하지 않을 땐 누적0의 값을 반환하게 한다(thr X)
- 04 내가 처리해야할 구간이라면, 내 상한 vs 처리구간 상한을 비교하여, 실제 처리할 구간의 upperbound를 찾는다. 하한은 이미 prev의 상한으로 정해져있다. 이 때, localtime으로 상한을 받았으니, 메서드를 이용해서 0부터 시작하는 duration으로 변경해준다.
- 05 [추가] localtime.of의 입력한계는 23, 59, 59인데, (1) 내 구간이 23, 59, 59를 담당하고 있고 (2) 처리해야할구간과 비교하여 정한 상한upperbound가 23, 59, 59까지 실제 처리해야한다면, Duration.ofSeconds(1)로 1초를 더해준다.
- 06 실제상한 ~ prev상한으로 만든 하한의 구간 차를 duration으로 계산후, getSeconds()로 환산후 단위초당 요금을 부과한다.
- 07 백업한 전략메서드를 지우고, 구간처리로 바꾼 메서드로 대체한다.
TimeOfDayCalc를 암묵적 index로 묶인 컬렉션필드 -> prev데코객체로 처리하도록 변경하기
구간처리를 해줄 prev데코객체 생성 및 필드 1개로 소유하기
prev데코객체는 시작특이점객체로 필드초기화하니, 생성자는 정의해줄 필요 없이 체이닝setter로 받되, 매번 다음타자로 업데이트하고, 현재 rule을 prev필드에 저장하게 한다.
-
prev객체를 필드로 소유하는 클래스는, 생성자에서 받지 않고, 이미 내부에 시작특이점 객체를 가지고 있어서, setter를 정의해준다.
-
테스트코드가 돌아가도록 기존필드를 받는 생성자를 둔 상태에서, 생성자는 추가 선언이 되므로, 빈 생성자를 하나 추가해준다.
-
테스트코드에서 (컬렉션은 아니지만 버금가는 연결 데코객체므로) addRule( )을 사용 생성하되,
다음 타자를 외부에 생성후 넣는게 아니라 다음타자 생성에 필요한 prev제외 나머지 정보
를 주어서 **prev소유 클래스 내부에서 필드로 가지고 있던 prev를 필드로 넣은 다음타자
생성한 뒤,다음타자를 필드로 가지고 있도록 setter를 정의
한다. **-
test코드에서 사용 생성하면된다.
-
Rule 생성에 필요한 정보를 생성자 정의부 파라미터 복사해서 가져와 prev를 제외하고 넣어줘야한다.
-
-
-
다음타자를, 60초를 단위시간으로 10원씩 부과하며, 다음구간은 0시 출발이므로 2시까지로 한다.
-
다음구간의 끝은, 무조건 직전구간보다 커야한다.
기존 전략메서드는 놔두고, public 기본메서드로 새로 작성후, 다음타자로 업데이트까지 필요한 틀을 잡는다.
prev데코객체의 개별처리 메서드는, 자신의to와 prev의 to로 인해 정해놓은개별구간만 처리하지만, 전체 처리할 구간을 duration으로 변형된 인자를 받는다. (Duration.ofSecconds()나 기존 start+end (localdatetime) -> between()활용)
[추가] 처리해야할 구간이 처음부터 시작안할 수 있다. 그럴 경우, a-b 구간을 = 0-b구간 처리 - 0-a구간처리로 나눠서 처리해야한다. -> 물어보고 중간구간이면, 2번 계산후 차이를 구해야한다. (데코객체 자체가 0부터 시작하는 구간으로 인지하고 비교 등 연산하기 때문)
-
먼저 처리해야할 구간을 가진 interval한테, 0부터 시작하는 구간인지 vs 중간구간인지 물어본다.
-
중간 구간이라면,
0~큰구간
과0~작은구간
을 가지고와서,각각을 계산후 차이
를 내야한다.