小课堂Week12 Clean Code Part1

小课堂Week12

Clean Code Part1

今天的主题是函数,让我们看一个函数,找一找其中的"不整洁"。
我们也根据这段代码,讨论下对于整洁代码的两个重要原则。

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

原则1:短小

函数的第一个规则是要短小。第二条规则是还要更加短小。Uncle Bob根据他40多年的编码经验,提出函数20行封顶最佳。
这个目标比较高,从实际项目看,目前最主流的一些开源库,函数一般控制在200以内。
最关键的问题是,如何才能达到这个目标呢。方法是对代码进行分拆。
肯定不是简单对代码进行切分,因为这样会破坏可读性。
如何分拆,就是我们要提的第二个原则。

原则2:只做一件事

只做一件事,指的是函数只是做了该函数名下同一抽象层次上的步骤。
让我们用中文来描述下这段代码(部分):

获取wikiPage
初始化buffer
  
如果是测试页面
  当开关打开
    初始化suiteSetup的页面
    如果初始化成功
      获取页面名称
      页面名称放入buffer
    始化化setup的页面
      获取页面名称
      页面名称放入buffer
将页面content放入buffer
...  

很明显,结构很复杂,不好理解,但归根到底是其中包含了几个抽象层次的步骤。
比如:获取页面名称和获取wikiPage就不是在一个层次上。
我们的方法就是把不同层次的内容拆分出来。

如下是拆分后的结果,是不是短了很多,也容易理解了很多。

获取wikiPage
初始化buffer

生成setup的信息

将页面content放入buffer
生成teardown的信息
返回页面的html

那拆分出来的内容呢,可以作为另外一个函数。

最后,我们可以把函数做的这件事,要To...then的语法逻辑完整的描述出来。

为了获取测试页面的html,

  我们获取wikiPage
  初始化buffer
  生成setup的信息
  将页面content放入buffer
  生成teardown的信息
  返回页面的html

小结

今天介绍了两个非常重要的原则,第一是短小,第二是只做一件事,这也是写出整洁代码最为关键的两个原则。其实,写好代码和写好文章,道理是想通,把平时我们的日常的表达方式套用到程序中去,会帮助我们更快的获得“整洁感”

posted @ 2016-10-29 10:12  哎哟慰  阅读(182)  评论(0编辑  收藏  举报