重构手法12:Extract Class (提炼类)

 

某个类做了应该由2个类做的事。建立一个新类,将相关的字段和函数从旧类搬移到新类。

动机:一个类应该是一个清楚地抽象,处理一些明确的责任。但是在实际工作中,类会不断成长扩展。你会在这儿加入一些功能,在哪加入一些数据。给某个类添加一项新责任时,你会觉得不值得为这项责任分离出一个单独的类。于是,随着责任不断增加,这个类会变得过分复杂。很快,你的类就会变成一团乱麻。

这样的类往往含有大量函数和数据。这样的类往往太大而不易理解。此时你需要考虑哪些部分可以分离出去,并将它们分离到一个单独的类中。如果某些数据和某些函数总是一起出现,某些数据经常同时变化甚至彼此依赖,这就表示你应该将它们分离出去。一个有用的测试就是问自己,如果搬移了某些字段和函数,会发生什么事?其他字段和函数是否因此变得无意义。

另一个往往在开发后期出现的信号时类的子类化方式。如果你发现子类化只影响类的部分特性,或如果你发现某些特性需要以一种方式来子类化,某些特性则需要以另一种方式子类化,这就意味着你需要分解原来的类。

做法:1、决定如何分解类所负的责任。

       2、建立一个新类,用以表现从旧类中分离出来的责任。如果旧类剩下的责任与旧类名称不符,为旧类更名。

       3、建立“从旧类访问新类”的连接关系。有可能需要一个双向连接。但是在真正需要它之前,不需要建立“从新类通往旧类”的连接。

       4、对于你想搬移的每个字段,运用 Move Field (搬移字段)搬移之。

       5、每次搬移后,编译、测试。

       6、使用Move Method (搬移函数)将必要函数搬移到新类。先搬移较低层函数搬移到新类。先搬移较低层函数(也就是“被其他函数调用“ 多于 ”调用其他函数“者),再搬移较高层函数。

       7、每次搬移之后,编译、测试。

       8、检查,精简每个类的接口。如果你建立起双向连接,检查是否可以将它改为单向连接。

       9、决定是否公开信类。如果你的确需要公开它,就要决定让它成为引用对象还是不可变的值对象

你可能感兴趣的:(Class)