重构——简化函数调用

2016-11-24  本文已影响54人  hklbird

1 Rename Method(函数改名)

修改函数名字以良好表达函数的用途。
Motivation:各种大师特别推崇的小函数编程风格。其核心在于给函数取一个好名字。这个取好名字的方法在于,首先想着给函数写注释,然后把注释编程函数名称。
做法:

2 Add Parameter

某个函数需要从调用端获得更多的信息。为此函数添加一个对象参数,让对象带进函数需要的信息。
Motivation: 最好不好用,因为过长的参数列表往往以为着坏味道。
做法与上一个相似。

3 Remove Parameter

删除函数某些不用的参数。
Motivation:增加参数以为着撒旦的诱惑。所以一般当函数不需要这么多参数的时候,删除参数。这里注意多态情况下不要如此,因为多态状态参数的作用域是发散的。
同样,和上一个方法相似。

4 Separate Query from Modifier(将查询函数和修改函数分离)

某个函数既返回对象状态值,又修改对象状态。建立两个不同的函数,一个负责查询,一个负责修改。
Motivation:我们需要让我们的函数simple。

5 Parameterize Method(令函数携带参数)

若干函数做了类似的工作,但在函数本体中却包含了不同的值。建立单一函数,以参数表达不同的值。
Motivation:多个函数做着类似的事,但因为少数几个值致使行为略有不同。在这种情况下。将这些各自分离的函数统一起来,并通过参数来处理那些变化情况,用以简化问题。
做法:

6 Replace Parameter with Explicit Methods(以明确函数取代参数)

针对该参数的每一个可能值,建立一个独立函数。千万别让函数的作用取决于参数值的不同。
Motivation:如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就该重构。参数字段会把函数的含义搞得不清楚。
做法:

7 Preserve Whole Object(保持对象完整)

你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。改为传递整个对象。
Motivation:因为对象修改字段是很容易的,而函数添加字段则是非常麻烦,甚至灾难性的。对象之间的依赖关系是决定是否用此重构手法的关键。
做法:

8 Replace Parameter with Methods(以函数取代参数)

对象调用某个函数,并将所得结果作为参数,传递给另一个函数。而接受该参数的函数本身也能够调用前一个函数,让参数接受者去除该项参数,并直接调用前一个函数。
Motivation:函数能通过其他途径获得参数值,那么它就不应该通过参数取得该值。
做法:

9 Introduce Parameter Object(引入参数对象)

同事出现的参数,用一个对象取代它们。
做法:

10 Remove Setting Method(移除设值函数)

类中某个字段应该在对象创建时被设值,然后就不再改变。去掉该字段的所有设值函数。
Motivation:不该改变的字段就不该提供令人误解的设值函数。

11 Hide Method(隐藏函数)

有一个函数,从来没有被其他任何类用到。将这个函数修改位private。
Motivation:重构往往促使你修改函数的可见度。提高函数可见度的情况很容易想象。一种特别常见的情况是:当你面对一个过于丰富,提供了过多行为的接口时。

12 Replace Constructor with Factory Method(以工厂函数取代构造函数)

当在创建对象时不仅仅是简单的建构动作,将构造函数替换位工厂函数。
Motivation:最显而易见的动机是在派生子类的过程中以工厂函数取代类型码。此外,如果构造函数的功能满足不了需要,用工厂函数代替它。工厂函数也是Change Value to Reference的基础。
做法:

13 Encapsulate Downcast(封装向下转型)

某个函数返回的对象,需要由函数调用者执行向下转型。将向下转型封装到函数。
动机:在强类型OO语言中,向下转型是最烦人的事情之一。因为这越俎代庖得告诉编译器某些应该由编译器自己计算出来的东西。而向下类型转换,往往隐藏着失败的深渊。但是如果使用的话,应该位编译器提供更精确的转换。
做法:

14 Replace Error with Exception

某个函数返回一个特定的代码,用以表示某种错误情况。
Motivation:和生活一样,计算机偶尔也会出错。一旦事情出错,你就需要有些对策。最简单的情况你可以停止运行程序,返回错误码,但这个完全是自杀。问题在于:程序中发现错误的地方,未必知道如何处理错误。当子程序出现错误,它需要让它的调用者知道这个错误,而调用者也可能将这个错误继续沿着调用链条传递上去。许多程序都使用特殊输出来表示错误。而异常处理机制,将错误处理和普通程序分开了,这使得程序更容易理解。
做法:

15 Replace Exception with Test(以测试取代异常)

面对一个调用者可以预先检查的条件,你抛出一个异常。修改调用者,使他在调用函数之前先做检查。
Motivation:异常是一个非常好的机制,然而异常也会被滥用。“异常”应该被用于非常意料之外的错误,而不应该成为条件检查的替代品。

上一篇 下一篇

猜你喜欢

热点阅读