작게 만들어라!

간결한 함수 작성하기

[code1]

public static String testableHtml(
   PageData pageData,
   boolean includeSuiteSetup
) throws Exception {
   WikiPage wikiPage = pageData.getWikiPage();
   StringBuffer buffer = new StringBuffer();
   if (pageData.hasAttribute("Test")) {
       if (includeSuiteSetup) {
           WikiPage suiteSetup =
               PageCrawlerImpl.getInheritedPage(
                   SuiteResponder.SUITE_SETUP_NAME, wikiPage
               );
           if (suiteSetup != null) {
               WikiPagePath pagePath =
                   suiteSetup.getPageCrawler().getFullPath(suiteSetup);
               String pagePathName = PathParser.render(pagePath);
               buffer.append("!include -setup .")
                   .append(pagePathName)
                   .append("\\n");
           }
       }
       WikiPage setup =
           PageCrawlerImpl.getInheritedPage("SetUp", wikiPage);
       if (setup != null) {
           WikiPagePath setupPath =
               wikiPage.getPageCrawler().getFullPath(setup);
           String setupPathName = PathParser.render(setupPath);
           buffer.append("!include -setup .")
               .append(setupPathName)
               .append("\\n");
       }
   }
   buffer.append(pageData.getContent());
   if (pageData.hasAttribute("Test")) {
       WikiPage teardown =
           PageCrawlerImpl.getInheritedPage("TearDown", wikiPage);
       if (teardown != null) {
           WikiPagePath tearDownPath =
               wikiPage.getPageCrawler().getFullPath(teardown);
           String tearDownPathName = PathParser.render(tearDownPath);
           buffer.append("\\n")
               .append("!include -teardown .")
               .append(tearDownPathName)
               .append("\\n");
       }
       if (includeSuiteSetup) {
           WikiPage suiteTeardown =
               PageCrawlerImpl.getInheritedPage(
                   SuiteResponder.SUITE_TEARDOWN_NAME,
                   wikiPage
               );
           if (suiteTeardown != null) {
               WikiPagePath pagePath =
                   suiteTeardown.getPageCrawler().getFullPath(suiteTeardown);
               String pagePathName = PathParser.render(pagePath);
               buffer.append("!include -teardown .")
                   .append(pagePathName)
                   .append("\\n");
           }
       }
   }
   pageData.setContent(buffer.toString());
   return pageData.getHtml();
}

⇒ 딱 봐도 함수가 길다.

[code2]

다음은 위 코드를 9줄로 리펙터링 한 내용이다.

public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throws Exception {
        boolean isTestPage = pageData.hasAttribute("Test");
        if (isTestPage){
            WikiPage testPage = pageData.getWikiPage();
            StringBuffer newPageContent = new StringBuffer();
            includeSetupPages(testPage, newPageContent, isSuite);
            newPageContent.append(pageData.getContent());
            includeTeardownPages(testPage, newPageContent, isSuite);
            pageData.setContent(newPageContent.toString());
        }
        return pageData.getHtml();
    }

→isTestPage 는 pageData에서 Test라는 속성을가져와서, isTestPage 가 true 일때, Wikipage 를pageData에서 가져와서 includeSetupPages 에 전달해주고… newPageContent 에 내용을 append 해주는 내용, includeSetpuPage나, includeTeardownPages 등등 이것도 하는 일이 많다.

[code3]

public static String renderPageWithSetupsAndTeardowns( PageData pageData, boolean isSuite) throws Exception { 
   if (isTestPage(pageData)) 
   	includeSetupAndTeardownPages(pageData, isSuite); 
   return pageData.getHtml();
}

⇒작게 쪼개서 함수 내 추상화 수준을 동일하게 맞춘다.

⇒페이지가 테스트 페이지인지 확인한 후 테스트 페이지라면 설정 페이지와 해제 페이지를 넣는다. 테스트 페이지든 아니든 페이지를 HTML로 렌더링한다.