OracleClean Code 告诉你什么样是好代码

前言

近年在集体实践Code
Review,碰到一个讨厌的题材。当向同伴的代码提一个comment时,他们不为人知为什么需要这么改。细细想来,是他俩不知道何为好代码,也不了然自己的代码有什么样
“坏味道”。因而,分享了几期Clean Code,团队收益良多,故成此文。

Clean Code

是因为Clean Code篇幅较长,故先配备如下我认为相比较紧要的几点:

  • 命名
  • 函数(方法)
  • 注释
  • 对象、数据结构

命名

命名有许多条条框框,但统计起来就是 “有意义” 才是硬道理。

名副其实

Int d;//逝去的时间

这句代码的题目在于d没有发挥好逝去的年月这几个定义,故需要注释。请牢记“名副其实就不需要注释”

Int elapsedTime;

再来看个例子

谁都很难猜出其含义,看看小优化后的结果

着力看清了意义,这就是命名的紧要。细心的心上人还会发现这段代码的有的瑕疵
:这里的4是怎样鬼?习惯性大家管它叫“魔法数字”

依然认为有点问题,再优化

对待下最早的代码,相信您会有感觉了。

避免误导

生活中的场景也常并发在Code中,看下图,你的Code是否也油可是生如此的两难吗?这就Make
it clean

是不是傻傻分不清了吗? 再来个

accountList

自我知道您想说,这有怎么着问题。是的,假使您不是做Java开发,不会知道链表叫List,所以一旦你不是用链表存储account,请不要用其修饰,或许这一个时候你使用acountGroup会更好些。
该点需要在切实开支环境下因地制宜

有意义的区分

Product
ProductInfo
ProductData

可以想象下,当一个档次中同时出现上述六个类的时候,你是怎么着区分开的,反正我是未曾这多少个力量。类似的还有

game
theGame

name
nameString

享受时,伙伴说nameString有哪些问题。我反问说难道你的名字会是Float型的?你懂了吧。

前缀

m_desc

有人提出加m前缀表示该变量为个体变量。
自己想说:你的变量很多?需要区分私有的如故公有的?假诺您的变量很多,这就要寻思是不是没计划好类,没有如约单纯任务规范,此外私有和国有变量编译器会辅助高亮显示区分的,不需要团结来分别(若某些编译器无此特性,怪编译器去)。

命名惯性

取名需要重视词性
类名:名词 or 名词短语
艺术名: 动词 or 动词短语

各类概念对应一个词

在一个模块中不要使用六个一般的概念来表达不同的操作。我在一份代码中看看过一个类中而且出现以下多个词打头的措施

fetch
get
retrieve

试问那些才是的确获取值的不二法门?我实在分不清。

动用领域名称

采纳世界命名能让小伙伴更了然你的程序结构(关于领域以此定义,不熟知的能够看下一本书叫
《领域驱动设计》,俗称DDD)
举个例子,比如你使用访问者情势来构建用户系统,那么

AccountVisitor

就体现明确、易懂

抵制缩写诱惑

缩写需要专注,适当的缩写是可以的,可是要保管缩写后的用语依然能发布其本意。举个有意思的例证

ABCDEFG

这也是个缩写,不过乍看这么些真不知道是哪些的缩写,直接披露答案吧

小结

命名是稳定的难题,我提多少个提议吧

  • 多看开源代码,积累好的用词
  • 不懂的词就查下词典,好过你协调想的
  • 做个自己的开源项目,让旁人给你指出
  • 搞活积累、再积累、依然积累

有的借鉴词

函数(方法)

函数的首先条规则是要短小,第二条规则仍旧要短小。

短小

这到底多短合适呢?历史上冒出过多少个标准

  • 一屏
  • 100行
  • 50行
  • 20行
    有人问我为啥会差这么多,我的答问是:以前的屏幕分辨率那么低,一屏也就20-50行期间吧,所以以前一屏的说教也是合理合法的。
    对此行数,行业没有一个稳住的正统。我所了解的Oracle指出是50行,鲍伯(Bob)二伯的提议是20行。

代码短小,好处自然很多。

  • 单元测试覆盖率高
  • 每个函数一目精晓,只做一件事
  • 有利于函数中的代码都在同一个华而不实层级

只做一件事

函数应该做一件事。做好这件事。只做一件事。
那么咋样判断只做一件事?

试问这多少个函数做了几件事?伙伴的答案是

1.判断是否为测试页面
2.加入测试数据
3.渲染页面

您的答案是不怎么呢?其实答案是只做了一件事,紧假诺不曾看清
一件事 OR 一件事的三个步骤,关于这一点,大家要出彩体会。

其它一个断定是否只做一件事的好办法: 是否能重新分离出新函数

同一个虚无层级

关于层级,相比难表明,直接看例子吗

再看一个本子

你会发觉看第二个版本的代码,显著舒服很多。因为第二的本子的三句代码都在同一个层级。而首先个本子的代码中的第一句是设置roundView的某个属性,可是最后一句却是在设置bubbleView,层级不同(roundView与bubbleView才是同层级)

