给定:LegacyControllerClass
扩展 a 的A MonsterFrameworkClass
(人们只是生活多年的非常令人讨厌的框架的一部分)。框架类做了很多魔术,从默认构造函数中的大量逻辑到反射加载类的静态块。
中的许多生命周期方法LegacyControllerClass
,它们会改变全局状态。该execute()
方法是一千条线,具有您能想到的所有弊端。
public class LegacyControllerClass extends MonsterFrameworkClass {
//Life-cycle method
public void validate(){...}
//Life-cycle method
public void preExecute() {...}
//Life-cycle method
public void execute() {
//oodles of legacy code here:
// examples: call static methods of 'Util' classes
// lots of new X().y(..)
// call databases, services
// Even call super.execute()!!
// More rubbish
// More rubbish
}
}
好的,现在行动的场景是 execute() 方法。我正在向这些穷人介绍测试驱动开发,通过测试他们称之为“故事”的项目。“故事”涉及向 responseProperties 添加一条错误消息,以便视图(jsp)可以读取并显示它。伪代码类似于:
if (error) {
Build the error message
Add the error message into the responseProperties
}
不幸的是,该代码必须在方法中的垃圾之间进行混杂execute()
。
我的问题是:我能做的最好的事情是什么?我可以提出的解决方案是:
- 提取两种方法
rubbish1()
和rubbish2()
- 以任何期望在我的测试代码中将它们存根(例如;-设置错误标志)
- 将我的代码放在
rubbish1()
和之间rubbish2()
我开始以这种方式实现它,但这MonsterFrameworkClass
确实妨碍了我:比如静态加载、加载ResourceBundle
随机属性文件的构造函数魔法等。
是否有替代方法来处理相同的问题?
小小的免责声明:我肯定会购买 Michael Feather 的“Working with Legacy Code”并将其一饮而尽,但 SO 似乎是一个唾手可得的果实。