1 命名
(1)坏味道自检
- 命名是否具有业务含义
- 命名不精准,用词宽泛,不能有效反应代码含义
- 用技术术语命名
- 命名是否符合英语语法
- 违反语法规则
- 不准确的英语词汇
- 拼写错误
(2)解决方案
- 用业务语言命名
- 描述意图,而非细节
- 制定代码规范,建立团队词汇表,使用命名插件codelf
2 重复代码
(1)坏味道自检
- 复制粘贴的代码
- 结构重复的代码
- if和else代码块中语句高度类似
(2)解决方案
提取函数
3 函数
3.1 长函数
(1)坏味道自检
- 代码行数是否超过20行
(2)编程原则
- 定义长函数的标准
- 做好分离关注点
- 坚守童子军军规:让营地比你来时更干净
3.2 长参数
(1)坏味道自检
- 参数列表是否超过3个
(2)解决方案:将参数封装成一个类
(3)注意
- 变动频率
- 标记参数
- 模型封装以行为为基础
4 类
4.1 大类
(1)坏味道自检
类的字段是否超过10个
(2)解决方案
拆分小类
(3)编程原则
单一职责
4.2 依赖混乱
(1)坏味道自检
- 缺少防腐层,业务与外部接口耦合
- 业务代码中出现具体实现类
(2)解决方案
- 引入防腐层,将业务和接口隔离
- 引入一个模型,将业务与具体实现隔离
(3)编程原则
依赖倒置原则
5 语句
5.1 滥用控制语句
(1)坏味道自检
- 嵌套的代码
- else语句
- 重复的switch
- 循环语句
(2)解决方案
- 提取单个元素操作
- 用卫语句简化条件表达式
- 使用多态取代条件表达式
(3)编程原则
- 函数至多有一层缩进
- 不要使用else关键字
5.2 过长的消息链
(1)坏味道自检
火车头残骸,连续的函数调用
(2)解决方案
隐藏委托关系,封装
(3)编程原则:迪米特法则
5.3 基本类型偏执
(1)坏味道自检
使用各种基本类型作为模型传递
(2)解决方案
以对象取代基本类型
5.4 可变的数据
(1)坏味道自检
- 缺失行为,暴露细节
- 可变的数据
- 满天飞的setter
- 初始化后的setter
- 全局数据
(2)解决方案
限制变化,尽可能编写不可变类
5.5 变量的声明与赋值分离
(1)坏味道自检
- 变量声明之后是否立即赋值
- 集合声明之后是否有立即添加元素
(2)解决方案
- 在声明前加上final
- 用声明式的方式进行集合的初始化
(3)编程原则
变量要一次性完成初始化
5.6 语言新特性
(1)坏味道自检
- 是否使用语音新特性
- Optional
- 函数式编程
(2)编程原则
不断学习新的代码风格,不管改善自己的代码
5.7 不一致的代码
(1)坏味道自检
- 命名中的不一致
- 方案中的不一致
- 代码中的不一致
(2)解决方案
- 团队统一编程方案
- 提取函数,将不同层次的内容放到不同的函数中
学完代码之丑的专栏之后,做了系统的笔记,并积极在自己的开发中进行践行,感觉收获颇多。
说实在的,这种收获感比学那些高大上的架构知识,都来得更为幸福。而为了更好地做到自我检视,这次再整理一份自检清单出来,希望在帮助自己的同时,也能帮助到更多有缘人。
网友评论