重构屎山的痛。我已经坚持了三四天了,必须要在这里发泄下,不然会炸。

2023-09-14 14:32:13 +08:00
 villivateur

因产品整合需求,要把一个 C++ Qt 写的上位机软件重构到 PyQt 中。主管不同意用现有框架直接包装原有的 Qt 程序,要我直接按需求重构。(可能主管也早就意识到了这个屎山迟早会炸)

这个屎山有多屎呢:

  1. 十年前的老代码,经手过无数人
  2. 编译一下,平均一个文件十个 warning ,不乏长度为 9 的数组访问第 9 个变量这种奇葩事
  3. 变量名潇潇洒洒,驼峰的,下划线的,大写的,小写的,混合的
  4. 真正实现了“低内聚,高耦合”,三个线程,几十个函数,共用一个一百多行的结构体……
  5. 有个功能是初始化两个设备(互相独立),两个设备各要执行几个函数,结果代码里面,是 A 设备先执行两个函数,B 再执行两个,再执行 A 的……不懂的人还以为这两个设备有啥奇妙的联系。
  6. 驱动模块和业务模块居然用 extern 来共享一个变量……

还有很多……

给大家欣赏一下屎山的一角:

scanThreadData->mcuFirmWare_path = "";    //清空 mcu 固件路径
scanThreadData->mcuFirmWare_path = ScanFirewareBin(IS_NGFDFILE, ProductCodeStr);

这个 mcuFirmWare_path 是个 string 类型的数据,我 TM 谢谢他先给我清空,还煞有其事地写个注释。

看这个代码,每看一行我都要理一下自己的脾气。

12335 次点击
所在节点    程序员
102 条回复
villivateur
2023-09-15 08:42:02 +08:00
@zhsso 没有可能,我看了,就在这用
dream4ever
2023-09-15 08:47:05 +08:00
听说我,谢谢你,因为有你,今天很开心
zhsso
2023-09-15 08:47:18 +08:00
@villivateur 那还好,最多多了一行无效代码,至少不是因为其他莫名其妙的原因😂
locoz
2023-09-15 08:57:50 +08:00
@codeself #1 AI 都不一定看得懂屎山…太多屎的屎山还是得要人工描述指引,要不然写出来的还是会带屎
UIXX
2023-09-15 09:17:58 +08:00
别说了,看到 w 大写已经浑身难受...
hokori
2023-09-15 09:31:53 +08:00
诶 我也在一个类似的 qt 项目 和你说的一样的感觉 但是我选择不动,继续堆料. 不敢重构.
villivateur
2023-09-15 09:32:28 +08:00
@UIXX 那是你没注意到 ScanFirewareBin 还拼错了,哈哈
shunia
2023-09-15 09:39:55 +08:00
领导花了不少钱找了一个外包团队花两年时间做了一坨实际功能只包含一个页面、代码量不超过 5000 行的屎山,并且 bug 多多,性能也不满足需求。
然后我刚花一个月重写了这些不懂基础原理(辣鸡老框架)也不知道业务逻辑(从产品到代码基本 0 文档)的功能,谁知这几天开会说这些都没用了,重新做一套别的,目前的东西几乎不可复用。

你才三四天就崩溃了?工作还得继续,活儿还得继续接不是。
zzz2021zzz
2023-09-15 09:40:38 +08:00
@zjj19950716 #12 哈哈,真知灼见
nenseso
2023-09-15 09:43:49 +08:00
是时候展示一波屎上雕花的技术了
justfindu
2023-09-15 09:46:05 +08:00
我看我三年前写的项目也是一样的屎山, 但是我真的不想改 哈哈哈哈
Chad0000
2023-09-15 09:49:16 +08:00
@ITdream #43
说到低耦合:我大胆地设计了一套框架,命名为独立服务/模块,正在公司内部开展。即每个服务和模块都是独立的,完全不依赖于其他服务和模块(当然基础设施层还是要依赖的)。像你举的那个例子,在我的设计里连订单卖什么东西都不是由订单负责的了。

想看看这种设计最终会不会成功,哈哈。
hankai17
2023-09-15 09:59:28 +08:00
我记得 QT 框架 有莫名的 BUG
要规避这些 BUG 可能代码写的就很奇怪
不知道是不是这个原因
nevermoreluo
2023-09-15 10:08:54 +08:00
也在重构说是,还是自己提议的,不过侥幸的是主业务逻辑十分单一。
我只重构主业务逻辑并保证主业务,其他的拆分出模块来,尽量不改函数里面的逻辑(是的之前有一个全局单例,好几个线程,很多个功能全部挂在这个单例上),确保下次有人再改,只用对某一部分进行修改或者重构。

剩下的除非真的是 bug ,否则我就告诉他们,好多年了,That's a feature 。

害 我感觉一次不要面对太多,解决主要矛盾先
9i5NngJHI4P7dm42
2023-09-15 10:13:13 +08:00
"不乏长度为 9 的数组访问第 9 个变量这种奇葩事"

这是什么意思, 没有理解
xzyDeathGun
2023-09-15 10:56:53 +08:00
@odifjg9384hg 数组长度为 9,最大索引是 8,估计说的是索引为 9 的元素吧, 数组越界了
uCharles
2023-09-15 10:59:37 +08:00
@ITdream 感谢答疑
macha
2023-09-15 11:19:39 +08:00
至少楼主贴出来的这 2 行代码没啥大毛病。
其他看文字描述的代码好像问题比较大。
1055619878
2023-09-15 11:25:37 +08:00
敢重构屎山不是勇士就是大神
lightjiao
2023-09-15 11:27:54 +08:00
不如用 C# 重写

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

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

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

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

© 2021 V2EX