小课堂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
小结
今天介绍了两个非常重要的原则,第一是短小,第二是只做一件事,这也是写出整洁代码最为关键的两个原则。其实,写好代码和写好文章,道理是想通,把平时我们的日常的表达方式套用到程序中去,会帮助我们更快的获得“整洁感”
小课堂Week12 Clean Code Part1的更多相关文章
- 小课堂week13 Clean Code Part2
Clean Code Part2 对象与数据结构 首先让我们进行一个严肃的思考,对象与数据结构的区别在哪里? 如下两段代码分别用数据结构和对象的方法来描述了一个Point. public class ...
- 小课堂Week8 例外处理设计的逆袭Part1
小课堂Week8 例外处理设计的逆袭Part1 今天和大家讲一本书,书名是<例外处理设计的逆袭>. 为什么想讲这本书,是因为,例外处理在程序代码中到处存在,但是这些到底该如何写好,总觉得有 ...
- 说说怎么写clean code
前两天参加了公司组织的一个培训,主题是“如何写出好的代码” ,刚看到这个主题,第一反应是又不知道是哪个培训机构来忽悠钱的!老大安排了,就去听听呗. 说实在的,课程内容没有什么新鲜的东西,就是讲讲如何发 ...
- 小课堂Week9 例外处理设计的逆袭Part2
小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...
- Spark小课堂Week5 Scala初探
Spark小课堂Week5 Scala初探 Scala是java威力加强版. 对Java的改进 这里会结合StreamingContext.scala这个代码说明下对Java的改进方面. 方便测试方式 ...
- 《Clean Code》 代码简洁之道
作者介绍 原文作者: Robert C. Martin, Object Mentor公司总裁,面向对象设计.模式.UML.敏捷方法学和极限编程领域的资深顾问,是<敏捷软件开发:原则.模式.与实践 ...
- 聊聊clean code
clean code,顾名思义就是整洁的代码,或者说清晰.漂亮的代码,相信大多数工程师都希望自己能写出这样的代码. 也许这是个千人千面的话题,每个工程师都有自己的理解.比如我,从一个天天被骂代码写得烂 ...
- Clean Code之JavaScript代码示例
译者按: 简洁的代码可以避免写出过多的BUG. 原文: JavaScript Clean Code - Best Practices 译者: Fundebug 本文采用意译,版权归原作者所有 引文 作 ...
- 【笔记】Clean Code(持续更新)
这个暑假出来实习,第一次体会到在一个团队中开发的体验,与网上的网站看到的大为不同,以前看网上说什么程序员写了屎山代码,写了一堆模糊的注释或者说垃圾代码不写注释. 但在我的实习体验中,代码虽然看起来很多 ...
随机推荐
- Library Cache: Lock, Pin and Load Lock
What is "Library cache lock" ? This event controls the concurrency between clients of the ...
- Cardinality Feedback
该特性主要针对 统计信息陈旧.无直方图或虽然有直方图但仍基数计算不准确的情况, Cardinality基数的计算直接影响到后续的JOIN COST等重要的成本计算评估,造成CBO选择不当的执行计划 O ...
- ORA-00245: control file backup failed; target is likely on a local file system (转载)
环境:DB VERSION: 11.2.0.4.0RAC 2 nodes 问题:邮件显示rman备份失败,查看rman备份日志 Starting Control File and SPFILE Aut ...
- JQuery基础教程:入门
JQuery能做什么 JQuery在线手册 1.取得文档中的元素 如果不使用JavaScript库,遍历DOM(Document Object Model,文档对象模型)树,以及查找HTML文档结构中 ...
- Intel HD4000的驱动-黑苹果之路
10.9.1装好后显卡HD4000能自动识别,但是识别的内存始终只有64M,使用了删.改AppleIntel*.kext驱动.修改clover的graphic的ig-platform-id.修改DSD ...
- 基本配置6-被忽悠进了CentOS 6
今天突然想到原来配置的apache2与tomcat的连接,测试发现有2个小问题: 1.<%=path%>丢失问题:原来配置的 ProxyPass /xxx http://192.168.1 ...
- 使用django表单,使网页添加上传文件,并分析文件。
开发环境是: apache + python + django+ eclipse(开发环境) 欲达到目的: 在网页上,添加上传文件控件.然后读取csv文件,并分析csv文件. 操作步骤: django ...
- [转]SVN-版本控制软件
一.版本控制软件 1.为什么需要版本控制软件 问题:① 团队开发 ② 异地协作 ③ 版本回退 2.解决之道 SCM(Software Configuration Management):软件配置管理 ...
- Markdown 编辑器语法指南
基本技巧 代码 如果你只想高亮语句中的某个函数名或关键字,可以使用 `function_name()` 实现 通常编辑器根据代码片段适配合适的高亮方法,但你也可以用 ``` 包裹一段代码,并指定一种语 ...
- 使用C#调用windows API入门
一:入门,直接从 C# 调用 DLL 导出 其实我们的议题应该叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. 调用 COM 对象上的接口方法 我 ...