• 精准优化 if…else ,干掉,过多,烂代码!


    方法一:表驱动

    对于逻辑表达模式固定的 if...else 代码,可以通过某种映射关系,将逻辑表达式用表格的方式表示;再使用表格查找的方式,找到某个输入所对应的处理函数,使用这个处理函数进行运算。

    适用场景

    逻辑表达模式固定的 if...else

    实现与示例

    1 if (param.equals(value1)) {
    2     doAction1(someParams);
    3 } else if (param.equals(value2)) {
    4     doAction2(someParams);
    5 } else if (param.equals(value3)) {
    6     doAction3(someParams);
    7 }
    8 // ...

    可重构为

    1 Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型
    2 
    3 // When init
    4 actionMappings.put(value1, (someParams) -> { doAction1(someParams)});
    5 actionMappings.put(value2, (someParams) -> { doAction2(someParams)});
    6 actionMappings.put(value3, (someParams) -> { doAction3(someParams)});
    7 
    8 // 省略 null 判断
    9 actionMappings.get(param).apply(someParams);

    方法二:职责链模式

     介绍

     当 if...else 中的条件表达式灵活多变,无法将条件中的数据抽象为表格并用统一的方式进行判断时,这时应将对条件的判断权交给每个功能组件。并用链的形式将这些组件串联起来,形成完整的功能。

     适用场景

     条件表达式灵活多变,没有统一的形式。

     实现与示例

     职责链的模式在开源框架的 Filter、Interceptor 功能的实现中可以见到很多。下面看一下通用的使用模式:

     重构前:

    1 public void handle(request) {
    2     if (handlerA.canHandle(request)) {
    3         handlerA.handleRequest(request);
    4     } else if (handlerB.canHandle(request)) {
    5         handlerB.handleRequest(request);
    6     } else if (handlerC.canHandle(request)) {
    7         handlerC.handleRequest(request);
    8     }
    9 }

     重构后:

     1 public void handle(request) {
     2   handlerA.handleRequest(request);
     3 }
     4 
     5 public abstract class Handler {
     6   protected Handler next;
     7   public abstract void handleRequest(Request request);
     8   public void setNext(Handler next) { this.next = next; }
     9 }
    10 
    11 public class HandlerA extends Handler {
    12   public void handleRequest(Request request) {
    13     if (canHandle(request)) doHandle(request);
    14     else if (next != null) next.handleRequest(request);
    15   }
    16 }

    方法三:Optional

     介绍

     Java 代码中的一部分 if...else 是由非空检查导致的。因此,降低这部分带来的 if...else 也就能降低整体的 if...else 的个数。

     Java 从 8 开始引入了 Optional 类,用于表示可能为空的对象。这个类提供了很多方法,用于相关的操作,可以用于消除 if...else。开源框架 Guava 和 Scala 语言也提供了类似的功能。

     使用场景

     有较多用于非空判断的 if...else。

     实现与示例

     传统写法:

    1 String str = Hello World!;
    2 if (str != null) {
    3     System.out.println(str);
    4 } else {
    5     System.out.println(Null);
    6 }

    使用 Optional 之后:

    1 1 Optional<String> strOptional = Optional.of(Hello World!);
    2 2 strOptional.ifPresentOrElse(System.out::println, () -> System.out.println(Null));
  • 相关阅读:
    c++ static_cast和dynamic_cast详解
    python 字符串格式化 format
    python zip() 函数
    零零散散的python笔记 2
    PAT 1017
    PAT 1016
    PAT 1015
    Jordan Lecture Note-8: The Sequential Minimal Optimization Algorithm (SMO).
    Jordan Lecture Note-7: Soft Margin SVM
    PAT 1014
  • 原文地址:https://www.cnblogs.com/yi-yun/p/14694165.html
Copyright © 2020-2023  润新知