采取描述性名称

一经长一些的称号可以进一步彰着,不要犹豫,用清晰的啊(注意是要有含义的)

calculate
calculatePrice

对照起来calculate普赖斯(Price)就好过多。
再来看个例子

addComment
addCommentAndReturnCount

你不是说长一些更显然吧,那addCommentAndReturnCount很好呢。
有关这一点我们要留意,假诺你内需用and、or之类的介词来修辞函数时,要考虑下您是否违背了单一任务规范

参数个数

0个最好,
1个次之,
2个还行,
3个以上不是太好了。
参数与函数名位于不同的架空层级,它要求你必须询问当前并不专门重大的底细。
解决办法有不少,比如一些场景可使用DTO

嵌套层次、分支过多

嵌套、分支过多会让代码变得很难精晓,解决的点子有如下:

  • 卫语句
  • do-while,引入break
  • if-else if-then
  • 领到函数
  • 以子类取代类型代码
  • 以多态取代条件式

  • 切切实实可依照项目特点拔取

分开指令与查询

set那些函数很不引人注目标是究竟是安装成功了回来true,如故名字存在再次来到true,但确实的问题在于,它是个指令可是掺杂了查询的听从。

将查询和指令分离后,代码便清晰很多了。

小结

何以写出好的函数

  • 先写对的,再写好的
  • 对 =》 单元测试 =》识别坏味道 =》重构

注释

“别给不佳的代码加注释 — 重新写吗。” –Brian & P.J.
“注释总是一种败北” –鲍勃(Bob)

用代码来论述

感触两段代码会意识代码即注释的美

坏注释

先来探视怎么样是坏的笺注

喃喃自语

这注释相对是给自己看的

余下的讲明

表达跟没解释一样,不如代码来的简单明了

误导性的诠释

你在误导吧

循规式注释

这么些肯定要留心,循环式的诠释完全多余(除了做sdk、开源)

括号后的笺注

假若括号后需要注释,只标明你这段代码太长了,需要做的不是加注释,而是将它变短。

归属于署名

Git、SVN知道是您付出的,不用这样刷存在感

声明掉代码

声明掉的代码,只会让修改你代码的人蒙圈,假使您以为这段代码有可能将来会用,也不用担心,Git、SVN会帮您找回来

信息过多

面向对象讲究,表露操作,隐藏实现,要是你还要注释这多少个信息,表示你没有包装好。这些音信,可考虑放个链接或者其他的大概指示,太长的笺注,旁人懒得读、也难读懂

好注释

看了那么多坏注释,来探视如何做的笺注

法律音信
提供音信
对企图的讲明
阐释
警示
TODO注释
放大

目标、数据结构

数据抽象

将变量设置为个人(Private),紧如若不想让其别人倚重这个变量。所以,不要随便给变量添加赋值方法和取值方法(set/get方法),这样事实上是把民用变量公之于众。
隐藏变量和贯彻,并不是在变量与外界之间放一个函数层那么粗略。隐藏关乎抽象。
类并不简单地用赋值方法和取值方法将其变量推向外间,而是流露抽象接口,以便用户无须精晓多少的兑现而能操作数据本体。
要以什么措施表现对象所蕴含的多少,需要做严穆的沉思。随便加赋值方法和取值方法,是最坏的挑三拣四。

数据、对象的反对称性

前端是一种过程式代码,后者是面向对象式代码。大家会发现只要要添加一个新形态的话,后者相对是毋庸置疑的挑三拣四,因为以上代码都不需要修改,只需写一个新形状类,这契合“开放–封闭”原则。不过如果添加一个划算周长的效应的话这就杯具了,因为这样子每个形状类都得改变。可是只假如用过程式代码的话只需要丰裕一个新函数。

过程式代码(使用数据结构的代码)便于在不转移既有数据结构的前提下添加新函数。
面向对象代码便于在不改动既有函数的前提下添加新类。
一切都是对象只是一个风传

组织

  • 集体静态变量
  • 民用静态变量
  • 私家实体变量
  • 公共函数
  • 村办函数
    自顶向下原则
    此处为啥没有写公有实体变量是因为,其不指出出现在代码中。

短小

函数的短小标准是行数,这类是什么样吗?答案是职责
类需要依照单纯性任务规范

内聚

如以上代码,内聚性高,除了size方法外,其他情势都利用了多个实例变量。
内聚:模块内部各类要素互相结合的紧紧程度(类中方法和变量间的结合程度)
保障内聚会拿到广大短小的类
当一个类丧失内聚性时我们相应拆分它

总结

Clean
Code能帮忙社团构建代码质地连串,有助于开发的各类环节(静态分析、持续集成、Code
Review…)。当然,对私家的力量提升也很有利益,提出我们都应该明白。等团体Code
Review一段时间后,有任何获取的话,再给我们大饱眼福。
预祝我们国庆节喜欢!

相关文章