同事代码写的太烂了怎么办?

2021-09-03 15:22:39 +08:00
 wh469012917

1. 命名不规范

一个项目中控制器命名能出现好几种变形,一个对的都没有:

UserContol 、UserControl 、UserContoler 、UserControler

包括模型也是:

UserMode 、UserModle 、UserModol

变量命名更是离谱,单字母和语言关键字乱用:

a 、b 、c 、class 、string 、byte 

再然后就是缩写和语意不符合的:

  1. context 缩写成 c
  2. UserImage 缩写成 ui
  3. template 写成了 temple

数据表和模型名称不一样的:

  1. 表名叫做 user_rule, 模型名叫做 RuleUserModle
  2. 表名叫做 order_mgr,模型名叫做 OrderManageMode
  3. 表名叫做 order_manage,模型名叫做 OrderMgr

因为命名不规范,他后面出现了很多删除 A 表的数据,却用了 B 表的模型来操作,导致错删~

字段名称和值不统一的:

  1. 创建时间字段 creat_time 、create_time 、created 、created_time 每个表都不一样
  2. 而且值有保存时间戳,有的保存时间字符串

2. 业务代码

如果说命名混乱就算了,至少比较好改,但是业务实现也混乱:

  1. 没有任何封装概念,重复代码都是直接复制粘贴;没有任何分层的概念,控制器-模型一把梭过去,一个控制器方法 300 行起步
  2. getUserById(string username) 命名叫做通过 ID 查询用户,传入的参数却是 username
  3. getUserList() 命名叫做获取用户列表,返回值却是某一个特定条件的单个用户
  4. 所有的请求都不做参数验证,并且也不做逻辑验证。删除操作,都没判断用户是否有权限删除,直接给他删除了,删除了还不算,有些关联的数据不删除,这一下子就出现了一堆的脏数据
  5. 查询启用状态的用户列表,先把所有用户拉出来,然后在代码中遍历循环过滤禁用的用户

3. 数据库设计

数据库设计更混乱不多说了,就说几点:

  1. 关联的外键命名没有任何规范,全凭心情;比如订单表上正常情况下要有一个用户 id 字段(一般命名为 user_id),他这个字段命名叫做 user_order,要么就是叫做 user_function,反正就是自己看得懂
  2. 以上好歹设计了外键,有些干脆不设计外键;用户收货地址表上,正常情况要有一个 user_id, 用来标记这个地址是哪个用户的;他直接在用户表上创建了一个 addres 的字段,然后把地址表的 ID 用逗号分隔拼接成字符串,保存到用户表上,每次查询用户地址列表都是取出来分割,然后一条条去查;删除就更暴力了,直接删除地址,用户表的 addres 字段都不更新
  3. orm 默认都支持维护数据的创建时间,以及数据的软删除; 但是他因为创建时间字段命名不规范,orm 默认维护的是 created_at 字段,他表设计是 creat_time,然后在模型中配置的字段又是 create_time,导致框架不会维护,于是就全部自己实现
  4. 数据软删除也是配置错误,然后自己代码中去维护,写的乱七八糟

公司同事写的代码,是我这么多年来见到的最烂的代码,但是因为人家来的年限资历比较长,也不好意思去提这个事情,有没有啥好的办法,自己重构吗?

