代码整洁之道

有意义的命名

取个好名字:名称应该告诉你,它为什么会存在,做了什么事,应该怎么用

应当避免使用与本意相悖的词,

以同样的方式拼写同样的概念才是信息,拼写前后不一致就是误导

误导性名称真正可怕的例子,是用小写字母l和大写字母O,因为看起来完全是一和零

以数字命名(a1,a2,a3)完全没有提供正确信息

废话是另一种没有意义的区分,比如:product类,productInfo类,productData类。废话就是冗余

使用读的出来的词,不要生造,比如genymdhms(生成日期,年月日时分秒)

使用可搜索的名称

类名和对象名应该是名词或名词短语

方法名应该是动词或动词短语

每个抽象概念对应一个词,并一以贯之

别用双关语

只有程序员才会读代码,所以尽量使用计算机术语

添加有意义的语境,就是添加前缀

实践

 

 

函数

函数应该短小

if,else,while语句,其代码块应该只有一行,应该是一个函数的调用语句

函数的缩进层级不该多于两层

只做一件事,做好一件事

要确保函数只做一件事,函数中的语句都要在同一抽象层级上

每个函数后面都跟着位于下一抽象层级的函数

使用多态替换switch

使用描述性的名称,别害怕长名字,长而具有描述性的名称,比长注释好,

参数数量应该尽量少

不要使用输出参数

不要使用标识参数

超过2个参数就应该封装为类

副作用,函数承诺只做一件事,但是会做其他被藏起来的事

使用异常替代返回错误码

抽离try/catch代码块

别重复代码

实践再优化

 

 

注释

 应当负责将注释保持在可维护,有关联,精确的高度

不准确的注释比没有注释坏的多

 尽量减少注释量

 注释不能美化糟糕的代码

 提供信息的注释

 对意图的解释

警告

//TODO

良好描述的JavaDoc

 拒绝多余的,描述不清的,误导的注释

拒绝循规式注释

拒绝日志式注释

拒绝废话式注释

拒绝归属与署名,由源代码控制系统代替

拒绝注释掉的代码,由源代码控制系统代替

无用信息过多 

 

 

格式

好的软件系统是由一系列读起来不错的代码文件组成的,它们需要一致和顺畅的风格

 

 

对象和数据结构

 隐藏实现并非在变量之上放一个函数层那么简单,类并不简单的用取值器和赋值器将变量推向外部,而是暴露抽象接口,以便用户无需了解细节就能操作数据本体

 

 

错误处理

错误处理不应搞乱代码逻辑

使用异常代替错误码

尽量别返回null值

尽量别传递null值

 

 

边界

 

 

单元测试

测试应该足够快

互相独立

可重复

自身可验证

及时

 

 

类应该是一组变量列表开始,先是公共静态常量,然后是私有静态变量,私有实体变量

公共函数应跟在变量列表之后,公共函数调用的私有工具函数紧跟在公共函数后面

类名应当描述其权责

类或模块应该有且只有一条加以修改的理由

让软件能工作和让软降保持整洁,是两种不同的工作

系统应该是由许多短小的类而不是巨大的类组成

超过3个变量就应该改为实体对象

隔离修改

 

 

系统

 

 

迭进

1 运行所有的测试

2 不可重复

3 表达了程序员的意图

4 减少类和方法的数量 

 

 

并发编程

分离并发代码与业务代码

数据封装,严格限制对可能共享数据的访问

单线程收集多线程的副本,并合并这些结果

线程尽可能独立

编写可调整的线程代码

 

 

逐步改进

 

 

重构SerialDate

 

 

味道与启发

注释:

1 不恰当的信息,注释只应该描述有关代码和设计的技术性信息

2 废弃的注释,过时、无关或不正确的注释

3 冗余注释

4 糟糕注释

5 注释掉的代码

函数

1 过多的参数

2 输出参数违反直觉

3 标识参数

4 死函数,不被调用的方法

一般性问题

1 一个源文件存在多种语言

2 明显的行为未被实现

3 不正确的边界行为

4 忽视安全

5 重复

6 错误抽象层级,抽象类一般较高级的概念,派生类较低级

7 基类依赖派生类

8 信息过多

9 死代码

10 垂直分隔,变量和函数应该靠近被使用的地方

11 前后不一致

12 混淆视听

13 人为耦合

14 特性依赖

15 选择算子参数,使用多个函数,通常优于向单个函数传递某些代码来选择函数行为

16 晦涩的意图

17 位置错误的权责

18 不恰当的静态方法

19 使用解释性变量

20 函数名称应该表达其行为

21 理解算法

23用多态代替if/else或switch

24 遵循标准约定

25 用命名常量代替魔术数

28 封装条件

29 避免否定性条件

30 函数只做一件事

31 掩盖时序耦合

33 封装边界条件

java

2 不要继承常量

3 多用枚举

名称

1 采用描述性名称

2 名称应与抽象层级相符

3 尽可能使用标准命名法

4 无歧义的名称

 

posted @ 2020-03-31 10:53  褐色键盘  阅读(145)  评论(0)    收藏  举报