🤕告别 if 第二讲(业务执行器)共四讲

147 阅读7分钟

一、使用背景

在实际开发中,if 语句常常是控制流的核心,但它们的滥用可能会导致代码冗长、可读性差,甚至引发维护问题。如何减少 if 语句的使用,使得代码更具可读性、可维护性,并提高开发效率,是我们今天讨论的主题。

为了达到这一目标,我们将通过对比一个常见场景:在没有使用工具类的情况下写条件判断与使用工具类 BizExecutor 来优化代码,展示如何减少冗余的 if 语句,简化业务逻辑的处理。

1.1. 没有使用业务执行器工具类前的代码

在传统的开发方式中,我们通常通过多个 if 语句来进行条件判断和执行相应的操作。这种写法虽然简单直接,但当条件复杂或者需要在多个地方重复执行相似的操作时,代码容易变得冗长且难以维护。以下是一个典型的没有使用工具类的例子:

public void processBusinessLogic(Boolean condition, String object) {
    if (condition != null && condition) {
        // 条件成立,执行某些操作
        log.info("Condition is true");
    }

    if (condition != null && !condition) {
        // 条件不成立,执行另一些操作
        log.info("Condition is false");
    }

    if (object != null) {
        // 对象存在时执行操作
        log.info("Object is present: " + object);
    } else {
        // 对象为空时执行失败操作
        log.info("Object is absent");
    }

    if (condition != null && condition) {
        // 如果条件满足,抛出异常
        throw new BusinessException("Condition failed");
    }
}

从上面的代码可以看到,if 语句被大量使用,尤其是同样的条件被反复判断。这种写法虽然能完成基本功能,但缺点也显而易见:

  • 重复代码:相同的条件检查(如 if (condition != null && condition))重复多次,代码变得冗长且容易出错。
  • 可读性差:条件语句的分散使得代码的逻辑不清晰,难以一眼看出程序的执行流程。
  • 维护成本高:当需要修改逻辑时,必须逐个修改每个判断条件,增加了修改和测试的复杂性。

1.2. 使用业务执行器工具类后的优化代码

为了提升代码的清晰度和可维护性,我们可以将条件判断封装到一个专门的工具类中。这样一来,业务逻辑的执行就不再依赖大量的 if 语句,而是通过清晰的方法调用来处理各种条件。我们设计了 BizExecutor 工具类,利用它来简化代码。

public void processBusinessLogic(Boolean condition, String object) {
    // 使用 BizExecutor 简化条件判断
    BizExecutor.ifTrue(condition, () -> log.info("Condition is true"));
    BizExecutor.ifTrueElse(condition, () -> log.info("Condition is true"), () -> log.info("Condition is false"));

    // 判断对象是否存在
    BizExecutor.ifPresent(object, obj -> log.info("Object is present: " + obj));
    BizExecutor.ifPresentElse(object, obj -> log.info("Object is present: " + obj), () -> log.info("Object is absent"));

    // 使用 BizExecutor 处理异常
    BizExecutor.ifTrueThrow(condition, () -> new BusinessException("Condition failed"));
}

通过 BizExecutor 工具类,我们大大减少了冗长的 if 语句,逻辑变得更加清晰和简洁。具体的优化效果如下:

  • 代码复用性高BizExecutor 将常见的条件判断逻辑封装成了可复用的方法,避免了重复代码。每个方法只需要关注单一的功能,减少了代码的重复性。
  • 可读性更强:方法名直观地表达了其功能(如 ifTrueifTrueElseifPresentElse),使得代码逻辑一目了然。开发者可以更容易地理解和维护业务逻辑。
  • 更少的错误:由于大部分判断逻辑被封装在工具类中,减少了人为错误的发生。例如,不需要再手动检查 null 或重复编写 if 语句,降低了出错的概率。
  • 维护成本低:当条件判断逻辑发生变化时,只需要修改工具类中的相关方法,而不必修改每个业务逻辑的判断代码,这样大大降低了维护的复杂度。

二、BizExecutor 工具类的设计理念

BizExecutor 工具类的核心思想是将条件判断与具体的业务逻辑解耦。它提供了多个方法来处理不同场景下的条件判断:

  • ifTrue:当条件为 true 时执行操作。
  • ifTrueElse:当条件为 true 时执行成功操作,否则执行失败操作。
  • ifPresent:判断对象是否存在并执行操作。
  • ifTrueThrow:条件满足时抛出指定异常。

三、文章总结

通过对比传统的 if 语句写法和使用 BizExecutor 工具类优化后的写法,我们可以看到,减少冗长的 if 语句能够带来以下显著的好处:

  • 提升代码的可读性:通过清晰的函数式接口表达业务逻辑,使得代码更加简洁易懂。
  • 提高代码的可维护性:通过将条件判断封装到工具类中,减少了代码的重复性,便于维护和扩展。
  • 降低出错的风险:减少了手动编写条件判断的机会,从而减少了因逻辑错误导致的 bug。
  • 提高开发效率:通过封装常见的判断逻辑,开发者不再需要从头编写相同的代码,节省了时间和精力。

在未来的开发中,利用类似 BizExecutor 这样的工具类封装常见的条件判断,不仅可以让代码更加简洁,而且能让我们更专注于业务逻辑本身,从而提升代码的质量和开发效率。

如果你也想让代码更加简洁高效,不妨考虑将常见的条件判断封装成工具类,减少冗长的 if 语句,享受函数式编程带来的便利。

四、附上代码

/**
 * @author: bdmcom
 * @createTime: 2024/12/14 20:39
 * @company: <a href="https://www.bdmcom.cn">本当迷博客</a>
 * @description: 业务执行器工具类
 */
@Slf4j
public class BizExecutor {

    private BizExecutor() {
    }

