业余架构师 2013-11-26
转自:http://www.cnblogs.com/Kevin-moon/archive/2010/05/10/1731358.html
先从接触过的几个老项目经历来谈谈,对于老项目来说,大家在初步接触的过程中,大多总是抱着抵触的情绪,甚至有些是蔑视。总喜欢对以前的代码挑出一大堆的问题,接着就开始抱怨代码、抱怨以前的开发人员,经过一段时间郁闷的抱怨阶段后,处于职业的责任心,就很想去改变这一切,希望把自己认为好的方式给带进来,于是接下来的工作就是重构代码了。
这也许大多数开发人员都经历过,这种经历是辛酸的(因为重构工作虽然重要,但是得不到过多的认可,目前国内关注的是可用性,对于代码质量并没有得到应有的重视),也是甜蜜的(风雨之后总会有彩虹)。对于年轻的开发人员来说,见到彩虹的过程是痛苦、漫长地。他们都是在失败中成长,这些失败除了经验外,主要是由于太急功尽力了,盲目的重构!
盲目主要体现在:
1、在还没有对系统整体架构有个清晰认识的时候,就想用自认为新的技术或架构来替换。
2、根本不分析现有系统架构或程序存在的弊端,只是一味地谈设计模式,以设计模式中固有的一套来重构(在重构中,它只作为一个参考,而不是一个依据。)
3、重构比较随性,每个版本的开发都跳出架构之外随意带入新的设计思想
这种盲目重构后给系统会带来更多问题:
你会发现当你重构完后你的系统运行效率变低了,
系统中同时存在多种思想,新加入人员更难接手,
由于你没有完全了解系统,反而在你的重构当中带来了很多重复代码,
最悲剧的是你重构后的代码也被其他人当成垃圾,而进行重构。
那么我们怎么消除盲目呢!?
首先,了解目前项目是否存在问题,存在什么问题,这些问题是否能通过重构来解决,如果能,才进行重构,你的重构时间是需要公司给的,老板不会因为你说依赖性强偶合性低就同意的,你必须要通过问题来让他认识,关键的是只有通过问题才能得到重构时间和资源,并且你的工作才能得到认可,这是一个很现实的情况。
接下来,你要确定重构的对象,是针对架构还是局部代码,并且去设定一个理想的目标(为什么是理想的?因为我们不可能一步到位,理想和现实是有差距的,但是我们要做的是尽力去往理想上靠拢)。
如果是针对架构进行重构,那么这可不是一件轻松的事情,再真正开始之前需要做到以下几点:
1、全面的了解系统的过去,包括以前的架构/技术背景、业务需求
2、分析以前架构的问题,例如:可维护性低、在哪个方面已经不满足现有需求等等
3、查看至少80%的核心代码,最好有一定时间的真实在以前代码基础上编码的经历
做到上面几点就是为了保证你能有一个清晰的认识,做到知己知彼。接下来可以进入实质阶段了吗?不行,还少了一个很重要的东西,重构计划!
这种大范围的重构,在真实情况下,一般老板给予的时间和重构真正所需用的时间相差很大,所以重构的工作是需要往后延迟的,那么就会出现又要重构又要进行新需求的开发;还有这项工作不是一个人的事情,是一个团对,既然涉及到多人合作,除了共同的目标外,还需要有一定的评审机制,这是为了保证重构的方向一致,等等,在这些因素下要做好重构,就是需要重构计划的理由。
针对局部代码进行重构来说,也许会简单的许多,不过需要注意的地方是,你一定要符合现有架构的思想,在它的范围之内去思考。
其实这种方式的重构大多就是提取方法,或者是以真实业务流程的思路去重构现有的代码执行流程,以便易于理解,或者是降低程序之间的依赖性。要做到这些有个很重要的思维方式:
1、善于从某个事物中分析出什么是事物的本质和什么是事物的外部环境。
2、从很多不同事物中去发现共同点,并对这些共同点进行抽象化(举个简单的例子:对于宝马和奥迪,你应该把他们抽象化为汽车)。
为什么这样说,因为这些能带来重构代码所需要的:
1、在写代码过程中降低了依赖性,
2、抽象化的事物复用性更强
做好上述的所有就表示重构完成了吗!不可能,这只是一个好的开始而已,我们要做到持续重构,就像敏捷中提到的。
也许有的人认为不现实,因为项目经理不会在每个版本周期内给出这个时间,其实,我就纳闷了,为什么不给?!不给的原因一定在你,如果你期望是一周或者更久,那么谁都不会同意,一周的时间都基本都能做完一个版本的设计了,重构还需要这么久,如果真的需要就说明你前期的设计很差!我所希望的时间是两天左右,因为这只局限于很小范围内的变动。
如果你们很好的做这些,那么你的项目可维护性一定很好,并且加入你的项目会是一件愉快的事情,这并不是什么理想的事情,只要你持之以恒地去做,实现起来其实很简单。
以上这些就是个人关于重构的一些想法,也许光从文字看上去比较空洞,后面,将分享一些真实的重构案例,供大家参考和交流。
架构重构:
1、重构计划
代码重构:
2、提取获取交集的算法
" \ \ / /_ | / | _ \ / | / / _ | \ | | | / |. " \ \ / / | || |/| | |) | | | | | | | | | | | | | | _.