• 规范代码之方法重用


    今天在进行服务器迁移的时候需要将之前的代码用两种方式实现。

    具体的业务场景为:

    之前的调用方调用一个http接口获取服务,但是现在这个http接口需要废掉了。

    而这个http服务分布在不同的主机上,

    所以调用方的写法是类似于下面这样:

    public Map<Long, Integer> getServiceUsersState(List<Long> serviceUserIds, String host);

    其中host为传入的服务所在的域名,当然,前面还有一个网关负责服务的分发。

    所以我要做的就是将所有带host的接口找出来,写出一个不带host的版本。

    然后将所有调用带host的接口的方法,按照逻辑分为两种调用,

    即如果是调到废掉的服务器上的方法走不带host的,如果不是则继续走原先的方法。

    所以我写了一个没有host的版本。不调用原先的http接口。

    public Map<Long, Integer> getServiceUsersStateNoHost(List<Long> serviceUserIds);

    那么问题来了,有如下类似代码:

    public Result switchService(long userId, long shopId, long curServiceUserId, long nextServiceUserId, String host, PlatformEnum type) {
    //大量代码
             splitServiceUserIds = getSplitServiceUserIds(shopId, host);
        //大量代码 
    }
    private Map<String, List<Long>> getSplitServiceUserIds(long shopId, String host){

    //大量代码
    serviceStateMap = sellerServiceBiz.getServiceUsersState(totalServiceUserIds,host);

    //大量代码

    }
    这里switchService里面有个PlatformEnum可以判断需要调用有host的还是没有host的方法。
    方法1:
    switchService中加一个
               if (PlatformEnum.type1!= type) {
    splitServiceUserIds = getSplitServiceUserIds(shopId, host);
    } else {
    splitServiceUserIds = getSplitServiceUserIdsNoHost(shopId);
    }
    这样的判断,然后在写一个getSplitServiceUserIdsNoHost方法,方法里面调用的是getServiceUsersStateNoHost。
    这样也可以完成目标但是就有了大量的代码的重复。
    而我想的是是否可以重写getSplitServiceUserIds这个方法,让他可以判断出如果是不需要host版本的就调用getServiceUsersStateNoHost
    反之,则调用getServiceUsersState。这样就需要注入一个type属性,需要改写switchService里面的getSplitServiceUserIds。不符合开闭原则。
    所以我就在getSplitServiceUserIds里面自己又包了一层。加了个type字段,同时写了个getSplitServiceUserIdsNoHost也加了个字段。利用这个字段区分,则不具备侵入性了。
    伪代码如下:
    private Map<String, List<Long>> getSplitServiceUserIdsNoHost(long shopId) {
    //switchService里面判断是没有host版本调用这个,然后他出入type=true
        boolean type = true;
    String host=null;
    return getSplitServiceUserIds(type,shopId,host);

    }

    private Map<String, List<Long>> getSplitServiceUserIds(long shopId, String host){
    //switchService里面判断是有host版本调用这个,然后他出入type=false

    boolean type = false;
    return getSplitServiceUserIds(type,shopId,host);

    }


    private Map<String, List<Long>> getSplitServiceUserIds(boolean type,long shopId, String host){

    //根据传入的type调用相应的host或者nohost
    if(type == true) {
    serviceStateMap = sellerServiceBiz.getServiceUsersStateNoHost(totalServiceUserIds);
    }else {
    serviceStateMap = sellerServiceBiz.getServiceUsersState(totalServiceUserIds,host);
    }

    }
    这样的做法减少了代码的侵入性,同时完成了业务逻辑的判断,只改了自己需要的部分,不影响别人的调用。
    话说的很乱。0-0 等我组织好语言在来更新这篇博客。PS:一般是更新不了了。。。。

    补一张随缘图(有缘者能看懂):

  • 相关阅读:
    Ansys经验之:杨氏模量的本质概念理解——仿真在线工作记录
    解决和根源:Unsolicited response received on idle HTTP channel starting with xxx
    版本控制之git
    爬虫数据解析
    爬虫Scrapy框架的初步使用
    爬虫scrapy的下载中间件
    爬虫scrapy的请求传参,POST请求和cookie问题
    爬虫requests模块
    已拦截载入自 xxx 的模块
    js的类调用
  • 原文地址:https://www.cnblogs.com/Ugly-bear/p/9108283.html
Copyright © 2020-2023  润新知