浅谈Clean Code
1. 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。
因此可见,如若想持续保证开发团队的效率,那么确保程序代码一以贯之的整洁,干净,易读,易维护是非常重要的。
2. 什么是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就是心怀爱意地去编程”,让你的程序单纯、简单、美好,当他人读你的程序时,能感觉到“你对这个世界的善意”。
3. Clean Code的一般性原则
Clean Code是一种编程思想,涵盖了很多的方面,本文提取了一些通用的原则供各位参考。
3.1 命名
变量命名:变量名要能揭示变量的功能和含义。
类名和方法名:类名通常要是名词,方法名使用动词,属性名使用名词。
避免含糊不清的命名:例如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,在你的团队中一定要有明确的命格规范,并严格遵守。
3.2 注释
如果可以用命名来表明含义,则不要用注释;
如果可以用清晰的代码逻辑来表明含义,则无需冗余的注释;
使用Git等工具进行版本管理的标明,而非在程序中通过注释来区分版本;
注释要是清晰明确的,不要写含糊不清的注释;
不要用注释区分段落,如果你的代码过长,考虑进行进一步的封装;
如果你的代码无法做到自我解释,那么留下一个注释,则会是一个明智的选择。
3.3 函数
一个函数/方法只做一件事
函数的参数要尽可能地少
函数体不要过长
函数逻辑不要有多层的循环
函数逻辑要避免多层的分支嵌套
使用异常,避免使用error Codes作为返回参数
3.4 检查
对代码做静态语法检查
每一段代码都要有对应的单元测试代码
团队内部的pair programming
release前,做代码review
4 小结
Clean Code是一种编程的思想和习惯,慢慢改变free style的编程风格,让你的code变得对着世界充满善意,这也将会是一个不断学习积累、不断规范的过程,对于个人而言,它会让你变得更加“专业”且富有“工匠精神”;对团队而言,形成Clean Code的氛围和规范能很好地保证产品质量,并极大提升团队的运行效率。
Clean Code是一个“不积跬步无以至千里”的过程。每天都变得规范一点点,做增量的积累,量变就会引发质变。
浅谈Clean Code相关推荐
- 浅谈前端自动化构建 -- Grunt、Gulp、FIS
前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:内容较多,建议通过左侧导航栏进行阅读 前端自动化构建 基本介绍 一切重复工作本应自动化.将开发中的源代码,自动化的转换成生产环境中可以运行的程序, ...
- 由MAVEN入手浅谈项目构建与管理
Prologue . 前言 第一次写博客,希望爱学习的小伙伴们喜欢. JAVA软件开发领域很喜欢一个名词,叫做"约定大于配置 ".我在此当然约法三章. 写博客优先级很低.希望借此激 ...
- 浅谈估值模型:PB指标与剩余收益估值
摘要及声明 1:本文简单介绍PB指标的推导以及剩余收益的估值方式: 2:本文主要为理念的讲解,模型也是笔者自建,文中假设与观点是基于笔者对模型及数据的一孔之见,若有不同见解欢迎随时留言交流: 3:笔者 ...
- 浅谈Android中的MVP与动态代理的结合
浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...
- mybatis与php,浅谈mybatis中的#和$的区别
浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...
- 浅谈ASP.NET内部机制(五)
浅谈ASP.NET内部机制(五) 前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难.不信可以看看.我尽量的讲的平实一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的. 系 ...
- 浅谈 PHP 神盾的解密过程
前些日子一个朋友丢了个shell给我,让我帮忙解密,打开源码看了下写着是 "神盾加密" , 牛逼闪闪的样子. 百度下发现神盾是个很古老的东西,最后一次更新是在 2012-10-09 ...
- java对象头_浅谈java对象结构 对象头 Markword
概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...
- Linux内核之浅谈内存寻址
Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...
最新文章
- 0基础学python-看完这篇,零基础也知道怎么学Python
- 013_JavaScript函数
- 为无LIB的DLL制作LIB函数符号输入库zz
- spring自定义标签实现
- 实例49:python
- 三维旋转四元数系列(0.复数基本介绍)
- 21位美国名校学生领袖在湖北了解中国媒体情况
- 我有30万现金,如何规划理财,让钱生钱?
- 计算机的组成 —— 显示器
- 程序性能之显示大表格
- 浅谈微信小程序开发工具
- 读《产品经理面试宝典》
- 最基础内网ip地址配置
- 最害怕的是,不知道想要什么
- Foreda Workstation 36安装搜狗拼音输入法
- Android RemoteViews 解析
- cad批量选择相同块_在CAD中如何快速选择相同或类似的图形、图块
- STM32实战六 PWM加移相正交
- 2-Arduino小车测速模板安装与测试
- 【硬件电路设计】滤波电容
热门文章
- matlab在输电线路故障测距中应用,Matlab在输电线路故障测距中的应用
- c语言中圆的周长公式,圆的周长公式
- 第2章第29节:英文排版技巧:无衬线字体和手写字体的搭配 [PowerPoint精美幻灯片实战教程]
- Unity 之自动化打包ipa
- 2022-2028全球与中国电动气动转换器市场现状及未来发展趋势
- 基于资源的权限系统-数据库设计
- 联想G460刷slic2.1激活Win7旗舰版
- 【软考系统架构设计师】2015年下系统架构师案例分析历年真题
- 《深度易经·deepin-bible》草稿汇
- 截止失真放大电路_音频功放失真?别急!这里有常见改善方法