标签:style blog http ar io color 使用 sp for
当你无法获得一个类的源代码或者没有权限去修改这个类的时候,你对于这种为你服务的类,你可能会出现需要别的需求的时候,比如一个Date类,你需要能够让他本身直接返回出他的后一天的对象,但他没有,这个时候你就需要暂时使用Introduce Foreign Method来做过渡,并且在适当时候通知作者把这个Foreign Method搬移到他所属于的自己的类中去。
这种情况其实也很多,特别是当你在团队当中,当有别人写了一个类的时候,你会去利用这个类去做你想要做的事情,但如果你发现这个类并没有提供你所要的功能,如果你可以去修改源代码,那当然可以。你可以直接在类的源代码中增加一行你所想要的功能。但如果你不能获取源代码,你就只能在客户端编码,补充你所想要的那个函数。
当然,如果你所处的客户类只使用这项功能一次,那没什么大不了,你可以完全额外添加多出来的处理逻辑。甚至你可能都不需要原来提供服务的那个对象本身,但是,如果你需要多次去使用这个函数,你就不得不去重复这些代码,还记得吗
重复代码是软件的万恶之源。
这些重复代码应该被抽出来运用Extract Method放进同一个函数中去,当然如果你迫不得已执行本次重构,这也给了你一个明确的信号:这个函数原本应该在提供服务的类中实现。
如果你发现自己已经为一个服务类增加的大量函数,或者发现有许多类都需要同样的外加函数,你就不应该再使用本次重构,而应该使用Introduce Local Extension。但是请不要忘记,Foreign Method始终是权宜之计,如果有可能,你仍然应该将这些函数通过Move Method搬移到他们的理想家园。如果你无法进行这样的搬移,你也可以把这个外加函数交给服务类的拥有者,请他帮你在服务类中实现这个函数。
做法:
例子:
Date newStart = new Date(perviousEnd.getYear(), perviousEnd.getMonth(), perviousEnd.getDate() + 1);
在例子中我们可以看到,我在客户端代码里需要一个跨越一个收费周期的函数,但实际Date并不提供这个函数,所以我只能自己写一个冗长的new。当然,如果出现一处这种地方我们不需要太在意,但是如果出现多出,我们就需要使用Extract Method进行重构,这个函数就是Date类的外加函数。我们可以这么声明
Date newStart = nextDay(perviousEnd); static Date nextDay(Date arg) { // foreign method, should be on Date return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1); }
可以看到,我们让这个函数变成static这样可以保证我们不使用客户端类的任何特性,同时我们把这个函数的第一个参数作为服务类对象传进,这样我们以后在进行Move Method的时候可以得到无参化的简洁接口。
『重构--改善既有代码的设计』读书笔记----Introduce Foreign Method
标签:style blog http ar io color 使用 sp for
原文地址:http://www.cnblogs.com/rickyk/p/4168893.html