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

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

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

12025 次点击
所在节点    程序员
102 条回复
uCharles
295 天前
作为菜鸟,高内聚,低耦合是啥意思呢?有通俗的解释不
ITdream
295 天前
ITdream
295 天前
@uCharles
"高内聚" 和 "低耦合" 是软件设计中的两个重要原则,用于评估和指导软件架构和模块化设计。

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

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

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

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

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

还有我发现,很多人都从来不格式化代码的,明明 IDEA 系可以勾选提交时格式化
eatgrass
295 天前
@shangwuli 定期评审是一种很糟糕的做法
forgottencoast
295 天前
@sundev #2
这种直接重构就是在加油站玩火。
最好是切割重构,除了改 bug ,所有的改动都要在新的代码上实现,最后做一个访问记录,发现多长时间没人访问了就关了。
GeruzoniAnsasu
295 天前
嵌入式落后业界 20 年不是瞎说的
fdwjtz
295 天前
@clino perl 真是要老命,难写的一批
tuomasi
295 天前
你这才几千行代码,哪叫屎山,顶多屎橛
sundev
295 天前
@forgottencoast 都是没办法,整个公司的核心功能都在上面,重写的代价也非常高,况且这么长时间,要了解当时的需求也不可能了,如果要照着代码一行行翻译也不可能!
Jaosn
295 天前
感谢微服务,真的幸福很多
zpxshl
295 天前
一个 fragment 一万行代码
kkk9
295 天前
每一行代码都有它特别的作用,不要怀疑前辈们的代码水平,要多想想这么多年了,有没有涨工资,有没有认真工作。。。。
enchilada2020
295 天前
哈哈哈哈哈哈哈哈哈同是天涯铲屎人
genicsoft123
295 天前
哈哈哈爆炸。。。。
zhsso
295 天前
有没有一种可能
有其他线程也在调用 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