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

前言

前不久在公司推行Code
Review,遭遇一个嫌恶的问题。当向同伴的代码提一个comment时,他们不为人知为啥需要这样改。细细想来,是她们不知道何为好代码,也不明了自己的代码有什么
“坏味道”。由此,分享了几期Clean Code,团队收益良多,故成此文。

Clean Code

鉴于Clean Code篇幅较长,故先安排如下我觉得相比重大的几点:

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

Java,命名

取名有众多规则,但总计起来就是 “有意义” 才是硬道理。

名副其实

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行,鲍伯岳丈的提议是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一段时间后,有其他获取的话,再给大家分享。
预祝我们国庆节乐呵呵!

相关文章