오늘 계산기과제의 대한 피드백을 받았다.
메서드 네이밍과 클래스 책임관련에 대한 피드백이였는데,
<네이밍 관련 피드백>
기존에 인풋 값이 올바른지 체크하고, 올바르다면 해당하는 operator를 변환해서 리턴하도록하는 두가지의 일을
수행하는 메서드를 단순히 setUpOperation이라고 지었었는데 이름만 보았을 땐 메서드에서
어떤 동작을 수행하는지 알기 어려우며, 이를 두개의 메서드로 분리하거나 이름을 바꾸는게 좋다는
피드백을 받았고 객체지향에서 메서드는 <행위>를 표현하므로 동사형으로 이름을 짓는게 좋다는 피드백을 받았다.
네이밍 관련해서는 평소에도 어떤 이름으로 지을지 고민했었는데 앞으로도 좀 더 고민해봐야겠다.
<클래스 책임>
우선 `Reg` enum은 `CalculatorApp` 내에 있는 게 아니라 외부 패키지로 분리하는 것이 필요해보입니다.
또한 가장 중요한 부분으로, `CalculatorApp`에서 하고 있는 책임을 다른 클래스들에게 위임할 필요가 있습니다. `ArithmeticCalculator`와 `CalculatorApp`이 강하게 결합되어 있어서 SRP이
위반되어 있는데요. 그 이유는 지금 `ArithmeticCalculator`가 단순히 데이터를 담고 있는
데이터 홀더의 역할만 하고 있고, 연산과 관련된 로직은 `CalculatorApp`에 존재하기 때문입니다.
`ArithmeticCalculator` 가 가지고 있는 멤버 변수인 `arrayList` 를 조작하는 것은
`ArithmeticCalculator`의 책임이 되어야 하기 때문입니다.
자신이 가지고 있는 멤버 변수와 직접적으로 관련되어 있는 동작은, 그 클래스 당사자가 하는 것이 자연스럽습니다.
라는 피드백을 받았다. 그래서 이 피드백의 내용을 바탕으로 클래스들이 수행하는 역할을 수정하였다.
기존에는 CalculatorApp 클래스에서 입력 받아온 숫자와 연산기호가 알맞은지 검사, 예외처리 후 ArithmeticCalculator의 메서드를 호출하는 일까지 수행했었다면
이제는 검사와 예외처리는 Reg 클래스에서, 리스트와 관련된 일들은 AirthmeticCalculator 클래스에서 수행하도록 바꿔봤다.
아래는 검사와 예외처리를 수행하는 enum 클래스이다.
import calculatingMachine.lv3.exception.BadInputException;
public enum Reg {
OPERATION_REG("[+\\-*/]"),
NUMBER_REG("^[0-9]*$"),
DOUBLE_REG("^([0-9]{1}\\d{0,2}|0{1})(\\.{1}\\d{0,1})*$");
private final String reg;
Reg(String reg) {
this.reg = reg;
}
public String getReg(){
return reg;
}
public static boolean matches(String number) throws Exception{
if(number.matches(NUMBER_REG.getReg()) || number.matches(DOUBLE_REG.getReg())){
return true;
}
throw new BadInputException("정수, 실수");
}
public static boolean matchesOperation(String operation) throws Exception{
if(operation.matches(OPERATION_REG.getReg())){
return true;
}
throw new BadInputException("연산 기호");
}
public static boolean matcheNumbers(String targetNumber, String changeValue) throws Exception{
if(targetNumber.matches(NUMBER_REG.getReg()) && changeValue.matches(DOUBLE_REG.getReg())){
return true;
}
else{
throw new BadInputException("정수");
}
}
}
다른 클래스들도 필드 멤버에 맞게 일들을 수행하도록 수정하였지만 너무 길어서 깃헙 링크를 올린다.
https://github.com/HaSeung2/calculating-machine
이번에 피드백을 받고 피드백 받은 부분들을 참고해서 계산기 클래스들을 다시 수정해보면서
클래스들의 분리와 객체지향 프로그래밍에 대해 다시 생각해보는 시간을 가질 수 있었던 것 같다.
앞으로도 코드를 짜면서 각 클래스들의 책임과 역할에 대해 생각하면서 기능들을 구현해야겠다 !
'TIL' 카테고리의 다른 글
SRP - 단일 책임 원칙 (2) | 2024.09.25 |
---|---|
[TIL] 9월 19일 (2) | 2024.09.19 |
[TIL] 숫자 야구 게임 만들기 (2) | 2024.09.12 |
[TIL] 계산기 3레벨 마무리 (1) | 2024.09.10 |
[TIL] 계산기 3레벨 해보기 (6) | 2024.09.09 |