zoukankan      html  css  js  c++  java
  • 小课堂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("
    ");
          }
        }
        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("
    ");
        }
      }
      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("
    ").append("!include -teardown .").append(tearDownPathName).append("
    ");
        }
              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("
    ");
                 }
              }
          }
      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
    

    小结

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

  • 相关阅读:
    Kubernetes 系列(八):搭建EFK日志收集系统
    Kubernetes 系列(七):持久化存储StorageClass
    Kubernetes 系列(六):持久化存储 PV与PVC
    .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker
    Ocelot自定义管道中间件
    生产环境项目问题记录系列(二):Docker打包镜像Nuget包因权限问题还原失败
    .Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心
    IT人该如何未雨绸缪,不断提升自己的竞争力?同时尽量避免风险?
    Session跟Cookie简单的理解
    软件测试中高级面试提问
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/6010134.html
Copyright © 2011-2022 走看看