当前位置: 首页 > article >正文

高级编程之结构化代码

背景:以下没结构化代码之前,定时器同步店铺信息的代码。

结构化的思想:SRP(单一职责),一个方法是做一件事,层次是相关的,逻辑和数据操作进行拆分,数据操作从业务流程上定义分层的步骤

结论:下面代码不规范,命名上不能见名知意,没有结构化代码,逻辑处理和数据库操作堆积到一起,还有实体的赋值,本身是实体的职责,却扔到了业务逻辑,所有东西堆积到一起,业务代码量少的时候还好,但是一旦业务代码量多,没有分层会造成难以理解逻辑,看代码的成本很大。

@Service
public class SynVCStoreAppService {
    @Autowired
    private VCStoreClient vcStoreClient;
    @Autowired
    IMultiPlatformStoreInfoService iMultiPlatformStoreInfoService;

    /**
     * 同步店铺信息
     * 全量同步
     *
     * @return 结果
     */
    public Integer syncAll() {
    //调用客户端获取店铺信息
        LxErpMessage<List<VCStore>> lxErpMessage  = vcStoreClient.list(MultiPlatformStoreInfoRequest.builder().offset(0).length(200).build());
        List<VCStore> list =  lxErpMessage.getData();
        //判断是否存在数据
        if(lxErpMessage.getTotal()==0){
            return 0;
        }
        // 先查询数量
        int count = lxErpMessage.getTotal();

        // 每页查询数量
        int length = 200;
        List<VCStore> updataList = list;
        // 根据count 分批查询数据,如果是超过200则继续查询外部数据进行同步
        List<VCStore> list1 = null;
        if(count>200){
            for (int i = 200; i < count; i += length) {
                list1 = vcStoreClient.list(MultiPlatformStoreInfoRequest.builder().offset(i).length(length).build()).getData();
            }
            updataList.addAll(list1);
        }
        MultiPlatformStore mpsi = null;
        List<MultiPlatformStore> multiPlatformStoreList = new ArrayList<>();
        for (VCStore vcStore : updataList) {
            mpsi = new MultiPlatformStore();
            //因为是定时器,所以写死创建人信息,其他设置省略
            mpsi.setCreateId(1l);
            mpsi.setCreateBy("admin");
            mpsi.setCreateName("管理员");
            multiPlatformStoreList.add(mpsi);
        }
        iMultiPlatformStoreInfoService.saveOrUpdateBatch(multiPlatformStoreList);
        return count;
    }
}

重点:以下是结构化后的代码,只需要看syncAll()这个方法即可,其他都是分层处理,把逻辑处理和业务分离,以单一原则进行划分代码,同时也有了层次感,一目了然。在一层就是逻辑处理分配,在分批里调用具体的业务处理,业务里继续划分业务步骤进行数据处理

@Slf4j
@Service
public class SynVCStoreAppService {
    private int length = 200;
    @Autowired
    private VCStoreClient vcStoreClient;
    @Autowired
    IMultiPlatformStoreInfoService iMultiPlatformStoreInfoService;

    /**
     * 同步店铺信息
     * 全量同步
     *
     * @return 结果
     */
    public Integer syncAll() {
        log.info("同步店铺--开始");
        int offset = 0;
        int total = doExcute(offset);
        while (total >this.length) {
            offset += this.length;
            doExcute(offset);
            total -= this.length;
        }
        log.info("同步店铺--结束");
        return total;
    }
    //分批获取店铺信息
    private int doExcute(int offset) {
        LxErpMessage<List<VCStoreVO>> erpVCStoreResponse  = getErpVCStore(offset);
        List<MultiPlatformStore> multiPlatformStores =  getMultiPlatformStoreByErpVCStoreResponse(erpVCStoreResponse);
        log.info("multiPlatformStores:{}",multiPlatformStores);
        iMultiPlatformStoreInfoService.saveOrUpdateBatch(multiPlatformStores);
        return erpVCStoreResponse.getTotal();
    }
	//调用第三方接口
    LxErpMessage<List<VCStoreVO>> getErpVCStore(int offset){
        return vcStoreClient.list(MultiPlatformStoreInfoRequest.builder().offset(offset).length(this.length).build());
    }
//处理返回的数据,这里存在代码严谨性,直接根据返回code再进行处理数据,而不是直接处理
    List<MultiPlatformStore> getMultiPlatformStoreByErpVCStoreResponse(LxErpMessage<List<VCStoreVO>> erpVCStoreResponse){
        List<MultiPlatformStore> multiPlatformStores =  new ArrayList<>();
        if(erpVCStoreResponse.isSuccess()&& !CollectionUtils.isEmpty(erpVCStoreResponse.getData())){
            erpVCStoreResponse.getData().forEach(e->{
               multiPlatformStores.add(e.getMultiPlatformStoreByVCStore());
            });
        }
        return multiPlatformStores;
    }
}

那些赋值的for循环放到实体里进行,创建实体的时候直接调用

public class VCStoreVO {
public MultiPlatformStore getMultiPlatformStoreByVCStore(){
        MultiPlatformStore multiPlatformStore = new MultiPlatformStore();
        multiPlatformStore.setCreateBy("admin");
        multiPlatformStore.setCreateId(1L);
        multiPlatformStore.setCreateBy("admin");
        //其他省略
        return multiPlatformStore;
    }
  }

结构化后的代码,有了层次感,有问题直接从调用方法的里直接查阅,而不是需要从头看到尾去理解完代码才知道做了什么事情


http://www.kler.cn/a/406021.html

相关文章:

  • javascrip页面交互
  • tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
  • 云服务器部署WebSocket项目
  • CSS3 动画:前端开发的动态美
  • FreeRTOS之vTaskDelete实现分析
  • 利用D3.js实现数据可视化的简单示例
  • 知识中台在多语言客户中的应用
  • SOL链上的 Meme 生态发展:从文化到创新的融合#dapp开发#
  • Jenkins迁移数据目录
  • C语言中const char *字符进行切割实现
  • 基于matlab的语音信号去噪的App Designer 设计
  • Django数据迁移出错,解决raise NodeNotFoundError问题
  • Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
  • 独立资源池与共享资源池在云计算中各自的优势
  • 数据分析指标与术语
  • sysbench压测DM的高可用切换测试
  • 如何使用大模型进行智能质检?
  • Typora-PicGo-OSS对象存储
  • 4-7-1.C# 数据容器 - LinkedList(LinkedList 的定义、LinkedList 结点的遍历、LinkedList 的常用方法)
  • 智能安全配电装置在高校实验室中的应用
  • AI 大模型如何重塑软件开发流程?——技术革新与未来展望
  • springboot基于Android的华蓥山旅游导航系统
  • 66 mysql 的 表自增长锁
  • .NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】
  • 【AI系统】GPU 架构回顾(从2018年-2024年)
  • django+boostrap实现发布博客权限控制