[Java]Simple Refactoring
업데이트:
Simple Refactoring(Test-driven Development)
아래의 기준으로 만들어진 코드를, 좀 더 잘 코딩 된 형식으로 변경(Refactoring) 해보려 합니다.
[문제]
- 쉼표나 콜론을 구분자로 가지는 문자열을 입력 받음
- 구분자를 기준으로 분리한 각 숫자의 합을 반환
최초로 작성 된 코드 예제 입니다. 아래의 구현 사항을 좀 더 나은 코드로 변경 해 보겠습니다.
public class StringCalculator {
public static int splitAndSum(String text) {
int result = 0;
if (text == null || text.isEmpty()) {
result = 0;
} else {
String[] values = text.split(",|:");
for (String value : values) {
result += Integer.parseInt(value);
}
}
return result;
}
}
첫번째, 한 단계의 들여쓰기(indent)만 한다.
else 문 안에 있는 logic(sum)을 함수로 만들어, 가독성을 높힌다.
public class StringCalculator {
public static int splitAndSum(String text) {
int result = 0;
if (text == null || text.isEmpty()) {
result = 0;
} else {
String[] values = text.split(",|:");
result = sum(values);
}
return result;
}
private static int sum(String[] values) {
int result = 0;
for (String value : values) {
result += Integer.parseInt(value);
}
return result;
}
}
두번째, else를 하지 않는다.
return을 사용하여, else를 하지 않도록 한다.
public class StringCalculator {
public static int splitAndSum(String text) {
if (text == null || text.isEmpty()) {
return 0;
}
String[] values = text.split(",|:");
return sum(values);
}
private static int sum(String[] values) {
int result = 0;
for (String value : values) {
result += Integer.parseInt(value);
}
return result;
}
}
세번째, 메서드가 한가지 일만 하게 한다.
parseInt와 sum을 각 메서드에서 하게 분리 한다.
public class StringCalculator {
public static int splitAndSum(String text) {
if (text == null || text.isEmpty()) {
return 0;
}
String[] values = text.split(",|:");
int[] numbers = toInts(values);
return sum(numbers);
}
private static int[] toInts(String[] values) {
int[] result = new int[10];
int i = 0;
for (String value : values) {
result[i++] = Integer.parseInt(value);
}
return result;
}
private static int sum(int[] values) {
int result = 0;
for (int value : values) {
result += value;
}
return result;
}
}
네번째, 로컬 변수를 지양 한다.
전역 변수를 클래스 내에서 임의로 변경하면, 목적을 알 수 없다. 그러므로 전역 변수를 메서드의 인자 값으로 넘거 지역변수로 사용 한다.
public class StringCalculator {
public static int splitAndSum(String text) {
if (text == null || text.isEmpty()) {
return 0;
}
return sum(toInts(text.split(",|:")));
}
private static int[] toInts(String[] values) {
int[] result = new int[10];
int i = 0;
for (String value : values) {
result[i++] = Integer.parseInt(value);
}
return result;
}
private static int sum(int[] values) {
int result = 0;
for (int value : values) {
result += value;
}
return result;
}
}
다섯번째, Compose Method 패턴(추상화 정도가 같아야 함) 적용 한다.
null 체크 및 split 부분이 무엇을 의미하는지 추상화 한다.
public class StringCalculator {
public static int splitAndSum(String text) {
if (isBlank(text)) {
return 0;
}
return sum(toInts(split(text)));
}
private static boolean isBlank(String text) {
if (text == null || text.isEmpty()) {
return true;
}
return false;
}
private static String[] split(String text) {
return text.split(",|:");
}
private static int[] toInts(String[] values) {
int[] result = new int[10];
int i = 0;
for (String value : values) {
result[i++] = Integer.parseInt(value);
}
return result;
}
private static int sum(int[] values) {
int result = 0;
for (int value : values) {
result += value;
}
return result;
}
}
Reference
- https://www.youtube.com/watch?v=MRarMhbIdcQ