项目中如何优雅的消除if-else

简介: 通过一些设计模式可以消除if-else 提高系统的扩展性

项目中如何优雅的消除if-else

消除if-else的方法有很多种,本文结合spring中ArgumentResolver的应用,提供一种优雅地方式。

先看ArgumentResolver的应用方式

public class UserArgumentResolver implements HandlerMethodArgumentResolver {
  private static final String TOKEN_KEY = "token";

  @Override
  public boolean supportsParameter(MethodParameter parameter) {
      return parameter.hasParameterAnnotation(LoginUser.class);
  }

  @Override
  public Object resolveArgument(MethodParameter parameter,
                                ModelAndViewContainer mavContainer,
                                NativeWebRequest webRequest,
                                WebDataBinderFactory binderFactory) throws Exception {
      // 通过session取userid
      String token = webRequest.getHeader(TOKEN_KEY);
      User user = null;
      // 从redis中获取user json
      // user  = JSON.parse(redis.get(token),User.class);

      return user;
  }
}

controller 需要注入参数的地方

@RequestMapping(value = "/doSth", method = RequestMethod.POST)
public String feed(@LoginUser User user) {
  System.out.println("userId: " + JSON.toJsonString(user));
  return "success";
}

声明注解LoginUser

@Target(ElementType.TYPE,ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RestController {

 String value() default "";

}

配置类添加

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

  @Override
  public void addArgumentResolvers (List<HandlerMethodArgumentResolver> resolvers) {
    resolvers.add(new UserArgumentResolver());
  }
}

有多个ArgumentResolver在WebConfiguration中配置即可。

if-else消除

常用代码 如交通方式有 bike, bus,subway,train,plan

if (bike) {
    
} else if (bus) {
    
} else if (subway) {
    
} else if (train) {
    
} else if (plan) {
    
}else {
    
}

编写不同的reslover

定义统一的接口

public interface TrafficResolver {

    boolean support(String type);

    Object resolver(Object argument);
}

定义实现类BusTrafficResolver,其他省略

@Compoment
public class BusTrafficResolver implements TrafficResolver{

  @Override
  public boolean support (String type) {
    return "BUS".equals(type);
  }

  @Override
  public Object resolver (Object argument) {
    // doSth
    return "bus resolver";
  }
}

真正消除if-else的服务类

List 若没有bean则需要required 比提供默认值new ArrayList<>() ,有bean 可以去掉。

@Service
public class TrafficService {

  // required = false
  @Autowired(required = false)
  List<TrafficResolver> trafficResolverList = new ArrayList<>();

  public Object traffic(String type,Object argument){
    System.out.printf("trafficResolverList "+trafficResolverList.size());
    TrafficResolver resolver = getFirstResolver(type);
    if(resolver!=null){
      return resolver.resolver(argument);
    }

    return "traffic not find. type: "+type;
  }

  private TrafficResolver getFirstResolver(String type){
    TrafficResolver resolver = trafficResolverList.stream()
        .filter(item -> item.support(type))
        .findFirst()
        .orElse(null);
    return resolver;
  }

}

通过此种方式完成了对if-else调用类的解耦,实现了高扩展性。遵循了面向修改关闭,面向扩展开放的原则。

消除if-else完成,当然可以用注解的方式,通过注解类型判断是否支持。

其实if-else挺好用,除非考虑扩展性很强的地方,否则不要过度设计。

相关文章
|
8月前
软件复杂度问题之如何判断一个方法是否需要进行重构,重构时需要注意什么
软件复杂度问题之如何判断一个方法是否需要进行重构,重构时需要注意什么
|
8月前
|
负载均衡 Scala Ruby
对抗软件复杂度问题之分布式系统会引入偶然复杂度,如何解决
对抗软件复杂度问题之分布式系统会引入偶然复杂度,如何解决
|
设计模式 JavaScript 前端开发
如何优雅的消除系统重复代码
在程序猿的日常工作中,不仅要跟随业务侧的发展不断开发新的需求,同时也需要维护老的已有平台。无论是开发新需求还是维护老系统,我们都会遇到同样一个问题,系统中总是充斥着很多重复的代码。
29615 11
如何优雅的消除系统重复代码
|
数据库
重构——前提工作
重构——前提工作
108 0
|
机器学习/深度学习 分布式计算 自动驾驶
按需求构建架构才是正确之举,过度工程只会“劳民伤财”
按需求构建架构才是正确之举,过度工程只会“劳民伤财”
|
小程序
如何做一个俄罗斯方块7:消除判断和处理
嗨!大家好,我是小蚂蚁。今天我们继续来了解下一个环节:消除判断和处理。因为消除判断和消除处理都比较简单,所以,这里我们就将这两个环节合并在一起讲解。
206 0
|
缓存 JavaScript 前端开发
Partytown 如何消除第三方脚本所带来的网站膨胀
文章导读:Partytown,是一个轻量级的开源解决方案,通过将第三方脚本放在后台线程中运行的 Web Worker 来减少由于第三方 JavaScript 文件加载导致的执行延迟。
|
Java Spring
9条消除if...else的锦囊妙计,助你写出更优雅的代码(下)
9条消除if...else的锦囊妙计,助你写出更优雅的代码(下)
|
设计模式 算法 Java
9条消除if...else的锦囊妙计,助你写出更优雅的代码
9条消除if...else的锦囊妙计,助你写出更优雅的代码
|
自然语言处理 算法 JavaScript
重构的秘诀:消除重复,清晰意图
  11年前有幸阅读了《重构——改善既有代码的设计》第一版,当时是一口气读完的,书中的内容直接惊艳到我了。   今年读了该书的第二版,再次震撼到我了,并且这次的示例代码用的JavaScript,让我更有亲切感。   全书共有12章,前面5章是在讲解重构的原则、测试、代码的坏味道等内容,后面7章是各种经验和实践,全书的精髓所在。