新生方法
思想:
当需要往一个系统中添加特性且这个特性可以用全新的代码来编写时,建议你将这些代码放在一个新的方法中,并在需要用到这个新功能的地方调用这一方法。你可能没法很容易地将这些调用点置于测试之下,但至少可以为新编写的那部分代码进行测试。
实施步骤:
(1)确定修改点。
(2)如果修改可以在一个方法中的一处地方以单块连续的语句序列出现,那么在修改点插入一个方法调用,而被调用的就是我们下面要编写的、用于完成有关工作的新方法。
(3)确定需要原方法中的哪些局部变量,并将它们作为实参传给新方法调用
(4)确定新方法是否需要返回什么值给原方法。如果需要的话就得相应修改对它的调用,使用一个变量来接收其返回值。
(5)使用测试驱动的开发方式来开发新的方法。
(6)使原方法中被注释掉的调用重新生效。
新生类
时机:
- 所要进行的修改迫使你为某个类添加一个全新的职责。
- 想要添加的只是一点小小的功能,可以将它放入一个现有的类中,但问题是我们无法将这个类放入测试用具。(提升可测试性)
修改步骤:
(1)确定修改点。
(2)如果修改可以在一个方法中的一处地方以单块连续的语句序列出现,那么用一个类来完成这些工作,并为这个类起一个恰当的名字。然后,在修改点插入代码创建该类的对象,调用其上的方法,然后将刚插入的这几行代码注释掉。
(3)确定需要原方法的哪些局部变量,并将它们作为参数传递给新类的构造函数。
(4)确定新生类是否需要返回什么值给原方法,如果需要,则在该类中提供一个相应的方法,并在原方法中插入对它的调用来获得其返回值。
(5)使用测试驱动的开发方式来开发这个新类。
(6)使原方法中(第一步)被注释掉的代码重新生效。
外覆方法
时机:
- 创建一个与原方法同名的新方法,并在新方法中调用更名后的原方法。
- 如果只是想增加一个尚未有任何人调用的新方法,就可以采用这一形式
步骤:
对应时机一
(1)确定待修改的方法。
(2)如果你的修改可以在一处地方以单块连续的语句序列出现,那么将待修改方法重命名,并使用其原先的名字和签名创建一个新方法。在这么做的时候记住要签名保持。
(3)在新方法中调用重命名后的原方法。
(4)为欲添加的新特性编写一个方法(当然,还是编写测试在先),并在第2步创建的新方法中调用这个方法。
对应时机二
(1)确定待修改的方法。
(2)如果修改可以在一处地方以单块连续的语句序列出现,那么用测试驱动的开发方式编写一个新方法来容纳新的特性。
(3)创建另一个函数来调用新旧两个方法。
外覆类
装饰模式