Чистый код. Создание, анализ и рефакторинг (Мартин) - страница 32


Листинг 3.1. HtmlUtil.java (FitNesse 20070619)

>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();

>}

Удалось ли вам разобраться с функцией за три минуты? Вероятно, нет. В ней происходит слишком много всего, и притом на разных уровнях абстракции. Загадочные строки и непонятные вызовы функций смешиваются в конструкциях if двойной вложенности, к тому же зависящих от состояния флагов.

Но после выделения нескольких методов, переименований и небольшой реструктуризации мне удалось представить смысл этой функции в девяти строках листинга 3.2. Посмотрим, удастся ли вам разобраться в ней за следующие три минуты.