小课堂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

小结

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

小课堂Week12 Clean Code Part1的更多相关文章

  1. 小课堂week13 Clean Code Part2

    Clean Code Part2 对象与数据结构 首先让我们进行一个严肃的思考,对象与数据结构的区别在哪里? 如下两段代码分别用数据结构和对象的方法来描述了一个Point. public class ...

  2. 小课堂Week8 例外处理设计的逆袭Part1

    小课堂Week8 例外处理设计的逆袭Part1 今天和大家讲一本书,书名是<例外处理设计的逆袭>. 为什么想讲这本书,是因为,例外处理在程序代码中到处存在,但是这些到底该如何写好,总觉得有 ...

  3. 说说怎么写clean code

    前两天参加了公司组织的一个培训,主题是“如何写出好的代码” ,刚看到这个主题,第一反应是又不知道是哪个培训机构来忽悠钱的!老大安排了,就去听听呗. 说实在的,课程内容没有什么新鲜的东西,就是讲讲如何发 ...

  4. 小课堂Week9 例外处理设计的逆袭Part2

    小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...

  5. Spark小课堂Week5 Scala初探

    Spark小课堂Week5 Scala初探 Scala是java威力加强版. 对Java的改进 这里会结合StreamingContext.scala这个代码说明下对Java的改进方面. 方便测试方式 ...

  6. 《Clean Code》 代码简洁之道

    作者介绍 原文作者: Robert C. Martin, Object Mentor公司总裁,面向对象设计.模式.UML.敏捷方法学和极限编程领域的资深顾问,是<敏捷软件开发:原则.模式.与实践 ...

  7. 聊聊clean code

    clean code,顾名思义就是整洁的代码,或者说清晰.漂亮的代码,相信大多数工程师都希望自己能写出这样的代码. 也许这是个千人千面的话题,每个工程师都有自己的理解.比如我,从一个天天被骂代码写得烂 ...

  8. Clean Code之JavaScript代码示例

    译者按: 简洁的代码可以避免写出过多的BUG. 原文: JavaScript Clean Code - Best Practices 译者: Fundebug 本文采用意译,版权归原作者所有 引文 作 ...

  9. 【笔记】Clean Code(持续更新)

    这个暑假出来实习,第一次体会到在一个团队中开发的体验,与网上的网站看到的大为不同,以前看网上说什么程序员写了屎山代码,写了一堆模糊的注释或者说垃圾代码不写注释. 但在我的实习体验中,代码虽然看起来很多 ...

随机推荐

  1. Log4日志配置及使用

    1.log4j.xml <?xml version="1.0" encoding="gb2312" ?> <!DOCTYPE log4j:co ...

  2. Android——Dialog

    public class DialogActivity extends Activity { //进度对话框    ProgressDialog progressDialog; @Override   ...

  3. cocos2d-lua 3.5 ios搭建步骤

    xcode搭建cocos2d-lua是最简单的,不用 配置一系列环境变量,只把xcode安装好就可以 步骤一:去官网下载quick-3.5,然后打开命令行工具 步骤二:cd进入/Users/song/ ...

  4. 剑指Offer:面试题13——在O(1)时间删除链表结点

    问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode ...

  5. xutils 框架

    1. android快速开发框架xUtils xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵 ...

  6. NOIP总结

    拿到题目先写裸的暴力,暴力一定要写对,没想出正解有暴力垫底,想出了正解也可以拿来拍 过了样例之后一定要造数据测,数据越坑越好 一定要造极限数据,哪怕造不知道答案的数据都行,主要是检测RE和TLE,正确 ...

  7. svn 常用操作命令

    svn 常用操作命令 检出 svn checkout http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名 svn checkout svn://路径(目录或文件 ...

  8. python拷贝文件到多个文件夹

    主要用来做数据备份,每次用完以后再跑一次脚本,又可以将文件夹下的所有文件拷贝到指定的文件夹内 import os,sys,shutil; class cur_env: path = sys.path[ ...

  9. extjs gride 显示序号

    在使用Extjs框架时,有时为了在信息列表中显示数据项的序号,这就要构造一些方法来显示序号,其方法有两种,具体如下: 1.方法一 对 Ext.grid.PageRowNumberer 进行扩展,详细代 ...

  10. wamp环境下外网访问自己电脑自己写的网站

    首先我广州电信是对外封杀80端口的,但是内网可以用80端口访问, 可以将访问的端口改成81, apache的配置文件,httpd.conf 首先找到3个Listen 将80端口改成81 #Listen ...