重构实战: 重命名的小技巧

2023-03-07 14:12:46 浏览数 (1)

一个项目中多个feature同时进行。

说明:如果该项目同时只有一个人开发,直接修改就可以了。

场景一

  • 不符合命名规范

譬如: 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。 说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。 正例:aliyun_admin,rdc_config,level3_name 反例:AliyunAdmin,rdcConfig,level_3_name

重构过程中出现的问题:

团队中其它feature分支上的接口会报错。

数据库字段名被改了,但DAO层并没有进行相应的变更。在select或insert时,因为字段不存在而报错。

经典实践:

以将aliyun_rdc表中字段rdcConfig,修改为rdc_config为例。

(1)重命名有两个方案:

  • aliyun_rdc表中新增一个字段rdc_config。【上线成功后,需要做数据迁移】
  • aliyun_rdc表中将字段rdcConfig修改为rdc_config。再新增字段rdcConfig。

说明:新字段在测试环境不能设置为 NOT NULL。其它同学的分支上没有这个字段,如果是NOT NULL,则insert时会报错。 ps:如果这个项目只有一个人开发,直接修改就可以了。

(2)MyBatis Generator (MBG)重新生成DO时,使用ignoreColumn标签,剔除掉将要删除的字段。 譬如:

(3)上线脚本中,字段rdc_config要设置成NOT NULL。

说明:

不建议列上允许为空。最好限制not null,并设置一个默认值,比如0''空字符串等,如果是datetime类型,可以设置成'1970-01-01 00:00:00'这样的特殊值。

对MySQL来说,null是一个特殊的值,Conceptually, NULL means “a missing unknown value” and it is treated somewhat differently from other values。比如:不能使用=,<,>这样的运算符,对null做算术运算的结果都是nullcount时不会包括null行等,null比空字符串需要更多的存储空间等。

场景二

  • 与业务场景不匹配【基础类库中】 【基础类库:譬如微服务中项目A,项目B 都依赖的 xx-domain库】

重构过程中出现的问题:

团队中依赖此基础类库的其它feature分支,会编译不过。

基础类库中类名被重命名,其它同学的feature分支上没有这个变更,则会编译不过。

经典实践1:

升级基础类库的版本号。 由于所有基础类库的版本都是使用parent项目的version,那么所有依赖基础类库的版本号都要升级。【升级版本号的工作量会随着项目的数量而增加】

经典实践2:

1、不升级基础类库的版本号。在基础类库中使用新的类名新建一个类,属性及行为与老的类一致。 2、在自己的feature分支上,全部替换为新建的类。 防改漏的小技巧: (1)先升级一个小版本号 (2)在基础库中将老的类删除 (3)在自己的feature分支上使用新版本的基础类库

(4)根据编译报错来完成替换。 (5)替换完成后,在自己的feature分支上将基础库的版本号回退 3、上线成功后,在基础类库中将老的类删除并提交。

0 人点赞