TIL

[TIL] 9월 13일

haseung22 2024. 9. 13. 20:16

오늘 계산기과제의 대한 피드백을 받았다.

 

메서드 네이밍과 클래스 책임관련에 대한 피드백이였는데,

<네이밍 관련 피드백>

기존에 인풋 값이 올바른지 체크하고, 올바르다면 해당하는 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

 

GitHub - HaSeung2/calculating-machine

Contribute to HaSeung2/calculating-machine development by creating an account on GitHub.

github.com

 

이번에 피드백을 받고 피드백 받은 부분들을 참고해서 계산기 클래스들을 다시 수정해보면서

클래스들의 분리와 객체지향 프로그래밍에 대해 다시 생각해보는 시간을 가질 수 있었던 것 같다.

앞으로도 코드를 짜면서 각 클래스들의 책임과 역할에 대해 생각하면서 기능들을 구현해야겠다 !