整洁代码实践
代码整洁,清晰可读,性能优异,是软件开发者追求的永恒目标。
这个目标不是一步就可以实现的,它是在开发过程中,不断练习,不断总结中提升的。通常来说,高级开发工程师写的代码就比初中级写的更加整洁,bug更少。有些原则,我们在书上看了很多遍,但就是没有执行,或是执行中犯了错。
1、命名规范。
驼峰命名法是java标准命名规范,但是在写接口时,我们还是会遇到和外部系统对接时,其他语言的命名规范,比如:
public class PORETURN {
private String DOM_ID; }
比如这个外部需求要求字段是DOM_ID,这样写好吗?最后测试时发现,其变成了dom_ID。
public class PORETURN { @JSONField(name = "DOM_ID") private String DOM_ID;
}
这样其实还是有问题的,我们在定义View Object时,使用DOM_ID,还是侵入了java程序内部,在使用一些通用的框架还是会出现问题,比如mybatiplus,比如apache的BeaUtils.copyProperties就会应为命名不一致,出现问题。
public class PoReturn { @JSONField(name = "DOM_ID") private String domId; }
这样,类名和字段名都符合了java的命名规范,只需要在对接外部系统时,使用@JSONField转换就可以了。
2、职责划分,代码布局。
我们都知道单一权限职责,具体到开发中,比如controller层只接受请求,打印日志,具体逻辑在service层实现。很多时候,由于业务比较简单,我们就直接在controller中实现了。如果文件确实不大,很好理解,也可以。但是如果代码很长,使xxx.java超过了1000行,我觉得这样就很不合理了,造成了头重脚轻。
3、干掉重复代码。
我入行的时候,师傅就告诉我,在一个程序中,不要写重复的代码,《重构》也有强调。重复代码不仅很冗余,而且在业务变更时,修改很麻烦。但是,重复代码往往不是我们一个写的,比如我们写的代码和上一任的代码重复了,这是我们就要复用。
还有情况是,我们没有发现我们在两个地方写了相似的代码,只有很少一部分是不同的。这时需要我们有抽象能力,把这些相同代码抽取出来,形成模板代码,这样大大降低重复率。但是这样精心设计代码,会拖累开发进度,需要把握一个度。
4、抽象思维。
在高中时,我的数学老师总是给我们灌输一个概念:抽象思维,但是我也不清楚是啥,可能就是老子的道非道,非常道吧,我只是知道我们在做题时候要举一反三,生活中更多的是物理化学现象,却很难看到数学的踪影。但是如果我们能对现象进行抽象,就形成了数学模型,就可以用数学的方法解决了。比如观察一棵行道树的分支情况,每层数量类似于斐波那契数列。买东西是,商机给你找零,到底能有多少种情况,这是排列组合的问题。
在计算机中最重要的思想就是抽象了吧,或者说封装,那就是不用理解其实现原理,只需要使用即可,在不断的使用过程中,加深对系统的理解。
比如,对于物理硬盘的抽象,可以把它看成一个存储各种数据的对象,有read和write方法。
在设计操作系统时,就体现了主要的分层思想,比如说,os管理计算机硬件,app使用硬件是,只能通过os提供的接口调用,并且在os的设计中,在复杂os设计中,都广泛使用了分层设计的思想。在docker中image就是层层堆叠的,具体这是怎么实现了,应该是一个很专业的问题了。
这也诞生了一个重要的概念,这个一个软件对于另一个软件的依赖,不如最常见的web应用程序,一般需要mysql等数据库服务,需要tomcat等。
5、现身说法
真的被公司的后台代码恶心到了,一个FaultServiceImpl.java, 存在很多问题,现身说法一下,优雅的代码该怎么写。
A、文件巨大,整个文件有1000+行,什么都不看,这么大的文件,肯定存在设计问题,抽象程度不够,摊大饼式开发,一般来说上限300-500是比较好的。
详细看来,某个方法,有50+几乎重复的代码
import语句有100+,有的是springframework,apache,xxx.com等。
B、把通用方法写在专用类中,典型的没有结构设计,没有分层思想,瞎搞。
C、在CheckServiceJob.java文件中,模仿之前的Job,开了多线程,其实更本没必要,还导致了方法层数过深,无脑复制前人代码。
D、在AccessoryLibaryVo.java文件中,出现了同名不同包的类,这容易混淆,非常不好,可以简单区分一下,比如根据字段多少,命名为SimpleAccessoryLibaryVo.java
参考资料:《重构,代码整洁之道》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义