现在,我正在重构一个遗留的Java项目,现在有一些问题。
它定义了一个从DataHolder
扩展的类名称Map<String,Object>
,并作为传递给类和方法的参数。
public class DataHolder extends Map<String,Object> {
}
public class Cls1 {
public void execute(DataHolder data) {
data.put("key1", someData);
}
}
public class Cls2 {
public void execute(DataHolder data) {
Object someData = data.get("key1");
}
}
...
DataHolder
实例有30多个类和100个方法,对于大多数实例来说,这是唯一的参数。当一个方法生成某些其他方法可能需要的值时,它将它们放入数据保存器中。而且,如果需要一些功能,只需从数据持有者那里获取即可。
该代码很难阅读,测试甚至重构。我正在尝试对其进行重构,但不知道该怎么做。
有什么好主意吗?
最佳答案
DataHolder似乎是一种单例,它确实会产生一些问题来理解和测试代码。可以用来摆脱单例的一般原则可能适用于您的用例。这是两个应用于您的execute方法的示例。Cls2#execute
只需要data.get("key1")
-重构过程的第一步就是将其传递给方法:
cls2.execute(dataHolder);
//becomes
cls2.execute(dataHolder.get("key1"));
这样,您可以删除所有“只读”依赖项。对于更复杂的示例,如果需要多个值,则可以传递包含所有相关信息的对象(希望它将比您的DataHolder更专业)。
至于
Cls1#execute
,它实际上会创建一个新值,因此应返回它,而不是将其放在全局数据结构中:public void execute(DataHolder data) { data.put("key1", someData); }
确实应该是:
public Object execute() { return someData; }
一个非常有趣的文章:Google guide on Writing Testable Code。
关于java - 如何重构使用无处不在的 map 的代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20921753/