浅谈Clean Code
Clean Code起源
- 谈起Clean Code,大多数的程序员都不陌生,有时我们会将Clean Code也称之为代码整洁之道。
- Clean Code的思源源于软件工程领域的大师级人物 - 罗伯特·马丁(Robert C. Martin)所著的一本重量级经典图书《Clean Code》,他在书中提出一种观念:
- 代码质量与其整洁度成正比
- 干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好的基础。
- 为了更好地理解这一思想,让我们来先看这样一个研究:
- 写代码的时间(Writing) VS. 读代码的时间(Reading)
- 大家可以回顾一下,在日常编写代码的过程中,有多少时间是花费在写代码上?有多少时间是花费在读已有的代码上的?
- 其实这样一个研究并不难,通过一些编辑器的记录功能,可以很好地分析程序员的整个开发过程。
- 这个过程往往是这个样子的 -
- 你经常先会写若干行代码,然而不一会,你又会删除它们;接下来你会滑动鼠标滚轮,研究一会代码的上下文,然后重新写下几行代码;在编写的过程中,有时又会突然想到,编写的这段代码可能又会被sub-class中的方法重写而被覆盖掉,因为你不得不悻悻地删除刚刚编写的代码。。。
- 相信在编码过程中,类似的场景任何一个程序员都不会陌生,我们总是会在不断地写代码,同时又会不断地使用delete键删除刚刚写好的代码。
- 研究表明,程序员花费在读代码上的时间通常要10倍于真正编写代码上的时间,也即Writing vs. Reading的比例大概是1:10。
- 因此可见,如若想持续保证开发团队的效率,那么确保程序代码一以贯之的整洁,干净,易读,易维护是非常重要的。
什么是Clean Code
- 在谈Clean Code的一般原则之前,让我们看看大神们是如何理解这一概念的:
- “Clean code does one thing well.” — Bjarne Stroustrup (Inventor of C++)
- “Clean code is simple and direct. Clean code reads like well-written prose.” — Grady Booch (Pioneer of OO and UML)
- “Clean code can be read, and enhanced by a developer other than its original author.” — Dave Thomas (Godfather of the Eclipse Strategy)
- “Clean code always looks like it was written by someone who cares.” — Michael Feathers(Author of “Working effectively with legacy code”)
- 从上面的描述中,不难看出大家对Clean Code这一思想的喜爱,如果稍微文艺点,我们可以说“Clean Code就是心怀爱意地去编程”,让你的程序单纯、简单、美好,当他人读你的程序时,能感觉到“你对这个世界的善意”。
Clean Code的一般性原则
- Clean Code是一种编程思想,涵盖了很多的方面,本文提取了一些通用的原则供各位参考。
命名
- 变量命名:变量名要能揭示变量的功能和含义。
- 类名和方法名:类名通常要是名词,方法名使用动词,属性名使用名词。
- 避免含糊不清的命名:例如Company,CompanyData, CompanyInfo,类似的命名让人无法从名称上明白变量间的差别与含义。
- 避免含义不清的词汇:例如utility,processer, helper,这样的词所描述的方法或class往往会变成一个杂货铺。
- 对于某一概念,选取一个特定的词:例如对于读取这一个概念,我们统一口径使用GET,例如get_name(), get_production_date();而不要变成千人千面,例如get_name(), fetch_production_date(),read_customer()。
- 名字要是可读的:不要使用那些奇奇怪怪的缩写词,例如get_khzsu( )这样的命名会让读你代码的人不断内心WTK…
- 使用常量,不要留下魔法数字/字符:魔法数字和字符会让读你程序的人崩溃的。。。
- 通用的命名规范:无论是使用Java, JS, C++, C# etc,在你的团队中一定要有明确的命格规范,并严格遵守。
注释
- 如果可以用命名来表明含义,则不要用注释;
- 如果可以用清晰的代码逻辑来表明含义,则无需冗余的注释;
- 使用Git等工具进行版本管理的标明,而非在程序中通过注释来区分版本;
- 注释要是清晰明确的,不要写含糊不清的注释;
- 不要用注释区分段落,如果你的代码过长,考虑进行进一步的封装;
- 如果你的代码无法做到自我解释,那么留下一个注释,则会是一个明智的选择。
函数
- 一个函数/方法只做一件事
- 函数的参数要尽可能地少
- 函数体不要过长
- 函数逻辑不要有多层的循环
- 函数逻辑要避免多层的分支嵌套
- 使用异常,避免使用error Codes作为返回参数
检查
- 对代码做静态语法检查
- 每一段代码都要有对应的单元测试代码
- 团队内部的pair programming
- release前,做代码review
小结
- Clean Code是一种编程的思想和习惯,慢慢改变free style的编程风格,让你的code变得对着世界充满善意,这也将会是一个不断学习积累、不断规范的过程,对于个人而言,它会让你变得更加“专业”且富有“工匠精神”;对团队而言,形成Clean Code的氛围和规范能很好地保证产品质量,并极大提升团队的运行效率。
- Clean Code是一个“不积跬步无以至千里”的过程。每天都变得规范一点点,做增量的积累,量变就会引发质变。