java - 太多的 if 语句
问题描述
我正在使用 Spring-Boot 和 Java 11,并且我的服务变得过于臃肿且难以阅读,因为它有太多的 if 语句。为了简单起见,让我们说我们有这个对象:
public class Holiday{
private Enum type;
private LocalDate date;
private LocalTime begin;
private LocalTime end;
private boolean active;
}
在我的服务中,如果两个或多个假期在同一天,我需要执行一些逻辑。这就是它变得复杂的地方,因为我必须检查不同的用例。
例如:
public class MyService{
if (holiday1 == PUBLIC && holiday2 == CUSTOM) {
if (holiday1.getDayTime() == FULL_DAY && holiday2.getDayTime() != FULL_DAY) {
DayTimeEnum dayTime = getDayTimeOfHoliday(holiday2.getBegin(), holiday2.getEnd());
if (dayTime == FULL_DAY) {
//doSomething...
}
if (dayTime == SECOND_HALF_OF_DAY) {
//doSomething...
}
//....and much more if-statements....
}
}
上面的代码只是显示我的问题性质的伪代码。在我的实际实现中,我需要做更多的检查和验证。所以我的代码变得非常混乱而且不可重用......
我做了一些研究并试图找出更少硬编码和使用更少 if 语句的替代方案。
这个想法是在他们自己的类中拥有一些验证规则,并使它们在任何地方都可以重用。我希望能够根据用例链接/组合这些规则。
我正在尝试以功能方法重构代码。我想要一份功能/行为列表,如有必要,我可以应用和组合。
我看过功能接口,我喜欢组合谓词的想法,所以我想实现类似的方法:
Predicate<String> predicate1 = str -> str.startsWith("J");
Predicate<String> predicate2 = str -> str.length() < 4;
List<String> result = names.stream().filter(predicate1.or(predicate2)) //I also could combine them
with predicate1.and(predicate2)
.collect(Collectors.toList());
我想将我的所有检查定义为一个类中的谓词,并在需要的不同地方使用它们,但是,谓词只能用于集合。
有没有更好的方法来实现这一目标?
解决方案
不一定是更好的方法或任何东西,但不要忘记您可以提前将谓词链接在一起以提供管道供以后使用。以这种方式推理事情可能更容易:
Predicate<String> predicateLongerThan4 = tested->tested.length() > 4;
Predicate<String> predicateStartsWithUpperCase = tested->tested.substring(0,1).toUpperCase().equals(tested.substring(0,1));
Predicate<String> longerThan4AndStartsWithUpperCase = predicateLongerThan4.and(predicateStartsWithUpperCase);
哦,不要太受制于如何以及在哪里使用某些东西。当我刚刚写这个并想对其进行完整性检查时,我使用了 Optional.of 例如。
推荐阅读
- javascript - 使用 Javascript 检查字符串是否包含特殊字符
- imagemagick - 如何在 ImageMagick 中使用特定于格式的选项?
- php - 加密的 .txt 文件
- git - 如何找到远程 git 子目录的最新修订哈希?
- scala - 桑格利亚汽酒“准备查询”究竟如何使用 *root* 参数?
- python-3.x - 如何使用 Python 或 Pyspark 或 scala 在数据块中获取笔记本的作业运行结果日志
- tfs - Azure Devops Server 2019 - 仅在更改时构建,否则使用旧工件
- c# - 使用无管理员帐户获取当前登录的用户 SID
- javascript - 将字符串格式化为 JSON 对象以在 HTML 中显示在带有 [(ngModel)] 的文本区域中
- npm - 防止 npm 每次都重建一切