`
fanjf
  • 浏览: 296591 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

浅谈项目代码重构

 
阅读更多

浅谈项目代码重构

 

       重构(Refactoring就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

 

1 重构无法避免

重构无法避免的原因:

1)一个大型软件,持续不变的是需求,需求的不断变化导致设计架构和代码的不断改变,重构无法避免。

2)一个完美得可以预见未来任何变化的设计,或一个灵活得可以容纳任何扩展的设计是不存在的,导致重构无法避免。

3)日新月异业务变更,导致功能的变化;每日业务数据量的增大,需要性能的提升;产品的深层次架构调整优化,需要革新原有代码。从而,导致设计的调整再所难免。

4)一个IT团队中,不是所有的程序员开发风格都一样,这样就导致代码质量参差不齐,形成代码Bad Smell (代码坏味道Kent Beck),因此重构无法避免。

 

2 一个只会开发新功能代码,不会重构老功能代码的程序员,充其量只是一个合格的程序员。

 

       一个大型项目难免会有人员更替,一个程序员,也就不可避免需要维护别人代码,接管别人代码。程序员如果只是单纯开发新功能,或者只偏向喜欢开发新功能。这样的程序员会固步自封,不利于个人成长。

      

Martin Flower在《重构》中有一句经典的话:"任何一个傻瓜都能写出计算机可以理解的程序,只有写出人类容易理解的程序才是优秀的程序员。"

 

       一个优秀的程序员,不仅能写出优秀的代码,更应当有能力重构别人的代码,并且敢于向质量差的代码挑战。

 

3 如果你不敢重构老功能代码,说明你对该功能还不够熟悉,对原设计思路还不清楚,或是你的技术能力还有待提升

      

       当你给某一个功能开发一个新功能点,不要急于主管臆断,片面猜测,急于开发,而应当多看,多思考,然后再把新       功能代码和原代码糅合到一起,如果糅合后代码设计结构不够完美。那么需要重构原代码。

利用重构技术开发软件时会把时间分配给两种行为: [重构][添加新功能],两种行为可交替进行,一会重构,一会添加新功能。

      

 

4 项目开发过程中,风险无处不在,重构可能带来新问题,以及上线发布的问题和风险,但,这不是不重构的借口。

 

       一个软件,只要改动代码,就会存在风险。重构的最终目标不是解决无法添加新功能的问题,而是提升软件本身的生命周期。

一、重构的好处:

1)最大限度规避潜在长远风险;

2)提升原有代码的可维护性、可阅读性(容易理解的代码很容易维护和增加新功能。代码首先是写给人看的,然后才是计算机看的)

3)增加该功能的可扩展性;

4)延长整个系统项目的生命周期;

5)学习别人的思想和学习别人的处理逻辑;

6)有利于最快找到程序错误;(清晰的代码可以更方便的找到bug,重构可以写出更强健的代码)

7)有利于提高编程速度,提高设计和编码水平;

 

       二、重构的时间

  (1)随时进行重构(重构是一种开发的习惯,需要培养自己随时随地重构)

  (2)事不过三,代码重复不要超过三次(否则就要“抽”出来)

  (3)添加功能时候并一一重构(添加新功能之前,分析并重构,从而更方便添加新功能)

  (4)修补错误时(通过重构改善代码结构,能够帮助你找出BUG原因)

  (5code review(有经验的开发人员Review代码时能够提出一些代码重构的建议)

 

      三、构筑自动化测试体系,最大限度降低重构风险

    如果你想进行重构,首先要拥有一个可靠的自动化测试环境。

(1)自动化测试代码的价值

    程序员代码编写只占小部分时间,大部分时间用于调试和查找BUG。自动化测试能够大幅减少由于重构代码及新增功能引人的BUG

(2)XUnit测试框架

    XUnit是一个单元测试框架,用于编写自动化测试用例。每次对代码重构后运行一遍测试用例,检查是否引入了Bug

 

       基于上述,因为怕重构带来问题,只是一种借口。

 

引述别人的话:【重构已经变成了我的另外一种生活方式,变成了我每天的面包与黄油,变成了我们整个团队的空气与水,以至于无须到书中寻找任何神谕。】

                                                                                                        

 

附录:代码坏味道(Code Bad Smell

重复的代码(这才是真正万恶之源,鄙视一切Ctrl+C/COPY

  过长函数,会导致责任不明确/难以切割/难以理解等一系列问题

  过大类,职责不明确,垃圾滋生地

  过长参数列(面向对象不是说说而已)

  发散式变化,一个类会响应多种需求而被修改

  散弹式修改(其实就是没有封装变化处,由于一个需求,多处需要被修改)

  依赖情节(一个类对其他类过多的依赖)

  数据泥团(如果数据有意义,就将结构数据变成对象)

  type code,使用Class替代

  switch,少用,考虑多态

  过多平行的类,使用类继承并联起来

  冗余类,去除它

  夸夸其谈的未来性(过度设计)

  临时值域,封装它

  过度耦合的消息链,使用真正需要的函数和对象,而不要依赖于消息链

  过度的deleate

  过度使用其他类private值域

  重复作用的类

  不完美的类库,(类库老了,使用者也没办法阿)

  纯数据类(类需要行为)

  不纯粹的继承(拒绝父类的接口的类)

过多注释,(注释多了,就说明代码不清楚了,尤其是完全废弃的代码,就该直接删除)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics