2022. 10. 30. 16:41ㆍJAVA
스스로 Java를 이용해 객체지향적으로 Calculator를 설계하는 과제를 마쳤다.
과제를 진행하는 동안 겪은 어려움과 학습한 내용들을 간단하게 정리하고자 한다.
지금까지 독학을 하면서 다른 사람에게 내 코드를 보여준 것은 이번이 처음이다.
상당히 유익한 시간이었고 내가 갖고 있던 안좋은 습관들을 발견할 수 있었다.
고치는 것은 앞으로 나의 몫이다!
안좋은 습관들
- 변수명을 축약형으로 사용하는 것
sc -> scanner, comm -> command 등 풀 네이밍하는 습관을 갖자 - 주석을 사용하는 것
'주석을 달아야 하는 코드는 잘못된 코드다’ 라는 말을 어디선가 들은 것 같다.
클래스와 메서드 명을 명확하게 하고, 테스트 코드가 문서처럼 작성되는 것이 베스트다. - 메소드 네이밍을 잘하자
checkUserInput() 이라는 메소드가 있었는데, 아마 반환값이 있다면 boolean 을 반환할거라고 생각할 확률이 크다.
하지만 내 코드에서는 Integer를 반환하는 메소드였다. 네이밍을 신중하게 해야겠다. - 한 개의 메소드는 하나의 기능만을 수행해야 한다
showOption()이라는 메소드가 있었는데, 사용자에게 옵션 리스트를 출력하고, 사용자의 입력 값 까지 받아서 전달하는 기능을 수행했었다. 따라서 두 개의 메소드를 통해 각각의 기능을 수행하도록 변경하였다. - 자주 사용하는 값은 상수로 만들어보자
메서드에 "+", "1", "0" 등 의미가 불분명한 구체적인 값을 직접 적기보다 static final 상수로 선언하거나, Enum을 사용하자. 이번 과제에서 Enum을 처음 사용해보았는데 생각보다 기능이 매우 좋았다. - 테스트는 항상 자동화
Assertions를 이용해 테스트의 결과를 자동으로 확인할 수 있게 설계해야 한다.
이는 당연한 내용인데 결과물을 그냥 내 눈으로 확인하고 넘어가고 싶어서 콘솔에 출력하는 방식으로 메소드를 몇 개 작성했었다. - 테스트 메소드 1개에는 1개의 검증식을 사용하자
위의 테스트 자동화와 마찬가지로 내가 좀 더 부지런했다면 피드백을 받지 않았을 문제다.
조금 귀찮더라도 테스트를 세분화하고, 자동화하자.
어려웠던 점
1. 객체를 어느 수준까지 분리해야 하는가?
일단 객체 지향적으로 설계하기 위해서 계산기를 기능별로 해체했다.
과제의 요구사항에 의하면 크게 입력/출력/연산/저장으로 분류가 가능하다.
따라서
Input: 입력 객체
Output: 출력 객체
Compute: 연산 객체
Histories: 저장 객체
를 생성하였고, Calculator라는 클래스에서 위 4개의 객체를 생성자로 받아 각각의 메소드를 실행하는 방식으로 설계했다.
또, 연산하는 과정에서는 연산 식을
1) Token 객체로 쪼개서 List<Token>에 저장하는 변환 객체
2) List<Token>이 올바른 순서와 연산자, 피연산자인지 확인하는 검증객체
3) 연산을 수행하는 연산객체
총 3개의 기능이 더 필요해서 각각을 클래스로 생성했다.
어떤 기능을 더 세분화 할 수 있는지, 어떤 기능들은 하나로 합칠 수 있는지 아직 감이 잘 오지 않는 상황이다 ㅠ
'객체지향의 사실과 오해'라는 책을 봄에 빌리고 그대로 반납했었는데 한 번 읽어볼 걸 싶다ㅎㅎ;
아래는 최종 제출할 때의 다이어그램이다.
2. 가독성 있는 코드를 작성하는 것
메소드 이름을 의미있고 명확하게 지어주는 것이 생각보다 어려운 작업임을 깨달았다.
무슨 게임이든 처음 시작할 때 닉네임을 생성 해야 하는데, 이 때 맛보는 창작의 고통이 다시금 느껴지는 순간이었다.
파파고와 기능별로 메소드 명을 정리해 둔 블로그를 참고하며 하나씩 개선했다.
내가 작성한 코드는 나에게 너무나 익숙하지만 남들에게는 가혹하다는 것을 알게되었다.
혼자 작성하는 코드일지라도 정성을 들이는 노력을 해야 할 것 같다.
계산기 소스코드
https://github.com/rlarltj/java-calculator
'JAVA' 카테고리의 다른 글
스트림(Stream) 소개 (0) | 2022.12.25 |
---|---|
JIT compiler (2) | 2022.12.11 |
Java 숫자야구 (0) | 2022.10.21 |
Collection과 Iterator (0) | 2022.10.20 |
JAVA 인터페이스 기능과 디폴트 메소드(Default Method) (0) | 2022.10.20 |