[내일배움캠프] 계산기 구현 - level.02(2)

2024. 9. 6. 11:23내일배움캠프

 아침에 일어나서 어제 작성한 'level.02' 계산기와 다음 단계(level.03)의 계산기 요구사항을 함께 확인하면서 수정할 사항을 파악했다. 실행 흐름에 대한 부분은 'level.01' 계산기에서 비교적 형태를 잡아 놓은 상태였기에 해당 부분은 딱히 수정할 부분이 보이지 않았지만 코드작성 중 'level.01' 계산기와 'level.02' 계산기를 물리적으로 분리하고 싶었기에 'level.01' 계산기에 이미 원하는 기능을 수행하고 있는 메서드가 있음에도 'level.02' 계산기 쪽에 이를 중복 구현한 부분이 존재했다.

 

 의도가 물리적(코드적)으로 분리하고 싶었기에 작성했다고 하지만 'level.03' 계산기 요구사항을 정리해보니 해당 계산기에는 더 많은 중복코드가 생길 것이라 판단 기존의 의도는 접어두고 "필요한 기능이 이미 메서드로 구현이 되어있다면 이를 활용하는 방식으로 코드를 작성해야겠다" 고 생각했다.

 

1. 수정 전

ValidInputData 클래스에 존재하는 중복코드(메서드)
중복코드와 같은 기능을 하는 'Main.validInputCheck()' 메서드

 

 기존에는 물리적으로 분리해 구현하기로 했기에, 이미지의 주석에 적힌 것처럼 중복코드를 작성하였다. 하지만 이는 코드 유지보수에 매우 비효율적이라 판단한 것과 이후에 'level.03' 계산기를 구현함에도 맞지 않는 방식이라 생각해 수정을 결정하게 되었다.

 

 

2. 수정 후

중복코드 제거 및 'Main.validInputCheck()' 재사용

 

 이미 'ValidInputData' 생성에는 "입력 값의 유효성을 판단" 한다는 역할과 의도를 부여했기에 'level.02' 계산기에서 입력 값의 유효성을 판단하는 메서드를 가져다 사용할 수 있도록 메서드를 남겨두었고 해당 메서드의 수행부에 'Main.validInputCheck()' 메서드를 재사용하는 방식으로 코드를 수정하였다. "어? 그냥 수행 로직을 작성한 클래스에 바로 메서드를 사용하면 되는 거 아닌가?" 라는 생각도 들었으나, 그렇게 되면 추후에 유효성에 대한 부분을 수정시 계산기를 종료 명령어 입력에 대한 유효성 검사 메서드 수정은 'ValidInputData' 클래스에서 수정하고 연산 입력 값에 대한 유효성 검사는 'CalculatorApp' 에서 수정하게 되어 유지보수에 혼선을 줄 수 있다.

 

결국 "입력 값에 대한 유효성 검사를 수행하는 메서드 수정은 ValidInputData' 에서!" 라는 의도를 지킬 수 있도록 위의 이미지와 같은 방법으로 코드를 수정하게 되었다.

 

 

3. 마무리

 사실 중복코드에 대한 부분을 제외하고도 수정하고 싶은 부분으 더 존재한다. 현재 예외 처리를 모두 출력문(System.out.print*)과 조건문(if)을 통해 처리하고 있다. 그래서 관련 메서드의 반환 타입을 'boolean' 으로 하여 구현하였는데...이게 유지보수에 굉장히 불편하다. 작성 당시에는 기억이나지만 지금보다 작성코드가 더 많아지고 시간이 지나고 다시 코드를 수정하게 된다면 내가 어떤 경우에 'true' 를 반환하고 'fasle' 를 반환하는지 기억이 안나 해당 메서드를 다시 분석하고 있을 것이다. 이는 유지보수성을 낮게 만드는 요인으로 판단 예외처리에는 기존에 방식을 버리고 'CustomExceptio' 과 try-catch 문' 을 활용해 코드를 수정하고자 한다.

 

또한 시스템에서 사용자에게 실행에 대한 설명을 해주는 'SystemMessage' 도 전부 출력문에 작성 되어있는데 추후에 시스템 메시지를 수정하고 싶다면 해당 출력문을 찾아야하고 또 중복으로 사용된 경우 전부 찾아서 수정을 진행하게 된다. 이 또한 유지보수성이 떨어지게 하므로 'Enum' 을 활용해 시스템 메시지나 고정적으로 사용되는 값들을 관리하고 객체나 클래스에서 이를 가져다 사용하는 방식으로 구성을 할 필요가 있다.

 

"그러면 그냥 지금 수정하면 되잖아?" 라고 할 수 있겠지만 이미 'level.03' 계산기 요구사항에 'Enum' 을 활용해야 한다는 내용이 존재한다. 그래서 'level.03' 계산기를 구현한 다음, 'level.03' 계산기에도 반영되지 않은 부분은 개인적으로 'level.04' 계산기에 수정사항을 반영하여 구현할 생각이기에 현 상태를 유지하게 되었다.