Ch3 부분에서 크게 2가지 부분에 집중해서 리팩토링을 진행했다.
함수 내 모든 문장이 같은 추상화 수준에 있어야 한다.
2차원 점 두개를 사용하여 그래프를 그리는 함수를 정의한다고 가정하자.
public class ResultView {
private static CoordinateDTO coordinateDTO1;
private static CoordinateDTO coordinateDTO2;
private static StringBuilder sb;
public static void printGraph(Line coordinates) {
List<CoordinateDTO> coordinateDTOList = CoordinateDTO.getCoordinateDTOListFrom(coordinates);
coordinateDTO1 = coordinateDTOList.get(0);
coordinateDTO2 = coordinateDTOList.get(1);
sb = new StringBuilder();
appendYAxisAndCoordinatesToSb();
appendXAxisToSb();
System.out.println(sb.toString());
sb = null;
}
private static void appendYAxisAndCoordinatesToSb(){
...
}
private static void appendXAxisToSb() {
...
}
위 코드는 추상화 수준이 뒤죽박죽 섞여 있는 상태이다.
메서드로 한단계 더 추상화한 appendYAxisAndCoordinatesToSb(), appendXAxisToSb()가 다른 추상화되지 않은 코드들과 섞여 있다.
위 코드에서 의미있는 단위로 메서드를 추출하여 추상화한다면 아래와 같이 작성할 수 있다.
public class ResultView {
private static CoordinateDTO coordinateDTO1;
private static CoordinateDTO coordinateDTO2;
private static StringBuilder sb;
public static void printGraph(Line coordinates) {
initCoordinateDTOs(coordinates);
initStringBuilder();
appendYAxisAndCoordinatesToSb();
appendXAxisToSb();
printResultFromSb();
emptyOutSb();
}
private static void initCoordinateDTOs(Line coordinates) {
List<CoordinateDTO> coordinateDTOList = CoordinateDTO.getCoordinateDTOListFrom(coordinates);
coordinateDTO1 = coordinateDTOList.get(0);
coordinateDTO2 = coordinateDTOList.get(1);
}
private static void initStringBuilder() {
sb = new StringBuilder();
}
private static void appendYAxisAndCoordinatesToSb(){
...
}
private static void appendXAxisToSb() {
...
}
private static void printResultFromSb() {
System.out.println(sb.toString());
}
private static void emptyOutSb() {
sb = null;
}
이제 printGraph() 메서드 내의 추상화 수준이 동일해졌다.
그 결과, printGraph()는 요구 사항의 명세서와 같은 형태를 가지게 되었다.
클린 코드에서는 독자가 알고 있는 프로그래밍 언어와 관계없이도 읽힐 수 있는 코드를 만들 것을 권했다.
확실히 추상화 수준이 올라가면 메서드 하나가 단락처럼 읽힌다는 것을 느꼈다.