    /**
     * 如果条件满足,执行指定的操作
     *
     * @param condition 条件
     * @param action    满足条件时执行的操作
     */
    public static void ifTrue(Boolean condition, Runnable action) {
        if (Boolean.TRUE.equals(condition)) {
            action.run();
        }
    }

    /**
     * 如果条件满足,执行指定的消费者操作,并传递上下文信息
     *
     * @param <T>       上下文的类型
     * @param condition 条件
     * @param context   上下文信息
     * @param consumer  满足条件时执行的操作,接受上下文
     */
    public static <T> void ifTrue(Boolean condition, T context, Consumer<T> consumer) {
        if (Boolean.TRUE.equals(condition)) {
            consumer.accept(context);
        }
    }

    /**
     * 如果条件满足,执行成功操作;否则执行失败操作
     *
     * @param condition 条件
     * @param onSuccess 条件满足时执行的操作
     * @param onFailure 条件不满足时执行的操作
     */
    public static void ifTrueElse(Boolean condition, Runnable onSuccess, Runnable onFailure) {
        if (Boolean.TRUE.equals(condition)) {
            onSuccess.run();
        } else {
            onFailure.run();
        }
    }

    /**
     * 如果条件满足,执行成功消费者操作;否则执行失败消费者操作,并传递上下文信息
     *
     * @param <T>       上下文的类型
     * @param condition 条件
     * @param context   上下文信息
     * @param onSuccess 条件满足时执行的操作,接受上下文
     * @param onFailure 条件不满足时执行的操作,接受上下文
     */
    public static <T> void ifTrueElse(Boolean condition, T context, Consumer<T> onSuccess, Consumer<T> onFailure) {
        if (Boolean.TRUE.equals(condition)) {
            onSuccess.accept(context);
        } else {
            onFailure.accept(context);
        }
    }

    /**
     * 如果条件满足,执行指定的操作
     *
     * @param condition 条件
     * @param action    满足条件时执行的操作
     */
    public static void ifCondition(Predicate<Void> condition, Runnable action) {
        if (condition.test(null)) {
            action.run();
        }
    }

    /**
     * 如果条件满足,执行指定的消费者操作,并传递上下文信息
     *
     * @param <T>       上下文的类型
     * @param condition 条件
     * @param context   上下文信息
     * @param consumer  满足条件时执行的操作,接受上下文
     */
    public static <T> void ifCondition(Predicate<T> condition, T context, Consumer<T> consumer) {
        if (condition.test(context)) {
            consumer.accept(context);
        }
    }

    /**
     * 如果条件满足,执行成功操作;否则执行失败操作
     *
     * @param condition 条件
     * @param onSuccess 条件满足时执行的操作
     * @param onFailure 条件不满足时执行的操作
     */
    public static void ifConditionElse(Predicate<Void> condition, Runnable onSuccess, Runnable onFailure) {
        if (condition.test(null)) {
            onSuccess.run();
        } else {
            onFailure.run();
        }
    }

    /**
     * 如果条件满足,执行成功消费者操作;否则执行失败消费者操作,并传递上下文信息
     *
     * @param <T>       上下文的类型
     * @param condition 条件
     * @param context   上下文信息
     * @param onSuccess 条件满足时执行的操作,接受上下文
     * @param onFailure 条件不满足时执行的操作,接受上下文
     */
    public static <T> void ifConditionElse(Predicate<T> condition, T context, Consumer<T> onSuccess, Consumer<T> onFailure) {
        if (condition.test(context)) {
            onSuccess.accept(context);
        } else {
            onFailure.accept(context);
        }
    }

    /**
     * 如果对象存在,执行指定的操作
     *
     * @param <T>      对象的类型
     * @param object   包装的对象
     * @param consumer 对象存在时执行的操作
     */
    public static <T> void ifPresent(T object, Consumer<T> consumer) {
        Optional<T> optional = Optional.ofNullable(object);
        optional.ifPresent(consumer);
    }

    /**
     * 如果对象存在,执行成功操作;否则执行失败操作
     *
     * @param <T>       对象的类型
     * @param object    包装的对象
     * @param onSuccess 对象存在时执行的操作
     * @param onFailure 对象不存在时执行的操作
     */
    public static <T> void ifPresentElse(T object, Consumer<T> onSuccess, Runnable onFailure) {
        Optional<T> optional = Optional.ofNullable(object);
        if (optional.isPresent()) {
            onSuccess.accept(optional.get());
        } else {
            onFailure.run();
        }
    }

    /**
     * 如果条件满足,抛出指定异常
     *
     * @param condition         条件
     * @param exceptionSupplier 异常供应者
     */
    public static void ifTrueThrow(Boolean condition, Supplier<? extends RuntimeException> exceptionSupplier) {
        if (Boolean.TRUE.equals(condition)) {
            throw exceptionSupplier.get();
        }
    }

    /**
     * 如果条件满足,抛出指定异常
     *
     * @param <T>               上下文的类型
     * @param condition         条件
     * @param context           上下文信息
     * @param exceptionSupplier 异常供应者
     */
    public static <T> void ifTrueThrow(Boolean condition, T context, Function<T, ? extends RuntimeException> exceptionSupplier) {
        if (Boolean.TRUE.equals(condition)) {
            throw exceptionSupplier.apply(context);
        }
    }

    public static void main(String[] args) {
        BizExecutor.ifTrue(Boolean.TRUE, () -> log.info("true"));
        BizExecutor.ifTrueElse(Boolean.FALSE, () -> log.info("false"), () -> log.info("true"));
        BizExecutor.ifTrueThrow(Boolean.TRUE, () -> new BusinessException("条件错误"));
        BizExecutor.ifTrueThrow(Boolean.TRUE, "为ture", context -> new BusinessException("条件错误"));
    }
}