Search

2025-02-07

InternalBuffer.fill() 메서드 가안
1.
enum을 활용한 상태 전환 도입
2.
switch-case를 활용한 상태 변화
3.
while을 이용하여 if 제거
4.
상태 전환 도입시 발생할 수 있는 문제 enum 상태 반환 문제를 해결하기 위하여 boolean 반환으로 대체
이유는 enum을 받아서 상태를 확인하는 호출자 측에서 enum에 종속성이 생김. 차라리 boolean이라는 기본형을 사용하는 것이 좋다고 판단.
private enum BufferState{ INITIAL, PROGRESSING, EXTEND, RELOCATE, LAST_LINE; } /** * TODO isLastLine 추가 * RecordParser내에서 마지막 줄 여부 판단을 위해서 필요함 * BufferState를 직접적으로 return하지 않은 이유는 RecordParser측에서 enum 종속성이 생겨버림. * 이 때문에 boolean 반환을 선택함 * 상태 전이 [] 반복, () 선택, {} 종료 * INITIAL -> [PROGRESSING <-> (EXTEND | RELOCATE)] -> LAST_LINE{종료} */ boolean fill2(){ int cnt; while (true){ switch (state){ case INITIAL: cnt = read(buf, pos); state = BufferState.PROGRESSING; return cnt != -1; case PROGRESSING: /** * if -> begin >= limit 일 경우 즉, 커서가 끝까지 갔는데 아무 변화 없을때 * state = (pos == 0) ? EXTEND : RELOCATE; * continue; * retrun true; */ case EXTEND: /** * 확장 및 read * extend() 확장 * cnt = read(begin) -> READ_SIZE 만큼 읽기 * if -> cnt == -1 LAST_LINE * else -> PROGRESSING and limit += cnt * continue; */ case RELOCATE: /** * 재배치 및 read * relocate() * begin = limit - pos; * pos = 0; * cnt = read(begin) // READ_SIZE 만큼 데이터 로드 * if -> cnt == -1 LAST_LINE * else -> PROGRESSING */ case LAST_LINE: return pos < limit; } } }
Java
복사