小课堂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. No data in the view dba_hist_undostat (文档 ID 1558157.1)

    APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 11.2.0.3 [Release 10.2 to 11. ...

  2. memcached学习(二)

    Slab Allocation机制:整理内存以便重复使用 最近的memcached默认情况下采用了名为Slab Allocator的机制分配.管理内存. 在该机制出现以前,内存的分配是通过对所有记录简 ...

  3. 【PL/SQL练习】函数

    1.必须返回一个值2.只能在表达式调用 SQL> create or replace function fun1 return number is v_sum_sal emp.sal%type; ...

  4. Push failed: Failed with error: fatal: Could not read from remote repository.

    GitLab push远端,出现错误提示:Push failed: Failed with error: fatal: Could not read from remote repository. 原 ...

  5. 二模09day1解题报告

    T1.词编码(word) 给出一些原长为n的01串经过变化后的串求原串.原串的特点是:各个1的位置号和%(n+1)==0 变法(只取其一): 改一个0为1 删一个 加一个 不变. 其中2优先考虑位置靠 ...

  6. Oracle:使用过程中的问题集锦

    导读:在使用Oracle的过程中,又频繁的出问题.突然间就连接不上,各种报错了.在此,将问题给记录下来,方便以后查看. 一.ora 12514监听程序当前无法识别 之前一直链接使用的好好的,突然就连接 ...

  7. TRMM数据的读取

    编辑下头文件,就有投影信息,然后再转换成你需要的投影方式1) From the command line, type in, ENVI, 2) Click File|Open External Fil ...

  8. vs2010 编译curl-7.42.1

    curl是一个sftp ssl 等功能工具. dos 进入到curl-7.42.1\lib下来:逐步执行以下操作 call "C:/Program Files/Microsoft Visua ...

  9. MVC开发Markdown编辑器(1)

    MVC markdown MVC开发Markdown编辑器(1) 前言 安装 解析 结束语 前言 想在近段时间通过mvc开发个人博客,编辑器希望是markdown风格的,这样写文字会很方便.首先先解决 ...

  10. c#桌面小软件

    这是以前练习时用c#做的桌面小软件,今天回顾下. 这是设计界面 可以看出该程序能够播放网络歌曲及浏览新闻. 实现:歌曲来源百度API,播放WindowsMediaPlayer api地址:string ...