Выбрать главу

Эта глава была посвящена механике качественного написания функций. Если вы будете следовать этим правилам, ваши функции будут короткими, удачно названными и хорошо организованными. Но никогда не забывайте, что ваша настоящая цель — «рассказать историю» системы, а написанные вами функции должны четко складываться в понятный и точный язык, который поможет вам в этом.

Листинг 3.7. SetupTeardownIncluder.java

package fitnesse.html;

import fitnesse.responders.run.SuiteResponder;

import fitnesse.wiki.*;

public class SetupTeardownIncluder {

  private PageData pageData;

  private boolean isSuite;

  private WikiPage testPage;

  private StringBuffer newPageContent;

  private PageCrawler pageCrawler;

  public static String render(PageData pageData) throws Exception {

    return render(pageData, false);

  }

  public static String render(PageData pageData, boolean isSuite)

    throws Exception {

    return new SetupTeardownIncluder(pageData).render(isSuite);

  }

  private SetupTeardownIncluder(PageData pageData) {

    this.pageData = pageData;

    testPage = pageData.getWikiPage();

    pageCrawler = testPage.getPageCrawler();

    newPageContent = new StringBuffer();

  }

  private String render(boolean isSuite) throws Exception {

    this.isSuite = isSuite;

    if (isTestPage())

      includeSetupAndTeardownPages();

    return pageData.getHtml();

  }

  private boolean isTestPage() throws Exception {

    return pageData.hasAttribute("Test");

  }

  private void includeSetupAndTeardownPages() throws Exception {

    includeSetupPages();

    includePageContent();

    includeTeardownPages();

    updatePageContent();

  }

  private void includeSetupPages() throws Exception {

    if (isSuite)

      includeSuiteSetupPage();

    includeSetupPage();

  }

  private void includeSuiteSetupPage() throws Exception {

    include(SuiteResponder.SUITE_SETUP_NAME, "-setup");

  }

  private void includeSetupPage() throws Exception {

    include("SetUp", "-setup");

  }

  private void includePageContent() throws Exception {

    newPageContent.append(pageData.getContent());

  }

  private void includeTeardownPages() throws Exception {

    includeTeardownPage();

    if (isSuite)

      includeSuiteTeardownPage();

  }

  private void includeTeardownPage() throws Exception {

    include("TearDown", "-teardown");

  }

  private void includeSuiteTeardownPage() throws Exception {

    include(SuiteResponder.SUITE_TEARDOWN_NAME, "-teardown");

  }

  private void updatePageContent() throws Exception {

    pageData.setContent(newPageContent.toString());

  }

  private void include(String pageName, String arg) throws Exception {

    WikiPage inheritedPage = findInheritedPage(pageName);

    if (inheritedPage != null) {

      String pagePathName = getPathNameForPage(inheritedPage);

      buildIncludeDirective(pagePathName, arg);

    }

  }

  private WikiPage findInheritedPage(String pageName) throws Exception {

    return PageCrawlerImpl.getInheritedPage(pageName, testPage);

  }

  private String getPathNameForPage(WikiPage page) throws Exception {

    WikiPagePath pagePath = pageCrawler.getFullPath(page);

    return PathParser.render(pagePath);

  }

  private void buildIncludeDirective(String pagePathName, String arg) {

    newPageContent

      .append("\n!include ")

      .append(arg)

      .append(" .")

Листинг 3.7 (продолжение)

      .append(pagePathName)

      .append("\n");

  }

}

Литература

[KP78]: Kernighan and Plaugher, The Elements of Programming Style, 2d. ed., McGraw-Hill, 1978.

[PPP02]: Robert C. Martin, Agile Software Development: Principles, Patterns, and Practices, Prentice Hall, 2002.

[GOF]: Design Patterns: Elements of Reusable Object Oriented Software, Gamma et al., Addison-Wesley, 1996.

[PRAG]: The Pragmatic Programmer, Andrew Hunt, Dave Thomas, Addison-Wesley, 2000.

[SP72]: Structured Programming, O.-J. Dahl, E. W. Dijkstra, C. A. R. Hoare, Academic Press, London, 1972.

Глава 4. Комментарии