리팩토링(Refactoring)?
현재까지 대부분의 애플리케이션 구현과정을 돌이켜보면 요구사항을 만족하는 코드를 구현하면 개발을 완료했었다. 하지만 요구사항을 만족하는 코드를 구현했다고 개발이 완료된 것이 아니다. 소스코드를 구현했으면 반드시 뒤따라야 하는 과정이 중복을 제거하고, 읽기 좋은 코드를 구현하기 위해 구조를 변경하는 리팩토링이다.
리팩토링이란 소스코드의 가독성을 높이고 유지보수를 편하게 하기 위해 소스코드의 구조를 변경하는 것을 의미한다. 따라서, 아래와 같은 요구사항에 맞춰서 리팩토링을 진행해보자.
- 메서드가 한가지 책임만 가지도록 구현하자.
- 인덱트(indent, 들여쓰기) 깊이를 1단계로 유지하자. 인덴트는 while 문과 if문을 사용할 경우 인덴트 깊이가 1씩 증가한다. 예를 들면, 아래 코드의 인덴트 깊이는 2이다.
void someMethod() {
while(true) {
if(true) {
}
}
}
- else를 사용하지 말자. 프로그래밍을 구현할 때 else를 사용하지 않고 프로그래밍 하는 것은 가능하다.
리팩토링을 위한 예제
- 문자를 구분자로 분리한 후 각 숫자의 합을 구해 반환
- 쉼표(,) 또는 클론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 후 숫자의 합 반환
- 문자열 계산기에 음수를 전달하는 경우 RuntimeException으로 예외 처리
요구사항만 보면 그리 복잡하지 않다. 아래와 같은 코드를 작성했다.
public class StringCalculator {
int add( String str ) {
String[] array = null;
int result = 0;
if( str == null || str.equals(" ")) {
return 0;
}
array = str.split(",|:");
for( String i : array ) {
if( Integer.parseInt(i) < 0 ) {
throw new RuntimeException();
}
result += Integer.parseInt(i);
}
return result;
}
}
위 코드를 아래와 같이 리팩토링 했다.
극단적으로 리팩토링을 했지만, 개인적으로 깔끔하고, 읽기 좋은 코드로 구현되었다.
public class StringCalculator_2 {
int add( String str ) {
if( isBlank(str) ) {
return 0;
}
return sum(toInts(split(str)));
}
private boolean isBlank(String str) {
return str == null || str.equals(" ");
}
private String[] split(String str) {
String[] array = str.split(",|:");
return array;
}
private int[] toInts( String[] values ) {
int[] numbers = new int[values.length];
for (int i = 0; i < values.length; i++) {
int number = toPositive(values[i]);
numbers[i] = number;
}
return numbers;
}
private int toPositive(String value ) {
int number = Integer.parseInt(value);
if( number < 0 ) {
throw new RuntimeException();
}
return number;
}
private int sum(int[] numbers) {
int result = 0;
for( int number : numbers ) {
result += number;
}
return result;
}
}
'Test Code' 카테고리의 다른 글
콘솔 기반 UI 테스트를 어떻게 해야할까? (0) | 2023.10.20 |
---|---|
[JUnit] 테스트하기 어려운 코드를 테스트 하기 쉬운 코드로 (0) | 2023.04.22 |
[JUnit] AssertJ 라이브러리의 문자열 테스트와 숫자 테스트의 메서드 (0) | 2023.04.14 |
[JUnit] 스트림(Stream)을 이용한 JUnit기반 테스트 코드 작성 (0) | 2023.04.14 |
[JUnit] assertj 활용한 테스트 코드 작성 (0) | 2023.04.12 |
댓글