重构 新人求助,是需要简单重构还是推倒重写?

pengedy · March 18, 2015 · Last by liuyunfeng replied at January 24, 2019 · 8401 hits

最近接手了公司的一个 Rails 项目,发现这个项目的 Controllers 有 3118 行,而 Models 有 1762 行,也没有 Service 之类的分层。 我在摸清楚这套项目的业务逻辑的同时,也发现这里面的代码有各种不科学,所以问题来了:是重构,还是推倒重写?(时间相对充裕)

我第一次遇到这样的事情,没有太多相关经验,求指点迷津。

建议都不,能运行就行了!!!

#1 楼 @flowerwrong 真的么... 现在维护这个项目,感觉开发越来越困难了。

才 3000 行,以前碰到过单文件就 3w 行的都有! 看看需求更改的频率,评估一下后面项目的生存期,再打算吧。

才 1762 行。。。。这是俺厂一个函数下 if 语句的的长度

#4 楼 @est ……………………我写代码少,不要欺负我=。=

#3 楼 @king1990_cool 那样规模的代码,内部结构是怎样一种状态呢?

先写测试,再考虑重构

3000+ 行?所有 Controllers?还是其中一个

#7 楼 @foxzool 明白了,多谢。 #8 楼 @a4652097 所有 Controller。这些数据是rake stats出来的。

#5 楼 @pengedy 从代码行数看得出来贵厂负责人口味,重构是断然不会涨工资的。能拖就拖,不能拖了果断闪人。

我厂 app 部分也是差不多你说的情形,非常混乱,来了个高手来重构,搞了 3 个月屁都没见到一个。

#10 楼 @est 嗯嗯这些我明白。因为现在代码规模不是很大嘛,所以才有重构的可能性,如果是特别大的规模,那真的就不考虑重构这回事了。

#11 楼 @pengedy 重构是有风险的,不是你一个人的事情,你的时间是很充裕,但是这个系统的用户还要配合你测试。你能保证重构后,之前的所有功能都不受影响吗?

#12 楼 @libuchao 所以上面有人提到先写测试再重构。重构过程中开发进度稍微放缓,原有系统不下线。

#11 楼 @pengedy 你觉得这个坑会长期干下去还是可以重构的。

重构成本 = 立项做新系统 x 3

#14 楼 @est 嗯嗯,现在我已经大致清楚了。只是好奇,下面这个公式是如何得来的? 😄

听听同事和 boss 的意见,再决定。

直观感觉这种项目不可能重构,除非有极好的配套测试。

#13 楼 @pengedy 测试是要写,但是测试的覆盖率也不是 100%,人工测试也肯定是少不了的

#16 楼 @liwei78 看来测试是重点。明白了。

差不多情况 拆不动 后面写的时候再抽逻辑吧 重构还要保证正常更新和线上的没问题 工作量会很大的

这是准备跳坑啊

不要读了几个博客就想当然认为你必然写得比别人好。别人的可能不好看,但至少能用。

新人的话就稳妥一点,碰到哪里改进哪里,一点点地改善,至少还有人帮你盯着。

if it ain't broke, don't fix it 切记,切记

too young too simple,这是我维护过的 application,看 controller 行数 model 行数 和 code to test rational

#23 楼 @317583395 Orz... 我真是忍不了这个+_+

| Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 3424 | 2635 | 38 | 321 | 8 | 6 | | Helpers | 543 | 535 | 0 | 6 | 0 | 87 | | Models | 351 | 257 | 30 | 8 | 0 | 30 | | Mailers | 0 | 0 | 0 | 0 | 0 | 0 | | Javascripts | 13629 | 8412 | 0 | 711 | 0 | 9 |

#10 楼 @est 你们一个 if 语句下面就有千把行,再牛的高手也不好使...

我现在的项目,测试比较惨,就不贴了…… 重构是为了更低成本地持续改进项目,而不是为了更优美的结构。如果你 自信已经搞懂了项目已有功能,并且有更好的办法让未来的功能实现起来更轻松 ,就小块小块地重构。不然碰到新功能或者要修复 bug,就只能沿用已有代码的逻辑,不停的打补丁,最后可维护性会越来越差。

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  2523 |  2010 |      50 |     263 |   5 |     5 |
| Helpers              |    35 |    31 |       0 |       5 |   0 |     4 |
| Models               |  2537 |  1938 |      39 |     197 |   5 |     7 |
| Mailers              |   175 |   141 |       8 |      24 |   3 |     3 |
| Javascripts          | 18302 | 13417 |       0 |    1995 |   0 |     4 |

建议从最容易的地方开始入手,逐渐将系统重构得逻辑比较清晰就应该可以了。不到万不得已,不要大刀阔斧,否则容易受伤。

代码的总行数不重要,关键是代码结构是否足够清晰,架构好的项目即使功能再多也易于维护

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          | 47826 | 19878 |     364 |    1836 |   5 |     8 |
| Helpers              |   196 |   165 |       0 |      17 |   0 |     7 |
| Models               | 15133 | 10429 |     289 |     643 |   2 |    14 |
| Libraries            |  1216 |  1003 |      29 |      65 |   2 |    13 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                | 64371 | 31475 |     682 |    2561 |   3 |    10 |
+----------------------+-------+-------+---------+---------+-----+-------+

学到了新的命令 rake stats,哈哈,原来一直孤陋寡闻了

没事不用重写,可以进行一些小规模的重构,观察是否带来问题,逐渐的改善系统。

@billy @jimrokliu @cuterxy @darkbaby123 感谢各位提供宝贵意见,我确实没有足够的把握直接重构,那就分小块来做吧,首先要弄好测试,嗯嗯。

#15 楼 @pengedy x3 这个公式这样来的。

重构本身开发成本,x1 重构要兼容之前的运作方式 x2 平滑迁移之前的数据和模型到重构版本 x3

真是累死人的事情。

Reply to foxzool

赞同 完善的单元测试才能让重构变得不那么危险

You need to Sign in before reply, if you don't have an account, please Sign up first.