代码之丑
1- 命名
坏味道:
- 命名过于宽泛,不能精确描述;一个好的名字应该描述意图,而非细节;
- 有技术术语命名:
- 违反英文语法规则的命名;
- 不准确的英语词汇;
- 英语单词拼写错误;
总结: 用业务语言写代码
2- 重复代码
3- 长函数
1 2 3 4 5 6 7 | CheckStyle配置函数方法的长度是20行 <module name= "MethodLength" > <property name= "tokens" value= "METHON_DEF" /> <property name= "max" value= "20" /> <property name= "countEmpty" value= "false" /> </module> |
4- 大类
大类产生的原因:
- 职责不单一
- 字段不分组
5- 长参数的列表
方法:
- 把参数列表封装成对象
- 动静分离
12345
变化频率相同,封装成一个类;
变化不同的话:
1- 静态不变的,可以成为软件结构的一部分;
2- 多个变化频率的,可以封装成几个类;
6- 滥用控制语句:if else for switch
7- 缺乏封装
优点:可以封装散落的代码,这点我到非常赞同作者的观点,有时候进行重构代码的时候,存在这种已经封装好的方法,确实比较容易进行重构,而不是去找散落在项目中的各种代码;
例如:mybatisPlus确实给我们的使用提供的灵活性,但大量的Wrappers散落,如果进行重构,确实会造成大量的人力浪费;
1 2 3 | 作者的观点就是setter和getter方法会破坏封装,建议用方法代替,不要把成员变量暴露出去; 以对象取代基本类型,意思就是用及时使用 get ,也要copy一个新的对象,而不使用原始的对象; |
8- 变量声明与赋值分离
宗旨:变量尽量一次性赋值,尽量是用final,不要用null进行过度。
- 提到了一个观点,变量一次性初始化,而不要多次,例如以下代码就是有臭味的
1 2 3 4 5 6 | demo1:final String status = null ; if (条件) { status = "STATUS.A" ; } else { status = "STATUS.B" ; }解决办法,把状态赋值抽象成一个方法demo2:Client client = null ; try { client = new Client;} catch (){} finally { if (client!= null ) { client.close(); }}解决办法: try 语法糖 |
- 在能够使用final的地方尽量使用final
9- 依赖混乱
- 缺少防腐层
1
例子:<br>springboot一般由 Controller层 和 Service层;<br>此时,写了一个接口,请求参数为Request,我们习惯会把Request直接拿到Service层去使用;<br>作者的观点是,Request应该属于Controller,不应该拿到Service层去使用;<br><br>解决办法,把Request中的值copy到另外一个对象,然后放到Service层去使用。
个人感觉,作者太矫枉过正了,为了优化而优化。
我感觉,代码中 A---B----A这样的循环依赖才是重中之重,而作者却一点也没有介绍。
10- 不一致
- 命名不一致;
- 方案不一致;
- 代码不一致;
11- 落后的代码
宗旨:使用新的代码特性来代替之前的代码逻辑,例如用Optional类进行null空指针等校验。
12- 新需求破坏了代码,怎么办?
- 接口,我们对外提供得越少越好;
- 改动实体要谨慎;
课程总结:个人感觉这个专栏的没有达到个人的预期,不会再看第二遍。可以去看《重构》这本书代替。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2019-10-22 yarn多租户管理