마찬가지로 짧은 문제라 리뷰도 짧고 코드도 짧다~
1,2번 문제와 마찬가지로 MVC로 분리할 예정 🐳
[ 기능 ]
- [ ] 3, 6, 9 개수 세기
[ 예외 ]
- [ ] number가 1 ~ 10,000의 범위를 벗어나는 경우
사용자 입력을 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
,2
도 Number
라는 엔티티로 관리해야하나?는.. 무한 굴레에 빠져서🙄 그냥 생성자, 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에서 활용하도록 만들면 되겠구나! 라는 인사이트를 얻을 수 있었다
혼자하는 리팩토링에서도 많은 것을 배우는 것 같다 🙃