zoukankan      html  css  js  c++  java
  • 精准优化 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));
  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/yi-yun/p/14694165.html
Copyright © 2011-2022 走看看