• [CleanCode] 함수의 추상화 수준이란?
    개발공부 2022. 3. 3. 14:52
    반응형

     오랜만에 CleanCode를 다시 읽어보고 있는데 함수의 추상화 수준에서 책 읽기를 멈추고 3번 다시 읽었다. 아무래도 책의 추상화 수준이 높은 단계 였던 것 같다. "메서드는 한 가지만 해라!"라는 말은 오해하기가 쉽다. 그래서 메서드가 한 가지를 하는지 판단하는 기준으로 다른 이름의 함수 추출해보기, 추상화 수준과 내려가기 규칙을 설명하지만 이해하고 실무에 적용하기 힘들다라니..? 내 독해력이 그 사이 떨어진건가 싶었다.

    -------------------------

    CleanCode ( 40 페이지~46 페이지 )

     

    1. 추상화 수준의 이해

    함수를 만드는 이유는 큰 개념을 다음 추상화 수준에서 여러 단계로 나눠 수행하기 위해서가 아니던가. - CleanCode 

     책의 45page에는 우리가 함수를 만드는 이유가 나와있다. 그런데 추상화 수준이라는게 빨리 이해되지 않았다. 책에서 말하는 우리가 함수를 만드는 이유를 도식화 하면 다음과 같은 그림이 된다.

    함수 도식화

     

     왼쪽의 { A B C } 기능을 하는 큰 개념을 분해하여 A, B, C 기능을 만들었다. 그리고 나눠진 3가지의 기능을 단계 별로 수행하는 {}를 만들고 연결시켜 줬다.  결국, A, B, C가 하나의 추상화 수준이 되는 것이다. 

    추상화 수준의 도식화

    2. 추상화 수준의 분류

     함수를 만드는 이유와 추상화 수준이라는 것이 어느 정도 이해가 됐다. 다음으로 우리는 추상화 수준을 판단하는 기준을 알아야한다. 45page의 첫 번째 문단에 다음과 같은 글이 있다.

     목록 3-3은 한 가지만 하는가? 아니면 세 가지를 하는가? 위에서 언급하는 세 단계는 지정된 함수 이름 아래에서 추상화 수준이 하나다. 함수는 간단한 TO문단으로 기술할 수 있다.
    •  To renderPageWithSetupsAndTeardowns, 페이지가 테스트 페이지인지 확인 후 테스트 페이지라면 설정 페이지와 해제 페이지를 넣는다. 테스트 페이지든 아니든 페이지를 HTML로 렌더링한다.
    • 목록 3-3 Code
    public static String renderPageWithSetupsAndTeardowns(
    	PageData pageData, 
    	boolean isSuite
    ) throws Exception {
    	if (isTestPage(pageData)) {
        		includeSetupAndTeardownPages(pageData, isSuite);
        	}
    	return pageData.getHtml();
    }

     기능으로만 따지면 1. 테스트 페이지인지 확인, 2. 설정 페이지와 해제 페이지를 넣음, 3. HTML 렌더링 이렇게 세 가지로 분류가 가능하다. CleanCode를 읽어보면 함수는 하나만 잘해야 한다고 했는데 세가지 기능을 한다. 그런데 "이걸 더이상 쪼개면 의미가 없을거 같은데...." 이런 상황에서 추상화 수준으로 확인 가능하다.

     

     그럼 추상화 수준이 같다는 것은 무엇인가? 책의 46페이지에 "...추상화 수준이 아주 높다. 반면, ... 추상화 수준이 중간이다. 그리고 ...같은 코드는 추상화 수준이 아주 낮다."라는 말이 쓰여있다. 결국, 추상화 수준은 높음, 중간, 낮음으로 분류 할 수 있다.

     

     추상화 수준을 분류하는 기준은 무엇인가? 동일하게 46페이지에 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다고 했다. 함수의 추상화 수준은 다음 단계로 갈수록 낮아진다. 그리고 이 수준이 같아야 함수가 하나의 일을 한다고 할 수 있다.

     

    도식화 해보면 다음과 같다.

     

     

    추상화 수준이 낮은 C를 추상화 수준이 높은 C로 변경하는 이유는 다음과 같은 코드를 생각해볼 수 있다.

     

    public void setData(Integer flag){
    	if (flag!=null && flag==5) {
        		this.data=data;
        	}
    }

    final static Integer SAVE_DATA = 5;
    
    public void setData(Integer flag){
    	if (judgeFlag(flag)) {
        		this.data = data;
        	}
    }
    
    private boolean judgeFlag(Integer flag){
    	return flag != null && flag == SAVE_DATA;
    }

     

    이제 추상화 수준이 높다, 낮다는 구분이 가능해졌다. 하지만 추상화 수준이 중간이라는 것은 무엇인가? 높지도 않고 낮지도 않은상태인데 A-1 또는 A-1-1은 추상화 수준이 중간인가? 아니다 A-1과 A-1-1은 추상화 수준이 높다고 할 수 있다.

     

     추상화 수준이 중간이라는 것은 같은 추상화 수준을 가진 함수끼리의 연관을 말한다. 그러니까 저자인 로버트 C 마틴은 추상화 수준이 높지도 낮지도 않은 중간은 지양한다고 말하는것 같다.

     

     도식화 해보면 다음과 같다.

    추상화 수준이 중간인 상태 도식화

     

    3. 결론

     "추상화 수준은 높음, 중간, 낮음으로 구분 할 수 있고 추상화 수준을 높음으로 유지하고 추상화 수준이 중간은 지양한다. "라는 유토피아 코딩을 꿈꾸며 우리는 추상화 수준이라는 커뮤니케이션 스킬을 얻었다.

    반응형

    댓글

Designed by Tistory.