重构--概念和坏味道[自己的理解]

在软件开发中项目失败是很正常的,大部分的项目都在延期的边缘,但是为什么会造成这样的结果呢?
我们有很强的工程师,对项目管理也很完善,为什么还会造成这样的结果呢?
为什么项目做到了一定的程度,客户只要求一个小的修改我们都会带出来一大堆的问题呢?
一切的问题都在于你检查过你写的代码了吗?你对你的代码重构了吗?

最近翻开我的一本老书,这本书已经在我的书架上睡了快两年了,当时买的时候看了部分开头,学了一小部分
最近开始真的带项目的时候使用了上面说的一部分方法后,才发现这本书真的很好,又一次翻开了.
从这篇文章开始,我会把我学到的,并且在项目中已经应用的重构方法写出来.

什么是重构?
重构就是当程序写完后,进行的一种代码整理的过程.重构实际上是一种在代码写好之后改进它的设计.
奇怪了为什么不先设计好了再开发呢?我第一次看到重构的时候就有这种想法.最后得出的答案是,不管你
的代码经验和水平有多高,你没有办法再一开始就把项目设计的很完美.

在我这个项目开始的时候,代码写的很肮脏,错误的命名,多次的复制粘贴代码,高度的耦合,修改一个地方
牵扯一堆地方.如果开始有好的设计,那么这些问题都不会发生.那么现在放下你手头的事情对你的程序
进行重构吧.下面就开始正式的介绍重构的方法.

在开始之前大家要明确这样的一个词,代码的坏味道.那些代码是有坏味道的呢?
(1)重复的代码.
    如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将他们合二为一.
(2)过长的函数.
    越短的函数会存活的时间更长,存活的更好.
(3)过长的类.
    如果想利用单一的类做很多的事情,那么该类的内部会出现很多的instance变量,重复代码就要接踵而至了.
(4)过长的参数列.
    太长的参数列难以理解,太多的参数会造成前后不一致,不易使用,一旦你需要更多的数据,就不得不修改它.
(5)发散式变化.
    一旦我修改软件,我希望只在一处修改就好,如果不能做到这点,该坏味道就出现了.\
(6)烟雾弹式修改.
    一旦软件进行修改,你必须去对多个类的内部做小修改,该坏味道出现了.
