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
복사