클린 코드 적용하기 - Ch3. 함수

Jaden Kim·2021년 9월 26일
0

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()는 요구 사항의 명세서와 같은 형태를 가지게 되었다.

클린 코드에서는 독자가 알고 있는 프로그래밍 언어와 관계없이도 읽힐 수 있는 코드를 만들 것을 권했다.
확실히 추상화 수준이 올라가면 메서드 하나가 단락처럼 읽힌다는 것을 느꼈다.

0개의 댓글