(7)依恋情结.
    函数对某个类的兴趣高过对自己所处之host类的兴趣,坏味道出现了.`
(8)数据泥团.
    两个类中的相同值域,多个函数中的相同参数,该坏味道出现了.
(9)基本类别偏执.
    如果一个类只为了做一两件事而创建,却付出了太大的额外开销,该坏味道出现了.
(10)switch惊悚现身.
    尽量少用switch语句,因为switch语句的问题在于重复.
(11)平行继承体系.
    如果你发现某个继承体系的类名称前缀和另一个继承的类名称前缀完全相同,坏味道出现了.
(12)冗赘类.
    如果一个类的所得不值其身价,消失吧.
(13)夸夸其谈未来性.
(14)令人迷糊的暂时值域.
    某个instance变量仅为某种特定情况而设置.
(15)过度耦合的消息链.
(16)中间转手人.
    讨厌的封装,对外部世界隐藏其内容.
(17)狎昵关系.
    两个类过于亲密,花费太多的时间去探究彼此的似有成分.
(18)异曲同工的类.
    如果两个方法做同一件事,却有不同的名字.
(19)不完美的程序类库.
(20)纯稚的数据类.
    该类的特性是,拥有一些值域,一级用于访问这些值域的函数,其他的一无所有.
(21)被拒绝的遗赠.
    子类应该继继承父类的方法和数据,但是父类都写成似有的,不希望子类继承,坏味道出现了.
(22)过多的注释.
    你发现一个类有很多的注释,是因为这个类很烂,那么这里的注释就是坏味道了.

    ok所有的坏味道的条件都知道了,下篇文章开始介绍重构的方法.

转帖请注明
http://www.cnblogs.com/winnerzone/archive/2007/12/02/979763.html

                          
WINNERZONE


posted @ 2007-12-02 00:37 H2O、winnerzone 阅读(2102) 评论(18)  编辑 收藏 所属分类: 重构

  回复  引用    
#1楼 2007-12-02 00:47 | 微软亚洲研究院长 [未注册用户]
期待张博这篇文章,来原于项目实践。
  回复  引用  查看    
#2楼 2007-12-02 01:39 | Nathan2008      
主要还是人不是万能的,不能预测未来
而且难免疏忽,再加上时间紧~

其实代码重构是我们经常做的事情,就是代码优化了。

  回复  引用  查看    
#3楼 2007-12-02 09:27 | lazylu      
可怜的是在国内的开发环境下,不要说事后重构,就连事前设计都往往没时间做好……
  回复  引用    
#4楼 2007-12-02 10:12 | bisou [未注册用户]
我们公司现在就是这样啦 完全犯了上面说的所有地方
每个人都在改啊改啊,补丁罗补丁 谁都不想碰 唉
  回复  引用  查看    
#5楼 2007-12-02 10:33 | 金色海洋(jyk)      
(1)重复的代码.
如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将他们合二为一.

=====================

保存数据(也就是持久化)的程序是不是很相似呢?结构是不是相同呢?那么是不是应该合一呢?

我是想问一下,在做保存数据的时候,写了多少代码?有没有重复的呢?
是不是表越多,函数(程序或者叫做类)就越多呢?
  回复  引用  查看    
#6楼 2007-12-02 11:09 | Marklee      
请楼主透露一下那本书是啥名字
  回复  引用    
#7楼 2007-12-02 13:41 | 幻想の猪 [未注册用户]
书名应该是
重构--改善即有代码的设计

  回复  引用  查看    
#8楼 [楼主]2007-12-02 22:40 | winnerzone      
@幻想の猪
重构--改善即有代码的设计
@金色海洋
后面我会介绍重构的方法,我打算把这本书的方法全部写出来.
实例程序用C#写,如果写完了后面我会用一个比较大的实例统一的写下方法的应用.
@lazylu
往往是因为时间不够才不去做项目前的设计,但是项目中的重构一定要做.

我的确是在写书里的东西,但是是按照我理解的来写.有兴趣的朋友可以去买书看.
  回复  引用  查看    
#9楼 2007-12-02 23:11 |       
基本上把 refectoring 看一遍,然后再找出里面不合理的idea,那么就懂了。

其实里面有的重构并不好,反而更加乱。实践中自己运用最好。好像书中就说过,什么开始重构:需要的时候。重构不是为了追求代码的完美和漂亮。
  回复  引用  查看    
#10楼 2007-12-03 08:54 | 乔疯      
看上去很美,但我不认为现实中有太多人有时间去重构.

我参与的多半是不大的项目,走的是这样的怪圈:设计,编码,客户要求修改功能,于是本来就不怎么好的设计就被改得乱七八糟(修改N次以上),项目延期,一团乱并勉强达到功能的程序提交给客户.
  回复  引用  查看    
#11楼 [楼主]2007-12-03 09:33 | winnerzone      
@乔疯
大多数人都进入了这个怪圈,我也是,但是我发现使用了重构后的代码比以前清晰,修改起来更方便了.前提是只使用一部分而不是全用,毕竟优美的代码会带入一群初学者(包括我)进入一个大迷宫.
  回复  引用  查看    
#12楼 2007-12-03 09:49 | Enzo      
楼主看的这本书叫什么啊
  回复  引用    
#13楼 2007-12-03 10:10 | 大幅度反对法 [未注册用户]
重构--改善即有代码的设计
这本书,我看了两页,有点难懂,现在正在做我的枕头那,浪费呀。
有空再拿出来看看
  回复  引用  查看    
#14楼 [楼主]2007-12-03 16:30 | winnerzone      
@大幅度反对法
我看第一遍的时候也是非常难懂,所以再看第二遍的时候把我自己理解的写出来,以便大家更好的理解这些.
  回复  引用  查看    
#15楼 2007-12-03 20:44 | ∈鱼杆      
--引用--------------------------------------------------
大幅度反对法: 重构--改善即有代码的设计
这本书,我看了两页,有点难懂,现在正在做我的枕头那,浪费呀。
有空再拿出来看看
--------------------------------------------------------
我到觉得这书非常好,经典。我是手边书,经常翻阅。
  回复  引用  查看    
#16楼 2007-12-03 21:12 |       
恩。虽然不经常翻阅。但是过了几遍。是本有启发意义的书。能够养成好习惯。
  回复  引用    
#17楼 2007-12-04 01:08 | 明年今天 [未注册用户]
这本书我和电子版,不知道是否有必要在去买本书了?大吓指点下?

我心里也有这样的问题:为什么开始不设计好?

好和架构/代码都是经过好多次重构得来的吗?

为什么现实和想像的差距那么大,我感觉我一直都在写垃圾代码.
  回复  引用  查看    
#18楼 [楼主]2007-12-04 09:15 | winnerzone      
@明年今天
书对于我来说就是坐车的时候看的.如果你可以看进去电子版的,可以不必买书.
没有一个项目是开始就能把所有的东西都设计好的.因为项目是人定的.

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-15 12:07 编辑过
 
另存  打印