现在,我正在重构一个遗留的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/

10-12 01:16
查看更多