Calculator
: 모든 작업 요청, 결과가 이뤄지는 클래스Validator
: 검증 인터페이스Converter
: 후위변환 인터페이스Computer
: 계산 인터페이스Historian
: 계산 기록, 출력 클래스Input
: 입력 인터페이스Output
: 출력 인터페이스Operator
: 연산자 관련 enum 클래스InvalidInputException
: 표현식 검증 Exception 클래스
-
검증
- 정규식
- 소수점 -> (?:) 패턴으로 부적절한 소수점 숫자 버림
-
계산 -> BiFunction 을 갖는 enum 클래스(Operator)
- 더하기 -> Operator.PLUS
- 빼기 -> Operator.MINUS
- 곱하기 -> Operator.MULTIPLY
- 나누기 -> Operator.DIVIDE (0 나누기 예외처리)
-
우선순위 (사칙연산)
- 괄호 -> Operator enum 클래스에 괄호 추가(우선순위 적용)
-
이력 -> HashMap 활용
- 계산이력 저장
- 계산이력 조회 -> 조회할 기록이 없는 경우 예외처리
-
계산 기능
- 검증
- 우선순위
- 계산결과
-
이력 기능
- 이력 저장
- 이력 조회
계산에 들어갈 요소가 어떤게 있을지 생각하면서 적은게 좋았다.
- io 패키지 제외 모두 model 패키지에 들어갈 수 있음.
Historian
->Histories
- Input, Output도 불필요한 추상화 들어감.
- Computer, Converter를 interface로 분리한 이유가 없음.
- 컬렉션은 복수 표기가 일반적.
exp
같은 축약어 사용 지양하기- 자바 컨벤션에서는 중괄호 생략하지 않음.
Calculator
클래스에서label:
구문 제거- 향상된
switch
문으로break
키워드 제거 case
조건 String을 다시Menu enum
클래스로 변환
- 향상된
Calculator
run
메소드에서 들여쓰기 조절- run에는 while 문만 두기
- actual operate에
try-catch
블럭 두기 - menu operate에서 향상 switch 문으로 유저 상호작용하기
validator
가 모호- 검증하는 객체인데 검증, 변환 둘 다 함
- 검증만 수행하도록 분리
SimpleValidator
클래스에 있는 필드 변수 책임- 생성자로 초기화해주던가
- 초기화하는 기능을 validator 바깥에 따로 해주던가
SimpleComputer
calculate
메소드 사용부분 단순화- 변수로 빼는 방법
- 메소드로 나누는 방법
Historian
클래스에서 띄어쓰기, 수식 넣는걸output
으로 책임 넘기기- 괄호는 operator인가?
Operator
클래스getOperator
메소드는 값을 못 찾을 때 NPE 발생 가능- get(0) 말고도, orelse로 예외처리?
- Optional로 받을까?
- 테스트 코드 given, when, then 형태로 나누기
- @ParameterizedTest 이용 -> 테스트 코드 중복 줄이기
- 테스트 코드
- 테스트 완료한 메소드의 결과를 테스트해야할 메소드의 인자로 주어도 되는지 궁금합니다.
- OOP 생활체조
- App 클래스에서 Calculator 클래스로 필요한 모든 클래스를 주입했습니다.
- Calculator 생명주기와 다른 클래스들의 생명주기가 같다고 판단해서 설계했는데, OOP를 위반하는 방식인지 궁금합니다.
- 기능별로 클래스를 잘 분리했는지 궁금합니다.
- App 클래스에서 Calculator 클래스로 필요한 모든 클래스를 주입했습니다.
- feat : 기능
- fix : 버그 수정
- docs : 문서 작업
- style: 포맷팅, ;추가
- refactor : 리팩토링 (기능 변경 X)
- test : 테스트 코드 추가
- chore : 유지 (빌드 작업, 패키지 메니저 작업)