重构代码一般从哪些方面入手?

2013-09-06 15:10:35 +08:00
 scarlex
最近想重构以前的代码,但不知道应该从哪些方面入手。
有木有人可以给点经验?
6191 次点击
所在节点    程序员
35 条回复
davepkxxx
2013-09-06 15:21:24 +08:00
模块化
cxe2v
2013-09-06 15:42:26 +08:00
从评估重构的代价入手
flowerains
2013-09-06 15:44:13 +08:00
重构是世界上最恐怖的事情
bengol
2013-09-06 15:51:00 +08:00
profiling
sethverlo
2013-09-06 15:52:28 +08:00
没人说要从先补完测试入手么…………
davepkxxx
2013-09-06 15:53:58 +08:00
@sethverlo 补完测试就没时间重构了
sethverlo
2013-09-06 15:57:42 +08:00
@davepkxxx 最近才觉得测试其实挺重要的,特别是对于重构来说
davepkxxx
2013-09-06 16:05:18 +08:00
@sethverlo 重构完毕之后再测试,因为重构的时候代码结构都是不稳定的。
scarlex
2013-09-06 16:32:28 +08:00
@davepkxxx 模块化一直都有,只是觉得添加新功能的话,旧代码会变得比较那啥。
@cxe2v 目前项目不算太大,就是想重构一下某些功能的代码,让那些代码变得更加灵活。
@sethverlo 做完功能基本都会写测试。
wangccddaa
2013-09-06 16:43:22 +08:00
最近一直在做这块的事,我来谈谈自己的体会
1 首先要了解整个系统的结构
如果在不了解系统的大体的结构情况下做重构,这个相信意义是不大的。
2 为什么要重构?
是系统的效率太低?还是代码有大量的重复,模块间的耦合严重,甚至类间的关系依赖性太强?找出病因才好对症下药,重构需要有针对性。
3 合理的重构计划
一个小的APP可能很好重构,但是当有一个有几万源代码的系统中全部做重构是不明智的,可以分阶段,按功能模块逐个做重构,要不然时间跨度太大容易导致身心疲惫。
4 重构中的一些体会
兼容:兼容以前旧的数据,这个对于web 程序来说还好点,对于客户端来说就比较麻烦了,当一个新的版本发出的时候,并不是所有的用户都很乐意升级的,一旦旧的版本的程序crash 很多用户可能就不再使用你的产品了。
扩展:如果这一块做不好,下一个程序员在使用你新设计的模块时候还得继续重构,重构的意义也不大,一方可以展望未来可能有的功能,预留好接口,另一方面是:抽象。

UI和业务逻辑的分离:在系统版本稳定后发现很多时候我们是在修改UI ,业务逻辑修改的一般不是很多。MVC 这个设计模式还是还有道理,view 和Control 尽量分开。

大量重复的代码:我们可能发现很多时候一个功能有很多分支,只是有稍微一点差异,可能就要写两个函数来区分下,但是两个函数中可能大部分代码是一样的。我们可以把相同的代码抽取出来成为一个子函数。
还有一个场景是这样的:有时候程序的行为需要变动下,但是处理这个行为的类都是在各个Class 中处理的,这样我们就需要做个找出执行这个行为的函数,并修改,很麻烦,这个时候如果将这个行为抽象出来,由统一的一个Class来管理是不是更好。

使用宏,枚举等:很多时候我们的程序中出现很多的数字,比如0,1 ,199 ,1024? 其他程序员第一眼看到一般都不知道什么意思,即使通读一遍程序后也很可能和原作者理解的产生偏差,这种情况下使用宏来说在合适不过了。特别是在多出使用这个数字或者 string 的时候。

设计模式:我认为她给出解决我们经常遇到一些问题的方法,但是为了使用设计模式才进行重构的话有点勉强。

本人新手,仅个人拙见,轻拍。
scarlex
2013-09-06 16:53:17 +08:00
@wangccddaa 感谢你的经验 :-D
darasion
2013-09-06 22:49:20 +08:00
先清理垃圾,删除历史遗留并且无用的东西。
然后再看代码结构,就清晰了。
nil
2013-09-06 22:55:37 +08:00
两个动机:
convention,代码风格上的,重构受强迫症折磨;
新需求,调整一下代码结构方便添加,修改功能。
另外,测试,步步为营很重要
ldehai
2013-09-07 00:43:53 +08:00
先检看的不顺眼的搞起来。每次重构只改动一个问题,然后测试,通过后继续找下一个。
dongbeta
2013-09-07 00:51:32 +08:00
重构过很多个系统。

简单来说,首先读懂原始代码,搞清楚人家那么做的理由,这个阶段要心怀敬意。

然后进行代码清理和模块化,此时要忍住别添加东西。

最后再按照模块逐个逐个替换,以系统稳定为先。

替换完毕之后,就看你的新架构的扩展性了。
dongbeta
2013-09-07 00:52:46 +08:00
还有,重构期间,除非非常必要,否则不要对旧代码不要做改进类的改动。
zhangdawei
2013-09-07 13:03:02 +08:00
曾试图重构c语言嵌入式系统的部分功能,发现太难入手,好说难做。
最后顺其自然不管了。
banxi1988
2013-09-07 13:08:06 +08:00
怎么没有人推荐这本书:
重构:改善代码的既有设计
Mutoo
2013-09-07 13:47:24 +08:00
“@scarlex:做完功能基本都会写测试。"

噗,看到这句我就笑了……所有的TDD的书里都有句话叫“测试先行”
feuvan
2013-09-07 15:24:51 +08:00
重构很多时候就是上套新代码用新bug代替旧bug
慎重考虑重构。

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

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

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

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

© 2021 V2EX