将近400页的代码整洁之道(将近400页的代码整洁之道)
将近400页的代码整洁之道(将近400页的代码整洁之道)但是,我们如何从简单的编写代码过渡到编写整洁的代码?Martin认为,我们有两大途径持续重构和测试驱动开发(TDD),它们就像硬币的两面,具有相互作用。以下是一些定义:这才是《代码整洁之道》的精髓所在,在整本书里,作者始终在传达一个理念:软件是一门艺术,就和画画一样,本质上,他认为编程是一门手艺。《代码整洁之道》在美亚上已经有13000个评价,平均评分4.4,在豆瓣上也有1650个人评价,豆瓣评分8.6,看完这本书,我将本书的5个要点提炼出来:1、编程是门手艺架构知识软件开发中用到的借喻之一,不要创建一个完整的设计,然后从头开始创建,一步步构建成一个完整的软件,相反,我们应该从一个草图开始,不断迭代添加细节,不断修改、改进、扩展——在不同的抽象层次上构建,直到我们需要的软件构造完成。但记住,软件永远不会真正的完成。
程序员书库(ID:CodingBook)编译
链接:https://medium.com/better-programming/clean-code-5-essential-takeaways-2a0b17ccd05c
Bob叔有一句名言:任何一个傻瓜都能写出计算机可以理解的代码,惟有写出人类容易理解的代码,才是优秀的程序员。
Bob叔的《代码整洁之道》相信大家都不陌生,2008年出版,一直被亚马逊评为销量最高的5本技术书籍之一,作者也被亲切的成为“Bob叔”,他还是敏捷软件开发宣言(2001)的17位签署者之一。
《代码整洁之道》在美亚上已经有13000个评价,平均评分4.4,在豆瓣上也有1650个人评价,豆瓣评分8.6,看完这本书,我将本书的5个要点提炼出来:
1、编程是门手艺
架构知识软件开发中用到的借喻之一,不要创建一个完整的设计,然后从头开始创建,一步步构建成一个完整的软件,相反,我们应该从一个草图开始,不断迭代添加细节,不断修改、改进、扩展——在不同的抽象层次上构建,直到我们需要的软件构造完成。但记住,软件永远不会真正的完成。
这才是《代码整洁之道》的精髓所在,在整本书里,作者始终在传达一个理念:软件是一门艺术,就和画画一样,本质上,他认为编程是一门手艺。
但是,我们如何从简单的编写代码过渡到编写整洁的代码?Martin认为,我们有两大途径持续重构和测试驱动开发(TDD),它们就像硬币的两面,具有相互作用。以下是一些定义:
- 重构就是在不改变外部行为的情况下重构现有计算机代码的过程
- 测试驱动的开发是一个过程,在这个过程中,需求被转换成特定的测试用例,然后只编写使测试通过的功能代码。
因此,制作软件的过程可能是这样的:
- 编写失败测试,以验证所需但未实现的功能
- 编写一些(可能不好的)代码,使这些测试通过。
- 增多重构代码,测试通过,使得每次开发迭代都变得更加清晰。
Martin提出一个中心思想就是整洁代码,它是在开发过程和实践中产生,而不是一次简单的创建就可以。
2、保持简短
函数的第一条规则是它们应该很小。函数的第二个规则是它们应该比小更小。
Martin的这句话就两意思:函数体应该很短——几乎不超过20行,大多数不超过10行;函数应该尽可能设置少的参数,最好不要有参数。
函数的简洁性使代码更容易阅读,每个函数一个抽象层级。Martin在“类”上也提出了类似的观点,他建议使用职责来衡量,而不是代码行数,也就是说每个类应该只负责一件事,这就是所谓的单一责任原则(SRP)。
保持简短是使代码更简洁的策略,如果我们有一个大文件,里面有很多冗长、复杂的代码,我们可以把这个文件分成模块,把模块分成函数,把函数分成子函数,知道逻辑和目的变得清晰为止。
3、代码可读性
带有少量注释的整洁而有表达力的代码,要比带有大量注释的零碎而复杂的代码像样得多。
在关于注释、格式这部分内容中,Martin给出了强有力的例子,你是更愿意看到这段代码:
//Checktoseeiftheemployeeiseligibleforfullbenefits
if((employee.flags&HOURLY_FLAG)&&
(employee.age>65))
还是这一段代码:
if(employee.isEligibleForFullBenefits())
条件逻辑被封装到一个方法中,因为使用的是方法而不是独立函数,所以可以使用实例变量,从而创建零参数的方法调用,该方法还使用了描述性的名称,使“整洁代码”的职责更加明确。这本书专门设了一章来介绍命名,本质上是对Tim Ottinger规则的详细说明。例如:
- 能够清晰表达意图——诸如用int elapsedTimeInDays,而不是in days
- 使用读得出来的名称——例如,客户而不是DtaRcrd102
- 避免使用编码——不要用前缀m_表示"members",也不要使用匈牙利表标记法
- 每个概念对应一个词——不要使用fetch retrieve get去给多个类中的同个方法命名。
4、尊重抽象
根据书中说的,如果我们想要确保我们的函数只做一件事,我们需要确保每个函数中的语句都处于相同的抽象级别。Martin用以下来自FitNesse的例子来说明这一点:
publicStringrender()throwsException{
StringBufferhtml=newStringBuffer("<hr");
if(size>0)
html.append("size="").append(size 1).append("\"");
html.append(">");
returnhtml.toString();
}
这里至少混合了两个抽象层次。第一个是呈现具有给定大小的hr标记的高级概念,第二个是处理实际构造标记的低级语法细节。(详细代码:https://gist.github.com/jamiebullock/e92efb17b58af81b49bc6568b0de4a4e/raw/cc1c341430b40eeb4754033a086848561c960012/no_abstraction.java)
为了说明这一点,代码被重构得更干净,如下所示:
publicStringrender()throwsException{
HtmlTaghr=newHtmlTag("hr");
if(extraDashes>0)
hr.addAttribute("size" hrSize(extraDahses));
returnhr.html();
}
privateStringhrSize(intheight){
inthrSize=height 1;
returnString.format("%d" hrSize);
}
注:render()函数现在只负责构造一个hr标签;构造标记的底层细节现在由HtmlTag模块负责;大小格式被抽象为一个单独的函数
按照Martin说的:分离抽象层次是重构最重要的功能之一,也是最难实现的功能之一。这当然也是我们在今后的代码中需要多多考虑的问题。
5、《代码整洁之道》是关于原则和如何努力工作的一本书
我写这篇文章的目的不仅仅只是为了罗列出《代码整洁之道》里面的重点和名言,总结我们可以应用的规则,以获得整洁的代码,这样做对这本书来说是一种伤害,因为这本书本身还没有达到这种教条主义的地步。
相反,让我印象更为深刻的是,Martin在引导我们培养一种强烈的个人原则意识,并不断地说明将代码从“脏”变成“整洁”所需要付出的努力,在书里也称之为“代码感”,这需要“不断的严格运用各种代码技巧,才能达到所谓的整洁感”
写在最后
《代码整洁之道》书中的每一条规则并非都是由Bob叔提出的,他在书中多次公开承认这一点。如果说有什么不同的话,那就是这是本书如此成功的原因之一——它是对编程社区中各种智慧的提炼,并使用了实际例子让它变得更加充实。
如果本书还有什么不足的话,我觉得有一个,就是关于细节的章节和关于概念的章节配比有点不平衡,比如系统这一章只有13页,几乎只有注释那一章节的一般,我猜他这样做的原因,是想要吧这一部分的内容,留到《Clean Architecture》中去讨论。除此之外,我觉得这是最好的编程书籍之一。