以前看过一点这本书的英文版本,感觉相当不错,但是由于英文水平有限,总是感觉里面有些说法对我来说比较生涩,特别还有一些理论性的东西,如果只看英文,基本上是无从查起的.好在这本书有了中文版(也许早就有了,我可是才刚刚找到),高兴之余,细细品读,写写笔记,潦记于此.
先看看书中有关重构的定义:
重构的定义:在
不改变代码
外在行为的前提下,对代码做出修改,以
改进程序的
内部结构。本质上说,重构就是在代码写好之后改进它的设计。
这个定义说得很清楚了,基本上不需要进行任何的说明。我们只要将它当作原则去遵照就好了。
然后书中讲了:
快速而随性(quick and dirty)的设计一个简单的程序并没有错。
于是我就有这样的问题了:
什么规模的程序才值得重构?
然后书中给了我这样一个回答:
如果你发现自己需要为程序添加一个特性,而代码结构使你
无法很方便的那么做,那就先重构那个程序,使特性的添加比较容易进行,然后添加特性。
重构之前要做这样一些准备:
重构的第一步--为代码建立测试环境。
重构之前,首先检查自己是否有一套可靠的测试机制。这些测试必须有自我检查能力。
下面是一些摘录:
首先在代码中找出函数内的局部变量和参数。任何不会修改的变量都可以被当成参数传入新的函数,至于会被修改的变量就需要格外小心。如果只有一个变量会被修改,可以把它当作返回值。
在找出一个函数的逻辑泥潭并将之提练到另外一个函数中的时候,要格外注意返回值。如果你经常犯这样的错误,那么一定确保在修改前后函数的调用结果相一致。
代码应该表现自己的目的,这一点非常重要。
阅读代码的时候,我经常进行重构。这样,随着对程序的理解逐渐加深,我也就不断地把这些理解嵌入代码中,这么一来才不会遗忘我曾经理解的东西。
几个重构的方法(下面的伪码是我自己写的):
1、Extract Method (提取方法)
2、appending assignment ,operator+=( 附添赋值动作)
这两种重构方法结合的形式为:
重构前:
A=0;
A++;
if(expression)
A++;
重构后:
A=0;
A+=function1();
TypeOfA function1()
{
if(expression)
return 2;
else
return 1;
}
3、Replace Temp with Query(字面上用查询取代临时变量)
利用所谓的query method来取代临时变量。由于class内的任何函数都可以取用(调用)所谓query methods,所以它能够促进比较干净的设计,而非冗长复杂的函数。
Replace Temp with Query的伪码例子:
A=0;
while(expression)
{
A++;
}
return "The Result is "+A;
上面A是一个临时变量.所以可以用一个querymethod来取代:
TypeA function1()
{
A=0;
while(expression)
{
A++;
}
return A;
}
这样主程序可以这样写:
return "The Result is "+function1();
继续摘抄:
重构可能会存在另外一个问题,就是性能。原本代码只执行一次循环,在重构以后可能要执行三次。如果循环中的语句耗时很多,就可能大大降低程序的性能。单单为了这个原因,许多程序员就不愿进行这个重构动作。但是请注意这里只是“可能”。除非进行评测,否则无法确定循环的执行时间,也无法知道这个循环是否经常使用以至于影响系统的整体性能。重构时程序人员不必担心这些,优化时才去担心它们,但那时候你已经处于一个比较有利的位置,有更多选择可以进行有效优化。
使用Form Template Method(字面上建立模板方法)可以进一步减少重复代码。这会在书后面的章节讲到。
posted on 2007-06-15 22:53
littlegai 阅读(345)
评论(0) 编辑 收藏 引用 所属分类:
我的读书笔记