9536 次点击
所在节点    程序员
115 条回复
wh469012917
2021-09-03 15:53:02 +08:00
@ytll21 领导注重功能完成和稳定性,其他的没怎么关心过
wh469012917
2021-09-03 15:53:32 +08:00
@sonyxperia 我现在也是,命名什么的自己慢慢调过来,但是不做大改,特别是数据库,免得背锅
wh469012917
2021-09-03 15:54:15 +08:00
@AlanDSF 对的,我也是只敢做基本的命名调整等等,数据库设计碰都不碰;那个同事倒是说要是觉得设计不合理可以改,不过我不敢动
wh469012917
2021-09-03 15:54:48 +08:00
@AlanDSF 拼音好歹是正常的命名啊,猜猜也能看得懂,我们这边直接用 class byte string 做变量名了
wh469012917
2021-09-03 15:55:25 +08:00
@ouyc string := "foo" byte := "bar" 这样,go 语言允许用关键词做变量名,但是 ide 会给你提示
wh469012917
2021-09-03 15:56:01 +08:00
@redial39 你可以学学我这个帖子里面的垃圾代码,看看能不能更上一层楼
wh469012917
2021-09-03 15:56:45 +08:00
@szuwl 那肯定的,我当然不可能傻到去说人家,也不会去找领导打小报告,反正在屎上堆屎就行了
sprite82
2021-09-03 15:57:15 +08:00
感觉像是说我的同事,idea 都有单词提示的,他就是要写错的,代码各种复制粘贴,能不公用就不公用。
一个 Controller 接口能连续写 1000 行,代码文件随随便便就是 4000+行,导致我 idea 卡到爆,打一个空格 cpu 能飙 100%持续好几秒。
注释和实际执行是相反的
try catch 不捕获异常,控制台、日志、 出参全看不到具体错误
用 JSONObject 作为 json 入参接收,如果是表单提交 那好,形参列表十几二十个家常便饭,包括 service 调用也是十几个形参
调用其他第三方接口,手写 json 字符串 + 号拼接(很多参数)
配置写死在代码里,上线出问题,就改代码继续发
分页查询:计算总条数时,select * ... 然后 list.size() 获取总条数,再计算页数(计算这段代码复制了 n 次,也没抽出来)。
还有很多不想说了
wh469012917
2021-09-03 15:57:21 +08:00
@parrotdance 差点被同化了
7gugu
2021-09-03 16:00:03 +08:00
让大家 review 代码咯,不要干自己重构这种傻事
statement
2021-09-03 16:00:56 +08:00
我觉得和自己也有关系,一般和同事的水平是上下五厘米 /狗头
wh469012917
2021-09-03 16:07:51 +08:00
@7gugu 团队人也不多,代码审核估计推行不开
whisky221
2021-09-03 16:09:49 +08:00
笑死,看的血压上来了
noe132
2021-09-03 16:14:19 +08:00
怕不是看了如何写出无人能维护的代码那篇文章正在深刻实践
yogogo
2021-09-03 16:18:50 +08:00
@sprite82 service 层代码行 2000+倒是很正常
NexTooo
2021-09-03 16:20:31 +08:00
这不是我遇到的事情吗
大半年过去了,同事已经拍拍屁股离职好几个月了,我依然时不时还得为了他遗留的代码擦屁股。。。

反正我接手第一件事:CodeFormat,连换行、空格都不规范看着太痛苦了
第二件事就是规范命名,先把乱七八糟没根据意义起名或者拼写混乱的都改了
然后接着才是慢慢梳理代码……抽出方法,合适的时候直接重构部分模块。都是有空的时候搞搞,确定这块后续还有需求的才改,不然加班都改不完
iSteven
2021-09-03 16:20:48 +08:00
论 code review 的重要性 [滑稽]
huntagain2008
2021-09-03 16:21:45 +08:00
本人非程序员。
以前 C#代码我看着别人写 String,我就问他怎么不写成原型的 string 。他跟我说 String 比较快。
后来我知道技术领队都是让老手先检查一下那人的代码。我就释然了。实际上他会的东西比我多。
要是以前遇到你写的这样的情况,我早就跑了。
NexTooo
2021-09-03 16:22:40 +08:00
代价就是有些大的模块,我只是拆了部分重构之后,屎山有点坍塌的趋势,已经出现好几个原来没有的 bug,复现规律还没找到……摊手。可能回头差不多了直接推倒重构了。
CodeJr
2021-09-03 16:24:27 +08:00
解决不了问题,那就解决制造问题的人

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799688

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX