gpt4 book ai didi

java - 如何正确重构这个?

转载 作者:行者123 更新时间:2023-12-04 06:57:18 24 4
gpt4 key购买 nike

我很难找到正确重构这段代码的方法,以便尽可能少地重复代码,我有几个这样的方法(伪代码):

public List<Something> parseSomething(Node n){
List<Something> somethings = new ArrayList<Something>();
initialize();
sameCodeInBothClasses();
List<Node> nodes = getChildrenByName(n, "somename");
for(Node n:nodes){
method();
actionA();
somethings.add(new Something(actionB());
}
return somethings;
}

方法 sameCodeInBothClasses()在所有类中都相同,但不同之处在于 for 循环中发生的事情 actionA()并且它还向不同类型的列表添加了一个元素。

我应该对循环内的不同部分使用策略模式吗?

返回值如何(列表类型不同),该方法是否只返回 List<Object>然后我会转换为适当的类型?我应该传递我想作为参数返回的类吗?

最佳答案

适用的设计模式是Template Method ,而不是策略。

关于不同类型的项目,我会尝试泛化 parseSomething首先,像这样:

public <T> List<T> parseSomething(Node n){
List<T> somethings = new ArrayList<T>();
initialize();
sameCodeInBothClasses();
List<Node> nodes = getChildrenByName(n, "somename");
for(Node n:nodes){
method();
actionA();
somethings.add(new T(actionB());
}
return somethings;
}

不过,这可能不会立即对您起作用。您可能需要将泛型参数移动到类级别。

返回 List<Object>将不起作用,因为泛型集合是不变的:对于
任何两种不同的类型 Type1Type2 , List<Type1>既不是子类型也不是 List<Type2> 的父类(super class)型(即使 Type1Type2 是相关的,即一个是另一个的子类型!)。见 an earlier answer of mine有关这方面的更多详细信息。

因此,如果所有其他方法都失败了,那么快速而肮脏的解决方案确实是使用非通用 List .

关于java - 如何正确重构这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397885/

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