gpt4 book ai didi

java - 如何重构使用遍历 map 的代码?

转载 作者:行者123 更新时间:2023-11-29 05:31:32 28 4
gpt4 key购买 nike

现在我正在重构一个遗留的 Java 项目,现在遇到了一些问题。

它定义了一个类名DataHolderMap<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");
}
}

...

有超过 30 个类和 100 个方法正在使用这个 DataHolder例如,对于其中的大多数,它是唯一的参数。

当一个方法生成一些其他方法可能需要的值时,它只是将它们放入数据容器中。如果它需要一些,它只需从数据持有者那里获取它们。

代码难以阅读、测试甚至重构。我正在尝试重构它,但不知道该怎么做。

有什么好主意吗?

最佳答案

DataHolder 似乎是一种单例,它确实会产生理解和测试代码的问题。可用于摆脱单例的一般原则可能适用于您的用例。以下是应用于您的执行方法的两个示例。

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com