저장 기능을 만들고 테스트 하던 중에 치명적인 버그를 발견했다.
로그를 찍어보니 저장 횟수가 연속계산 횟수에 비례한다는 걸 알 수 있었다.
ㅋㅋ
반복할 때 마다 늘어나는 값이 있다는건데.. 제일 수상한 건 역시 calculate 메서드니까 콘솔을 군데군데 찍어보자.
//Calculator App 의 number List 를 calculationFormula 로 명명
public double calculate(List<String> calculationFormula) {
//numbers List 에 있는 짝수번째 값 -> 숫자
List<Double> numbers = IntStream.range(0, calculationFormula.size())
.filter(i -> i % 2 == 0)
.mapToObj(i -> Double.parseDouble(calculationFormula.get(i)))
.toList();
//numbers List 에 있는 홀수번째 값 -> 연산자
List<String> operators = IntStream.range(0, calculationFormula.size())
.filter(i -> i % 2 != 0)
.mapToObj(calculationFormula::get)
.toList();
System.out.println(calculationFormula);
//Atomic 변수로 연속 계산을 위한 이전 계산 결과 저장
//첫 a의 값은 List 의 첫번째 값이어야 하므로 초기값에 numbers.get(0)
AtomicReference<Double> result = new AtomicReference<>(numbers.get(0));
System.out.println(result.get() + "아톰!");
IntStream.range(0, operators.size()).forEach(i -> {
System.out.println("forEach 문 뱅글뱅글");
//a의 값은 항상 Atomic 변수로부터 받아옴
double firstNumber = result.get();
double secondNumber = numbers.get(i + 1);
String operator = operators.get(i);
//enum 으로 숫자와 연산자를 각각 보내서 계산
Operation operation = Operation.fromSymbol(operator);
//get 으로 Atomic 변수에 결과값 할당
result.set(operation.apply(firstNumber, secondNumber));
//history 저장
history.saveHistory(firstNumber, secondNumber, operator, result.get());
System.out.println("히스토리 저장!");
});
//현재 저장된 값 반환
return result.get();
}
찾았다 요녀석;;
forEach문을 돌리는 횟수 range가 operator의 갯수만큼으로 되어있어서 저장 횟수도 그렇게 늘어났다하하핳ㅎ;; 연속계산을 위한 게 History엔 독이 되었다.
역시 sout 콘솔로그는 신이다 ^_^
그럼 이 코드를 어떻게 고칠 수 있을까?
간단하게 마지막 반복에서만 savehistory가 실행되게끔 고쳤다.
알고리즘을 열심히 푼 게 도움이 된 걸까?
바로 실행시켜보자.
굳~~~!~!~!~!!!!!
이제 history에서 출력한 값으로 무엇을 할지 좀 고민을 해봐야겠다.
근데 내용이 이렇게 짧은데 트러블슈팅이라 볼 수 있을까?..
'개인 공부용 > sparta-calculator' 카테고리의 다른 글
<finish> 가 아니라 리팩토링.. (0) | 2024.11.17 |
---|---|
Interface? or Method? <6> (1) | 2024.11.15 |
Generic을 도대체 왜 쓸까? <5> (1) | 2024.11.15 |