首页 > 解决方案 > 太多的 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());

我想将我的所有检查定义为一个类中的谓词,并在需要的不同地方使用它们,但是,谓词只能用于集合。

有没有更好的方法来实现这一目标?

标签: javaspringvalidationif-statement

解决方案


不一定是更好的方法或任何东西,但不要忘记您可以提前将谓词链接在一起以提供管道供以后使用。以这种方式推理事情可能更容易:

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 例如。


推荐阅读