高级编程之结构化代码

news2024/11/23 21:32:48

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

结构化的思想: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.coloradmin.cn/o/2246257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 Python 开发一个简单的文本数据转换为 Excel 工具

目录 一、准备工作 二、理解文本数据格式 三、开发文本数据转换为Excel工具 读取CSV文件 将DataFrame写入Excel文件 处理其他格式的文本数据 读取纯文本文件&#xff1a; 读取TSV文件&#xff1a; 四、完整代码与工具封装 五、使用工具 六、总结 在数据分析和处理的…

知识中台:提升企业知识管理的智能化水平

在数字化转型的浪潮中&#xff0c;企业知识管理的智能化水平成为提升竞争力的关键。HelpLook知识中台通过集成先进的AI技术&#xff0c;为企业提供了一个智能化的知识管理平台。 一、知识管理智能化的重要性 智能化的知识管理不仅能够提高信息检索的效率&#xff0c;还能通过…

MAC借助终端上传jar包到云服务器

前提&#xff1a;保证工程本地已打包完成&#xff1a;图中路径即为项目的target目录下已准备好的jar包 第一步&#xff1a;打开终端&#xff08;先不要连接自己的服务器&#xff09;&#xff0c;输入下面的上传命令&#xff1a; scp /path/to/local/app.jar username192.168.1…

生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件

我们知道MPSOC或者ZYNQ的启动文件BOOT.BIN 通常由三最少三部分组成 1&#xff0c;FSBL 第一阶段引导加载器 2&#xff0c;BIT流文件 3&#xff0c;用户APP文件 用户使用这个三个文件生成BOOT.BIN时候往往用SDK的用户界面&#xff0c;分别选择这三个文件之后生成。其实这种方…

【机器学习】——朴素贝叶斯模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

html+js实现图片的放大缩小等比缩放翻转,自动播放切换,顺逆时针旋转

效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片预览</title><sty…

数据结构 ——— 快速排序算法的实现(hoare版本)

目录 快速排序的思想 单趟排序逻辑的实现 快速排序算法的实现 快速排序的思想 任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子列中所有元素均小于基准值&#xff0c;右子席列中所有元素均大于基准值&#xff0…

Nmap识别MongoDB 6.0指纹

Nmap识别MongoDB 6.0指纹 朋友反馈一个问题&#xff0c;说使用Nmap扫描MongoDB服务时对于6.0以上的版本默认无法识别到服务版本信息。 如上图所示&#xff0c;对应的VERSION信息是空的&#xff0c;在提示信息中可以看到&#xff0c;官方推荐将指纹信息上传以帮助更新服务指纹&…

论文阅读:A fast, scalable and versatile tool for analysis of single-cell omics data

Zhang, K., Zemke, N.R., Armand, E.J. et al. A fast, scalable and versatile tool for analysis of single-cell omics data. Nat Methods 21, 217–227 (2024). 论文地址&#xff1a;https://doi.org/10.1038/s41592-023-02139-9 代码地址&#xff1a;https://github.com…

飞凌嵌入式旗下教育品牌ElfBoard与西安科技大学共建「科教融合基地」

近日&#xff0c;飞凌嵌入式与西安科技大学共同举办了“科教融合基地”签约揭牌仪式。此次合作旨在深化嵌入式创新人才的培育&#xff0c;加速科技成果的转化应用&#xff0c;标志着双方共同开启了一段校企合作的新篇章。 出席本次签约揭牌仪式的有飞凌嵌入式梁总、高总等一行…

2024年11月21日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍&#xff1a;正在构建一个由社区支持的现代化Salesforce替代品。项目star数&#xff1a;21,798项目fork数&#xff1a;2,347 项目名称&#xff1a;p…

VSCode汉化教程【简洁易懂】

我们安装完成后默认是英文界面。 找到插件选项卡&#xff0c;搜索“Chinese”&#xff0c;找到简体&#xff08;更具你的需要&#xff09;&#xff08;Microsoft提供&#xff09;Install。 安装完成后选择Change Language and Restart。

Leetcode 生命游戏

以下是上述Java代码的算法思想及其逻辑的中文解释&#xff1a; 算法思想 这段代码实现了LeetCode第289题“生命游戏”的解决方案。核心思想是&#xff1a; 利用原地修改的方式&#xff08;in-place&#xff09;存储下一状态的变化&#xff1a; 通过引入额外的状态值&#xff0…

C++【面试重要题目】 只出现一次的数字的集合.

文章目录 前言一、前提要点补充二、题集总结 前言 本篇笔者将会对 cpp 中比较有意思的类型题目进行细致讲解 . 这类题同时也是面试中比较重要的算法题 , 其算法思想需要学者掌握. 以下题目均来自力扣 一、前提要点补充 ● 几个运用运算符 因为笔者介绍的题目均会用到二进制…

麒麟部署一套NFS服务器,用于创建网络文件系统

一、服务端共享目录 在本例中,kyserver01(172.16.200.10)作为客户端,创建一个目录/testdir并挂载共享目录;kyserver02(172.16.200.11)作为服务端,创建一个共享目录/test,设置为读写权限,要求客户端使用root登录时映射为nobody用户、非root登录时保持不变。 服务端启…

VBA技术资料MF228:移动形状并覆盖某单元格区域

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Python 数据分析核心库大全!

&#xff08;欢迎关注我的视频号&#xff09; &#x1f447;我的小册 45章教程:(小白零基础用Python量化股票分析小册) ,原价299&#xff0c;限时特价2杯咖啡&#xff0c;满100人涨10元。 大家好&#xff01;我是菜鸟哥&#xff01; 今天我们来聊点干货&#xff1a;Python 数据…

跨境出海安全:如何防止PayPal账户被风控?

今天咱们聊聊那些让人头疼的事儿——PayPal账户被风控。不少跨境电商商家反馈&#xff0c;我们只是想要安安静静地在网上做个小生意&#xff0c;结果不知道为什么&#xff0c;莫名其妙账户就被冻结了。 但其实每个封禁都是有原因的&#xff0c;今天就来给大家分享分享可能的原…

39页PDF | 毕马威_数据资产运营白皮书(限免下载)

一、前言 《毕马威数据资产运营白皮书》探讨了数据作为新型生产要素在企业数智化转型中的重要性&#xff0c;提出了数据资产运营的“三要素”&#xff08;组织与意识、流程与规范、平台与工具&#xff09;和“四重奏”&#xff08;数据资产盘点、评估、治理、共享&#xff09;…

数据科学与SQL:组距分组分析 | 区间分布问题

目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言&#xff0c;一个记录对应的指标值的绝对值&#xff0c;肯定落在所有指标值的绝对值的最小值和最大值构成的区间内&#xff0c;根据一定的算法&#x…