关于重构-献给所有为老系统擦屁股的同学
来源:互联网 发布:c语言经典例题100道 编辑:程序博客网 时间:2024/04/29 10:20
最近重构了很多老系统,在程序员眼里有‘坏味道’的老项目,发现好系统优点都是一致的,坏系统各有各的问题,今天我们就着重聊一下系统的重构,也是对自己近阶段工作的总结。
1 为什么要重构系统
重构系统的原因对程序员来说,无怪于一下几点
(1) 谁写的系统啊,这么垃圾,看着都烦哎,
(2) 自己写的系统,被PM催着上线,只好先以直线式的思维设计,先写好上线,但久而久之,发现系统好烂啊,怕后面接手的人骂我(看第一条)
(3) BOSS瞅了你一眼,说:”这是你写的系统啊!”。
开个玩笑!
相信是程序员都会遇到上面的问题。上面也只是说了表象,真正一个项目需要重构的原因,无怪于两点。
(1) 功能模块划分乱,各种功能纠结在一起,看个逻辑看半天都看不懂;或者多次copy代码修修改改,修改功能要一个类一个类排查,一个功能分散在多个地方,一改改一坨。
(2) 代码效率低下
运行效率低下:运行太慢
实现效率低下:10行代码搞定的事情写了100行
2重构项目的形式有哪一些
下面我们来说一下重构代码的形式
(1) 整个系统模块划分不清楚,生搬硬套了一套模块系统上去(典型的就是将三层架构硬配套到所有应用程序中,我三层架构是无敌的),一般在错误的架构方向下,类的职责划分会非常纠结,以至于类的功能划分也是纷乱嘈杂的。
这时候需要重新设计架构,理清模块职责,花费时间较长
(2) 类及方法的职责划分不清楚,类或方法即具有职责A,也具有职责B(笔者就发现过一个1000行的方法!,6000行的类)或者一个功能在类或方法1和类或方法2中都是存在的等等等等
这个时候需要从中抽象出各个不同的功能点,单独进行设计。
(3) 方法效率低下
这个我总觉得它是属于代码优化的范畴,是最小的一种重构。
(4) 现有架构无法满足程序效率的需要,需要重新设计。
这种重构比较特殊,大部分是由于老系统的技术架构不能满足现在的效率需求,需要重新选择技术架构,让系统提升处理能力。这种我们暂且不表。
每一个项目都有它自己所独特的缺点,做重构前需要先看明白它的缺点属于哪种类型,然后再进行重构的设计。
3重构的步骤:
(1) 发现缺点,制定方案
想要重构需要先确定你重构的级别,是整个项目模块不清,还是某几个类和方法惹人讨厌,或者,更小的,我想把这个方法的300行代码用30行代码搞定。
这里就必须要说一下模块的划分了。
模块是为了实现某一个功能的类的集合。
模块有大有小,有底层模块,有上层模块,不管他们的区别是什么,模块中的类,都是为某一个特定的功能而写。与本模块功能无关的类,不应该放到此模块中。
很抽象是吧,相同功能,谁不知道呢,那我们说些具体的,怎样划分模块
抽象,还是抽象。
抽象的过程,便是一个找到事物共同点的过程,这是一个仁者见仁,智者见智的事情,就比如有一堆球,有红的,有黄的,有足球,有网球,有的人按照红的黄的分,有的人按照足球网球分,都是说的通的。
那究竟谁对呢?
按照以后对修改最有利的情况分
比如我写一个数据请求分发,然后将得到的数据吐出的系统,下面有多个数据源,每个数据源请求方式是不一致的,请求结果返回的方式也是不一致的,有同步,有异步,有直接登录FTP取等等等等,后续还要接多个数据源,那么这时候的模块划分就应该以数据源的角度来划分。
但是如果是相同的系统,数据的请求,返回,处理都是一致的流程,后面也许需要加进一步的数据处理,筛选流程,那么就应该以数据处理流程中的阶段来划分模块,
最后说一说层
我认为层是模块划分的副产品,模块划分清楚了,层本身就出来了,底层模块组成底层,高层模块组成高层,所以不需要刻意的划分层次,划分模块就可以了。
重构方案的选择
如果是比较小的重构,修改方法代码什么的,改完,做好单元测试,功能测试就可以了。
如果是比较大的,就需要慎重了,保证线上代码良好运行,又要大范围重构,确实是一个技术活。
这里说一种方法,整体模块划分好了之后,先写底层模块,然后按照功能,一个功能点一个功能点将现有逻辑切换到新的底层模块,然后逐步向上重构,最终将所有功能点的代码全部替换掉,重构完成。
这里说的功能点是对外的功能,这样能保证在完成之后,能够非常快速的进行功能点的回归测试,防止功能点漏测的情况。
在这里要说的是,千万不要好大喜功,一次吃个胖子,全盘重构后上线,笔者就因为这样的一次重构,吃了一次亏。
(2) 打代码
这就不说了
(3) 测试,测试,测试
理想是丰满的,现实是骨感的。大规模重构不出几个故障,怎么好意思呢!
玩笑话哈。
但一定要记住,重构是一项有风险的运动,搞不好,会出故障的!!!
所以,后面测试非常重要,必须要经过充分测试后才能上线,切记切记。这也是上面让大家一个功能点一个功能点进行重构的原因,因为后面好测试啊。
PS:关于重构,重新架构,重写等等。
有一位原同事有一天问了我这样一个问题,重构,重写等等好多重的名词,每个词都代表一种优化代码的方式。
其实我个人并不太在意这些名词上的区别,我所讲的,并且追求的是如何将老系统进行优化,以达到心目中的赏心悦目,我给它起了个名词,叫重构罢了。
个人看法^_^
- 关于重构-献给所有为老系统擦屁股的同学
- 献给计算机专业的同学(转载)
- [转]献给计算机专业的同学
- 献给计算机专业的同学 (转载)
- 【转】献给计算机专业的同学
- 【推荐】2010年--献给所有为梦想奋斗的程序员
- 献给那些所有为理想打拼的人们
- 献给所有的女性
- 献给所有的“日本人”
- 一个仓库系统的经历,献给所有的IT人.....
- 献给android sdk 不能更新的同学
- 献给那些“无兴趣一族”的同学
- 献给android sdk 不能更新的同学
- 同学就是老的好
- 学习java(二)-----关于jdbc连接的"擦屁股"问题
- 老同学
- 老同学
- 老同学
- html 头文件 meta的使用
- 获取状态栏 标题栏 高度
- 如何在Mac中使用Android SDK,使用adb工具避免出现-bash: adb: command not found
- 类加载机制
- discriminator-value
- 关于重构-献给所有为老系统擦屁股的同学
- 在线将ppt转换成pdf格式的方法
- Ubuntu12.4 下 WebRTC编译 【转】
- C#==>匿名方法
- qt程序发布windeployqt
- 面向对象的static关键字(类中的static关键字)
- HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)
- WinForm打造一款类似 Chrome 风格的 TabControl
- 百度云此链接内容可能涉及侵权,分享的文件已经被取消等屏蔽问题的解决方法