온보딩 problem3 리팩토링

MINJU·2022년 12월 6일
0
post-thumbnail

문제3

지난 PR 셀프 리뷰

마찬가지로 짧은 문제라 리뷰도 짧고 코드도 짧다~
1,2번 문제와 마찬가지로 MVC로 분리할 예정 🐳

기능 정의

[ 기능 ]
- [ ] 3, 6, 9 개수 세기

[ 예외 ]
- [ ] number가 1 ~ 10,000의 범위를 벗어나는 경우

구현

Number 엔티티

사용자 입력을 input으로 받도록 구현했다.

    private Number getUserNumber(){
        while(true){
            try{
                int userNumber = inputView.getUserNumber();
                return new Number(userNumber);
            } catch (IllegalArgumentException e){
                System.out.println(e.getMessage());
            }
        }
    }

기존 온보딩 미션에서 구현했던 것처럼, int number로 관리를 하려다가, MVC 패턴을 그대로 가져가보고 싶어서 Number 엔티티를 만들었다.

public class Number {
    private final int number;

    public Number(int number) {
        Validator.validateRange(number);
        this.number = number;
    }

    public int getNumber() {
        return number;
    }
}

원래는 해당 엔티티 내에서 1 ~ number까지의 수에서 박수를 치는 횟수를 카운트하는 메소드를 구현하고자 했는데, (어찌됐든 number를 건드리는 로직이니까)
그렇게 되면 number = 3일 경우 for문을 통해 1,2,3의 카운트를 다 확인하게 되는데 이 로직에서의 1,2Number라는 엔티티로 관리해야하나?는.. 무한 굴레에 빠져서🙄 그냥 생성자, getter가 있는 단순한 클래스로 만들었다.

그리고 엔티티 내부에 배치하려는 로직을 NumberService로 만들어 구현했다!

package onboarding.problem3.service;

import static onboarding.problem3.util.Constants.*;

public class NumberService {

    public int countThreeSixNine(int number){
        int count = 0;
        String numberString = String.valueOf(number);
        for(int index = 0; index < numberString.length(); index++){
            count += getDigitNumberCount(numberString.charAt(index));
        }
        return count;
    }

    private int getDigitNumberCount(char numberInput){
        int number = numberInput - '0';
        if (isThreeSixNine(number)){
            return 1;
        }
        return 0;
    }

    private boolean isThreeSixNine(int number){
        return number == FIRST_COUNT_INT || number == SECOND_COUNT_INT || number == THIRD_COUNT_INT;
    }
}

해당 Service 엔티티는 넘어 온 숫자각 자릿수를 체크하면서 3,6,9,가 몇 개 있는지 count를 반환하는 로직을 갖고 있다.

이 로직을, Model View Service 모두 접근 가능한 Controller에서 사용하도록 만들어서

    private int getResultCount(int number){
        int count = 0;
        for(int n=1; n<=number; n++){
            count += numberService.countThreeSixNine(n);
        }
        return count;
    }

컨트롤러에서 Model의 number에 접근하고, 그 number를 for문으로 돌리면서, 그 과정에서 만나는 숫자들을 서비스 로직을 활용해 각각 count하는 방식으로..! 구현했다


Service 클래스를 처음으로 도입해봤다!
항상 컨트롤러가 하는 역할과, 서비스가 하는 역할이 분리가 잘 되지 않아서 Service클래스는 구현하지 않고 controller에서 처리하도록 만들었는데,

위의 케이스처럼
유의미한 기능을 하고, Model의 값을 활용하지 않아도 되는 로직이 있으면 Service 로직으로 만들어서 Controllerr에서 활용하도록 만들면 되겠구나! 라는 인사이트를 얻을 수 있었다

혼자하는 리팩토링에서도 많은 것을 배우는 것 같다 🙃

0개의 댓글