【发布时间】:2020-04-26 19:02:46
【问题描述】:
我正在构建一个 Spring 后端。我有一个控制器,它获取一个“搜索对象” - 一个具有 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 和接口,也许你可以向我求助。
【问题讨论】:
-
你有多少种不同的获取用户的案例?
-
您的搜索对象是某种地图吗?
-
检查是否可以使用 Java 8 中的谓词 API。
-
这里的问题是端点试图做的太多了。 10 个参数在单个端点中处理太多了,并且由于它们是理想的互斥的,因此您应该让一个端点处理一个参数。复杂的参数对象和单个端点似乎并没有给您带来任何优势,至少基于提供的代码。非常相关:softwareengineering.stackexchange.com/questions/388026/…
-
在软件工程或代码审查交流中问这个问题不是更好吗?
标签: java spring refactoring