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

>  ...

>  }

>  private String fName;

>  private Vector fTests= new Vector(10);

>  public TestSuite() {

>  }

>  public TestSuite(final Class theClass) {

>   ...

>  }

>  public TestSuite(Class  theClass, String name) {

>  ...

>  }

>  ... ... ... ... ...

>}

Зависимые функции. Если одна функция вызывает другую, то эти функции должны располагаться вблизи друг от друга по вертикали, а вызывающая функция должна находиться над вызываемой (если это возможно). Тем самым формируется естественная структура программного кода. Если это правило будет последовательно соблюдаться, читатели кода будут уверены в том, что определения функций следуют неподалеку от их вызовов. Для примера возьмем фрагмент FitNesse из листинга 5.5. Обратите внимание на то, как верхняя функция вызывает нижние, и как они, в свою очередь, вызывают функции более низкого уровня. Такая структура позволяет легко найти вызываемые функции и значительно улучшает удобочитаемость всего модуля.


Листинг 5.5. WikiPageResponder.java

>public class WikiPageResponder implements SecureResponder {

>  protected WikiPage page;

>  protected PageData pageData;

>  protected String pageTitle;

>  protected Request request;

>  protected PageCrawler crawler;


>  public Response makeResponse(FitNesseContext context, Request request)

>    throws Exception {

>    String pageName = getPageNameOrDefault(request, "FrontPage");

>    loadPage(pageName, context);

>    if (page == null)

>      return notFoundResponse(context, request);

>    else

>      return makePageResponse(context);

>  }


>  private String getPageNameOrDefault(Request request, String defaultPageName)

>  {

>    String pageName = request.getResource();

>    if (StringUtil.isBlank(pageName))

>      pageName = defaultPageName;

>    return pageName;

>  }


>  protected void loadPage(String resource, FitNesseContext context)

>    throws Exception {

>    WikiPagePath path = PathParser.parse(resource);

>    crawler = context.root.getPageCrawler();

>    crawler.setDeadEndStrategy(new VirtualEnabledPageCrawler());

>    page = crawler.getPage(context.root, path);

>    if (page != null)

>      pageData = page.getData();

>  }


>  private Response notFoundResponse(FitNesseContext context, Request request)

>    throws Exception {

>    return new NotFoundResponder().makeResponse(context, request);

>  }


>  private SimpleResponse makePageResponse(FitNesseContext context)

>    throws Exception {

>    pageTitle = PathParser.render(crawler.getFullPath(page));

>    String html = makeHtml(context);


>    SimpleResponse response = new SimpleResponse();