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

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 谢谢他先给我清空,还煞有其事地写个注释。

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

12497 次点击
所在节点    程序员
102 条回复
uCharles
2023-09-14 19:27:30 +08:00
作为菜鸟,高内聚,低耦合是啥意思呢?有通俗的解释不
ITdream
2023-09-14 19:34:05 +08:00
ITdream
2023-09-14 19:34:19 +08:00
@uCharles
"高内聚" 和 "低耦合" 是软件设计中的两个重要原则,用于评估和指导软件架构和模块化设计。

高内聚 (High Cohesion):
高内聚指的是模块或组件内部元素(例如函数、方法、类等)之间的联系和关联度。
具有高内聚的模块意味着模块内的元素都紧密相关,执行相似的任务或具有相同的责任。
高内聚有助于提高代码的可维护性、可重用性和可测试性,因为相关功能都放在一个地方。
示例:一个处理订单的模块应该包含处理订单、验证订单、计算总价等相关功能,而不是将这些功能分散在不同的模块中。

低耦合 (Low Coupling):
低耦合指的是模块或组件之间的相互依赖程度。
具有低耦合的模块之间的依赖性较少,它们应该能够独立地进行开发、测试和维护。
低耦合有助于提高系统的灵活性和可扩展性,因为更改一个模块不太可能影响其他模块。
示例:一个订单模块应该尽可能少地依赖于其他模块,如用户管理模块、支付模块等。

综合来说,高内聚和低耦合是追求良好的软件设计和架构的目标。通过将相关功能组织在一起(高内聚)并减少模块之间的依赖性(低耦合),可以创建更易于维护、扩展和理解的软件系统。这些原则有助于减少潜在的错误和提高代码的质量。
996bujiaban
2023-09-14 19:47:35 +08:00
冲动啊,十年前的也重构
ldyisbest
2023-09-14 21:14:16 +08:00
公司项目里面有一个 2000 行代码的方法,还有一个 4000 行方法的代码。json 、map 到处飞。
ldyisbest
2023-09-14 21:15:15 +08:00
公司项目里面有一个 2000 行代码的方法,还有一个 4000 行代码的方法。json 、map 到处飞。能跑就行
bequt
2023-09-14 21:49:54 +08:00
感觉到 品味屎山 的感觉
winterbells
2023-09-14 22:01:34 +08:00
我已经放弃了
耗费近一个月才将 50%的数据库代码独立出来
剩下的部分改过七八版了,每次都牵扯点别的地方代码导致没心情动了

base 里面还去一个个判断子类型,真是服了。项目里全 tm 相互引用的,真正的牵一发而动全身。

现在唯一能做的就是保证新页面的独立性,哪怕一个页面屎山了也无所谓,至少不影响别的地方重构

还有我发现,很多人都从来不格式化代码的,明明 IDEA 系可以勾选提交时格式化
eatgrass
2023-09-14 22:17:03 +08:00
@shangwuli 定期评审是一种很糟糕的做法
forgottencoast
2023-09-14 22:58:32 +08:00
@sundev #2
这种直接重构就是在加油站玩火。
最好是切割重构,除了改 bug ,所有的改动都要在新的代码上实现,最后做一个访问记录,发现多长时间没人访问了就关了。
GeruzoniAnsasu
2023-09-14 23:11:41 +08:00
嵌入式落后业界 20 年不是瞎说的
fdwjtz
2023-09-14 23:33:20 +08:00
@clino perl 真是要老命,难写的一批
tuomasi
2023-09-14 23:48:19 +08:00
你这才几千行代码,哪叫屎山,顶多屎橛
sundev
2023-09-15 00:11:54 +08:00
@forgottencoast 都是没办法,整个公司的核心功能都在上面,重写的代价也非常高,况且这么长时间,要了解当时的需求也不可能了,如果要照着代码一行行翻译也不可能!
Jaosn
2023-09-15 01:13:31 +08:00
感谢微服务,真的幸福很多
zpxshl
2023-09-15 01:58:00 +08:00
一个 fragment 一万行代码
kkk9
2023-09-15 02:04:21 +08:00
每一行代码都有它特别的作用,不要怀疑前辈们的代码水平,要多想想这么多年了,有没有涨工资,有没有认真工作。。。。
enchilada2020
2023-09-15 07:29:37 +08:00
哈哈哈哈哈哈哈哈哈同是天涯铲屎人
genicsoft123
2023-09-15 08:10:43 +08:00
哈哈哈爆炸。。。。
zhsso
2023-09-15 08:37:18 +08:00
有没有一种可能
有其他线程也在调用 scanThreadData->mcuFirmWare_path ,然后调 ScanFirewareBin(IS_NGFDFILE, ProductCodeStr)期间,这个线程有一定几率因为用了错误的 mcuFirmWare_path ,导致出错。然后某代💩山维护者发现,诶,先清空 mcu 固件路径好像就解决了

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

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

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

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

© 2021 V2EX