계산기 과제

텐저린티·2023년 6월 17일
0

데브코스

목록 보기
1/41
post-thumbnail

GitHub - SY97P/java-calculator: 자바 계산기 구현 미션 Repository입니다.

🔖 회고

개념에서 경험으로

OOP가 뭔지, 선언형 프로그래밍이 뭔지, 클린코드가 뭔지 개념으로만 알고있던걸 직접 써보니까 확실히 다르다.

객체지향 생활체조라는 게 있는지도 몰랐는데, 생각보다 많은 사람들이 복잡한 코드에 온 몸 비틀다가 이런 저런 아이디어를 떠올렸다는 생각이 든다.

잘 흡수해서 커리큘럼 말미에는 몸에 베어있으면 좋겠다.

Pull Request

여러 사람 코드를 보면서 비교도 가능하고, 보완도 가능한게 좋다.
클론한 프로젝트나 새로 시작한 레포지토리 관리를 매번 헤맸는데 이번 기회에 확실히 짚고 넘어간 것 같다.
초기비용이 줄어든다는게 이런것도 포함되나 싶다.

구조설계

프로젝트 할 때마다 항상 구조 설계가 문제였다.
기능이 추가될때마다 구조를 변경하곤 했는데
이번엔 주어진 요구사항이 명확하고, 디자인 패턴으로 뭔가 상상력이 풍부한 상태라 이것저것 많이 시도해봤다.
강의 내용에서 리더님이 보여준 예제로 감을 잡고 시작한 것도 마음에 들었다.

gitignore

귀찮음으로 범벅된 나의 인생덕에 늦게 접한 gitignore.
강사님의 조언으로 당최 뭐하는 놈인지, 어떻게 쓰는건지 알게 되었다.
git에 클린한 프로젝트를 올릴 수 있다는 장점 외에도,
내가 만든 코드 중 필요한 코드와 언제든지 만들 수 있는 코드를 구분할 수 있다는 게 좋았다.

🎯 하고싶었던 것

  • .gitignore 파일 써보기
  • OOP 신경쓰면서 해보기
  • build.gradle에 내가 원하는 걸 넣어보기
  • 다이어그램 그리면서 해보기
  • 테스트 코드 작성해보기

📌 과제 설명

  • Calculator : 모든 작업 요청, 결과가 이뤄지는 클래스
  • Validator : 검증 인터페이스
  • Converter : 후위변환 인터페이스
  • Computer : 계산 인터페이스
  • Historian : 계산 기록, 출력 클래스
  • Input : 입력 인터페이스
  • Output : 출력 인터페이스
  • Operator : 연산자 관련 enum 클래스
  • InvalidInputException : 표현식 검증 Exception 클래스

https://github.com/prgrms-be-devcourse/java-calculator/assets/54990890/af5e8512-35ec-4953-88ec-517d6a28d03f

https://github.com/prgrms-be-devcourse/java-calculator/assets/54990890/e03e82fe-1167-43a2-8a6e-90efcfb7501d

👩‍💻 요구 사항과 구현 내용

  • 기능 구현
  • 검증
    • 정규식
    • 소수점 -> (?:) 패턴으로 부적절한 소수점 숫자 버림
  • 계산 -> 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 이용 -> 테스트 코드 중복 줄이기

✅ PR 포인트 & 궁금한 점

  1. 테스트 코드
    • 테스트 완료한 메소드의 결과를 테스트해야할 메소드의 인자로 주어도 되는지 궁금합니다.
  2. OOP 생활체조
    • App 클래스에서 Calculator 클래스로 필요한 모든 클래스를 주입했습니다.
      • Calculator 생명주기와 다른 클래스들의 생명주기가 같다고 판단해서 설계했는데, OOP를 위반하는 방식인지 궁금합니다.
    • 기능별로 클래스를 잘 분리했는지 궁금합니다.

📏 Git Commit Convention

  • feat : 기능
  • fix : 버그 수정
  • docs : 문서 작업
  • style: 포맷팅, ;추가
  • refactor : 리팩토링 (기능 변경 X)
  • test : 테스트 코드 추가
  • chore : 유지 (빌드 작업, 패키지 메니저 작업)
profile
개발하고 말테야

0개의 댓글

관련 채용 정보