gpt4 book ai didi

Java 语义 - 有没有办法写得更好?

转载 作者:行者123 更新时间:2023-12-04 14:21:50 25 4
gpt4 key购买 nike

我正在构建一个 Spring 后端。我有一个 Controller ,它获取一个“搜索对象” - 一个具有 10 个字段的对象,其中只有一个应该被填充,所以搜索功能(我没有编写,但需要对其进行更改和重构)被编写像这样:

if( param1 != null ) user = getUserByParam1(param1);
else if ( param2 != null ) user = getUserByParam2(param2);
.
.
.
else if(lastName != null || lastName != null) user = getUserByName(firstName, lastName);
else user = getUserById(id);

if(user == null) throw costumException;
return user;

请注意最后的 2 个特殊情况——其中一个检查 2 个参数的可用性而不是一个,并将它们都发送到同一个函数(可以在其中一个字段中处理 null,但不能同时处理两者),默认情况下假设正在传递一个 ID(如果它不是 - 它被 if (user == null) 处理后检查以抛出异常)。

有没有办法重构这段代码使其更具可读性/美观?我可以使用任何设计模式或已知方法来做到这一点吗?或者它实际上是编写这种功能的最佳方式?

我做了很多思考,但找不到更好的方法。我有一个想法,以某种方式将填充的字段名称及其值发送到另一个函数,该函数将在字段名称上“切换大小写”并将值发送到适当的函数,但它并没有真正节省太多代码(因为我仍然需要手动迭代所有字段以找到已填充的字段)而且我不确定它是否更具可读性。

我对 Java 也很陌生,所以我不知道所有可用的 API 和接口(interface),也许你可以向我寻求帮助。

最佳答案

Note: This is simply a workaround for your quite monstrous method. As mentioned in the comments, your endpoint tries to do too much. It would be much better to create many different endpoints which all only need the required parameters. Makes it a lot easier to understand than just to see 10+ if-else statements



您可以创建一个数据- class包含所有可能的参数:
public class UserRequest {
private String lastName;
private String firstName;

// more fields, constructors, getters, setters etc.
}

然后有一个 interface看起来像这样:
public interface UserRequestResolver {
User resolve(UserRequest request);
}

然后可以实现此接口(interface)以依赖于给定的参数(如果存在)。返回一个找到的 User或者干脆 null .

下一步是,创建一个 List<UserRequestResolver> resolvers ,并添加不同的实现,使用 Java8+,您可以使用 lambda:
resolvers.add(r -> r.getParam1() != null ? getUserByParam1(r.getParam1()) : null);
resolvers.add(r -> {
if(r.getFirstName() == null && r.getLastName()) return null;
return getUserByName(r.getFirstName(), r.getLastName());
});
// etc.

然后当收到 UserRequest您可以简单地遍历 resolvers并取第一个不是 null 的返回值:
for(UserRequestResolver resolver : resolvers) {
User user = resolver.resolve(request);
if(user != null) return user;
}
throw costumException;

如果你是 Stream 的粉丝s,那么你可以用这个替换上面的for循环:
return resolvers.stream()
.map(resolver -> resolver.resolve(request))
.filter(Objects::nonNull)
.findFirst()
.orElseThrow(() -> costumException);

关于Java 语义 - 有没有办法写得更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59659482/

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