[Java] 자판기 프로그램 - 회고

코지클래식·2021년 12월 13일
0

미션내용

1. 기능

  1. 동전과 상품 리스트를 생성해야하는 자판기를 만든다.
  2. 주문이 더이상 불가능할 때까지 주문을 받는다.
  3. 가능한 동전 내에서 잔액을 반환한다.

2. 제한 조건

  1. 최대한 보기 좋은 코드를 만들어 본다.
  • 컨벤션을 지킨다 : 공백라인 활용, README 활용, 모든 숫자/상수를 그냥 사용하지 말고 이름을 붙여 사용, 비즈니스 로직과 UI로직을 분리
  1. 처리하지 않는 에러를 만들지 않는다.
  • 가능한 모든 상황에 대해 특정 예외클래스를 발생시키고 마지막 입력으로 돌아가서 반복한다.
  1. 최대 2의 depth를 사용하고, 삼항연잔자/else/switch를 사용하지 않는다.

  2. 주어진 enum 클래스를 사용한다.

자세한 코드

  • 자세한 코드는 깃허브의 README를 읽어주세요.

먼저 지난 기수와 비교를 해보면..

지난 기수 (지하철 노선도 미션)

자체적인 데이터베이스 생성 및 CRUD 능력을 검증하는 것으로 보였습니다.
이를 위해서 지하철 역, 노선에 대해 각각 트랜잭션(*)을 만드는 등의
"구현능력"을 중점적으로 보았던 것 같습니다.
(*정상적으로 명령어가 들어가지 않으면, 명령어를 취소하는 것)

이번 기수 (자판기 미션)

자판기 미션의 중점적인 문제는
1. 문자열 - Array - List - enum 끼리의 변환
2. 가능한 최대한의 에러처리
를 중점적으로 확인하는 미션이었던 것 같습니다.

이를 알 수 있는 부분은 상품 리스트에 대한 입력을
"[콜라,1500,20];[사이다,1000,10]" 처럼 하나의 문자열로 처리하도록 되어있는 점과
동전을 enum으로 구현해두었다는 점입니다.

생각해보아야 했던 것

  1. 클래스와 객체의 책임에 대하여 구분하기
    를 많이 고민하는 시간이었습니다.
    예를 들어서 동전의 개수에 대하여 출력할 때
    필드값 "HashMap(동전,개수)"의 래퍼클래스 (Coins)를 기준으로
  • UI를 분리해야 하기 때문에 인터페이스 부분에서 print() 처리하기
  • 객체에 메시지를 보내는 것이 깔끔하므로 동전리스트 클래스에 print() 메소드가 있고, 이를 호출
    이 둘 중에 어떤 것이 맞는 것인지 가치판단이 어려웠습니다.
    이는 마치, 2주차 중반까지 클린코드에서 "높은 응집도, 낮은 결합도" 라는 키워드를 알기 전에 좋은 코드의 기준을 찾지 못해서 헤매던 그 때와 비슷합니다.
    명확한 기준이 없어 방향성을 잃은 상태로 헤매는 느낌이었습니다.
  1. 중복을 줄이기
    간단하다면 간단한 프로그램이지만, 그럼에도 불구하고 중복을 줄여볼만한 요소가 꽤 있었습니다.
  • 동전, 상품, 투입금액에 모두 "금액"이 있다는 점
  • 동전, 상품에 모두 "개수"가 있다는 점
  • 모든 입력 시 에러가 발생하면, 예외메시지를 출력 후 통과할 때까지 입력을 반복해야 한다는 점
    의 총 3가지 입니다. 더 줄일 수 있는 부분이 있었는지 잘 모르겠습니다. 이후에 다른분들 코드를 읽어봐야 할 것 같습니다.

깨달은 점 (?)

  1. 중복을 줄이는 법 -> 간단한 필드값이라도 클래스화할 수 있다는 점을 배웠습니다.
  2. enum 클래스 -> enum클래스는 동적으로 생성하지 못한다는 것을 다시 한번 명심할 수 있었습니다.
  3. 실력이 진짜 모자라다.

공부해야 할 점

모자란 부분이 더 보이고 공부할 점만 남은 기분입니다.

  1. 에러가 발생하는 상황들에 대해서, 아래같은 코드를 반복적으로 사용 했는데 더 좋은 코드가 있는지 찾아보겠습니다.
public void method1() {
    boolean passed = false;
    while (!passed) {
        passed = test1();
    }

private boolean test1() {
    try { 
        // 시도 1
        return true;
    } catch (Exception e) {
       System.out.println(e.Message())
       return false;
    }
}
  1. 좋은 코드에 대한 방향성
    반복적으로 코드를 치는 시간보다, 좋은 코드란 어떤 것인지에 대해
    조금 더 명확한 방향성을 잡도록 하겠습니다.
    읽다가 완료를 못한 책들 (1. 객체지향의 개념과 오해, 2. 모던자바 인 액션, 3. 클린코드)를 읽겠습니다.

  2. 함수형인터페이스 - 람다식/스트림/참조형
    람다식을 사용할 때, 내부에서 외부변수를 사용하거나 return을 이상하게 활용하려고 할 때가 있습니다.
    이런 경우가 없도록 람다식의 한계에 대해 명확히 찾아보겠습니다.

  3. 콘솔 입력에 대한 테스트 작성
    콘솔에서 입력값을 받아 처리하는 메소드들의 경우,
    테스트에서 입력값을 어떻게 처리해야하는지 몰라
    메소드/함수별 테스트코드를 작성하지 못했습니다.
    방법을 찾아보겠습니다.

profile
코지베어

0개의 댓글