你真的思考过自己写的代码为啥这么垃圾吗?

开发 项目管理
大家所在项目组,一定遇到同类操作,但却有不同做法,尤其是祖传代码,一眼望去,可谓八仙过海各显神通。

[[429094]]

大家所在项目组,一定遇到同类操作,但却有不同做法,尤其是祖传代码,一眼望去,可谓八仙过海各显神通。

大部分程序员也觉得团队开发应该保持编程习惯的一致性。但普遍理解的一致性都表现在较宏观层面,比如,数据库访问是叫DAO还是叫Mapper,Repository?

团队虽然也有一些统一标准,但落地到编码,也没人一直给你 CR,所以要求就不是那么严格了。所以,我们才能欣赏到在代码写法百家争鸣。还是具体看几个案例来体会下吧!

千奇百怪的命名

这段代码可以了解到目前的分发渠道:

  • 网站
  • 只在Kindle
  • 全渠道

乍一看,你可能觉得没啥问题,可我就会好奇作者:

  • WEBSITE 和 KINDLE_ONLY 分别表示什么?
  • WEBSITE:作品只会在我们自己网站发布,KINDLE_ONLY:这部作品只会在 Kindle 的电子书商店里上架。
  • 二者是不是都表示只能在单独一个渠道发布?

Yes

  • 既然含义类似,为何不都叫 XXX 或 XXX_ONLY?

(⊙o⊙)…好像也是哦

所以,大家也看到了吧,类似含义的代码应该有一致的名称,就像很多团队都会把业务写到服务层,各种服务类类名也都是 XXXService。

不一致的名字,一般都表示不同含义。比如,对那些非业务入口的业务组件,它们的名字就会不同,会更符合其具体业务行为,如BookSender:将作品发到翻译引擎。

我料想,这段代码作者给枚举值命名时,只分别考虑了应该叫啥名,却忽略了这个枚举值在整体中的地位。

至此,重构途径就很明白了:

方案不一致

现在某系统要向另外一个系统发请求,需带一个时间戳,把这个时间戳按格式转成

String,主要做传输用,便于外部系统识别,也方便开发调试。

代码片段本身实现没问题,甚至还考虑到了 SimpleDateFormat 这个类非线程安全,所以,每次都创建一个新的 SimpleDateFormat 对象。

那我为什么还说它是有问题的呢?因为这种写法是 Java 8 之前的写法,而我们用的 Java 版本是 Java 8。

现在这是个Java8项目,完全可以使用 Java 8 的新日期时间API。所以项目也约定所有日期时间类型使用新API。

所以,这段代码本身实现没问题,但放在项目整体中,却没有和其它部分保持一致。

重构成使用新API即可:

一个项目应对同一个问题出现多个解决方案,没有统一约定,成员会根据自己的习惯随机选择方案,导致方案不一致。还比如判断字符串是否为空或空串,就有 Guava 和 Apache Commons Lang,都能做同样事情,所以,程序员也会根据自己熟悉程度选择其中之一来用,造成代码不一致。

这两个程序库是很多程序库的基础,经常因为引入了其它程序库,相应的依赖就出现在我们的代码中。所以,我们必须约定,哪种做法是我们在项目中的标准做法,以防出现各自为营。

代码中的不一致

在翻译引擎中创建作品的代码:

  • 首先,根据要处理的作品 ID,获取其中已审核通过的作品
  • 然后,发送一个 HTTP 请求在翻译引擎中创建出这个作品

看得出来什么问题吗?

这些代码不是一个层次的!首先是获取审核通过的作品,是个业务动作,接下来的三行其实是在做一件事,也就是发送创建作品的请求,这三行代码:

  • 创建请求的参数
  • 根据参数创建请求
  • 最后把请求发送出去

三行代码合力完成发送创建作品的请求,而这件事整体才是个完整业务动作。

所以,这个函数有的是业务动作,有的是业务动作的细节。所以重构如下:

分清代码处于不同层次,基本功就是分离关注点。一旦分解出不同关注点,还可进一步调整代码的结构。

像前面拆分出来的这个方法,我们已经知道它的作用是发出一个请求去创建作品,本质上并不属于这个业务类的一部分。

所以,还可通过引入一个新模型,将这个部分调整出去:

 

责任编辑:武晓燕 来源: JavaEdge
相关推荐

2018-02-25 11:00:34

代码开发程序员

2018-10-06 21:51:37

代码SOLID编程

2012-07-11 13:35:53

代码

2021-05-13 10:40:16

ThreadLocal代码Java

2010-01-21 10:23:53

C++代码

2019-06-14 10:56:43

JavaMaven编程语言

2015-07-17 10:02:48

写代码

2018-04-17 11:47:06

if代码参数

2021-07-21 10:10:14

require前端代码

2021-11-08 10:00:19

require前端模块

2018-09-30 09:36:58

CTO代码程序员

2017-12-19 15:20:47

代码应用架构

2020-03-12 07:42:49

代码程序员

2017-11-09 10:27:02

BPM信息化CIO

2018-10-07 06:30:40

代码设计模式面向对象原则

2010-01-20 17:23:03

C++编程语言

2020-04-17 14:25:22

Kubernetes应用程序软件开发

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系统数据库

2021-06-09 10:10:20

代码内存编程语言
点赞
收藏

51CTO技术栈公众号