【编程技巧】降低程序复杂度:控制逻辑与业务逻辑分离

为什么要降低代码复杂度

好的项目都是迭代出来的,所以代码肯定是会被人维护的
降低代码复杂度就是为了降低下一个维护人的维护成本,更简单地理解跟修改代码


代码组成

代码逻辑 = 控制逻辑 + 业务逻辑

控制逻辑 = 控制业务逻辑的代码
例如:加缓存,开并发,异步 …

业务逻辑 = 真正业务的代码
例如:调下游接口,查询数据库 …


控制逻辑 与 业务逻辑分离

一般情况下,后续的维护只需关注 业务逻辑 代码
因此将 控制逻辑 与 业务逻辑 分离就能降低维护成本

  1. 易懂
    分离后业务的代码就少了,少了就更简单,也更聚焦了,后续维护的人只需关注业务逻辑的方法即可
  2. 减少出错
    控制逻辑很多情况下都差不多,越写会越熟练,甚至可以抽成公共方法,提升效率又减少出错

例子

缓存逻辑 与 查询逻辑 分离

DoSomethingCache 方法是 缓存控制逻辑
doSomething 方法是 业务逻辑
下一个维护的人只需要关注 doSomething 方法,维护成本低
后续有其他缓存业务时可以 copy DoSomethingCache 方法,不容易出错(也可以封装成公共方法)

在这里插入图片描述

并发逻辑 与 查询逻辑 分离

DoSomethingMulit 方法是 并发控制逻辑
doSomething 方法是 业务逻辑
下一个维护的人只需要关注 doSomething 方法,维护成本低
后续有其他并发业务时可以 copy DoSomethingMulit 方法,不容易出错(也可以封装成公共方法)

在这里插入图片描述


代码

缓存逻辑 与 查询逻辑 分离
// 公有的带缓存的方法
func DoSomethingCache() (string, error) {
	// 从缓存取
	cacheKey := "XXX"
	redisRes, err := redishelper.GetKey(cacheKey)
	if err == nil {
		return redisRes, nil
	}

	// 实时计算
	res, err := doSomething() // 业务逻辑
	if err != nil {
		return res, err
	}

	// 存入缓存
	redishelper.SetKey(cacheKey, 10*60, res)

	return res, nil
}

// 私有的业务逻辑方法
func doSomething() (string, error) {
	// ...
	return "业务逻辑", nil
}
并发逻辑 与 查询逻辑 分离
// 公有的并发的方法
func DoSomethingMulit(list []string) ([]string, error) {
	var (
		res       = []string{}
		err       error
		wg        sync.WaitGroup
		lock      sync.Mutex
		limitChan = make(chan struct{}, 4)
	)
	// 并发
	for _, v := range list {
		wg.Add(1)
		limitChan <- struct{}{}
		go func(str string) {
			defer exception.RecoverPanic()
			defer wg.Done()
			defer func() {
				<-limitChan
			}()
			tmpRes, tmpErr := doSomething(str) // 业务逻辑
			if err != nil {
				fmt.Println("err:", err)
				return
			}
			lock.Lock()
			defer lock.Unlock()

			if tmpErr != nil {
				err = tmpErr
			}
			res = append(res, tmpRes)
		}(v)
	}
	wg.Wait()
	if err != nil {
		return res, err
	}
	return res, nil
}

// 私有的业务逻辑方法
func doSomething(str string) (string, error) {
	// HTTP调用大数据接口...
	return "业务逻辑", nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/712252.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis-sentinel(哨兵模式)的搭建步骤及相关知识

1、什么是redis-sentinel&#xff0c;和redis主从复制相比&#xff0c;它具有什么优势 1.1、redis主从复制 Redis主从复制是一种用于数据冗余和可伸缩性的机制&#xff0c;它将一台Redis服务器的数据复制到其他Redis服务器。在这种模式下&#xff0c;数据会实时地从一个主节点…

PS通过GTX实现SFP网络通信1

将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接&#xff0c; 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…

Pytest 读取excel文件参数化应用

本文是基于Pytest框架&#xff0c;读取excel中的文件&#xff0c;传入页面表单中&#xff0c;并做相应的断言实现。 1、编辑媒体需求 首先明确一下需求&#xff0c;我们需要对媒体的表单数据进行编辑&#xff0c;步骤如下&#xff1a; 具体表单如下图所示 1、登录 2、点击我…

配置中心理论学习

配置中心是一种用于集中管理应用程序配置信息的系统或服务。在微服务架构中&#xff0c;由于服务数量众多且可能分布在不同的环境中&#xff0c;配置中心的作用尤为突出。它允许开发者将配置信息从应用程序代码中分离出来&#xff0c;集中存储和管理&#xff0c;从而提高配置的…

训练营第三十八天 | 309.最佳买卖股票时机含冷冻期动态规划系列七总结714.买卖股票的最佳时机含手续费股票问题总结篇!

309.最佳买卖股票时机含冷冻期 力扣题目链接(opens new window) 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#x…

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令&#xff0c;脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;grep更适合单纯的查找或匹配文本&#xff0c;sed更适合编辑匹配到的文本&#xff0c;awk更适合格式化文本&#xff0c;对…

硬件SPI读写W25Q64

硬件SPI读写W25Q64 接线图&#xff08;和软件SPI一样&#xff09; 使用SPI1&#xff0c;SCK&#xff0c;接PA5&#xff1b;MISO&#xff0c;接PA6&#xff1b;MOSI&#xff0c;接PA7&#xff1b;NSS&#xff0c;可接PA4。 接线图对应&#xff1a;PA5接CLK引脚&#xff0c;PA6…

基于深度学习的红外船舶检测识别分类完整实现数据集8000+张

随着遥感技术的快速发展&#xff0c;包括无人机、卫星等&#xff0c;红外图像在船舶检测识别中的作用日益凸显。相对于可见光图像&#xff0c;红外图像具有在夜晚和恶劣天气条件下高效检测识别船舶的天然优势。近年来&#xff0c;深度学习作为一种强大的图像处理技术&#xff0…

微服务链路追踪ELK

微服务链路追踪&ELK 链路追踪概述链路追踪sluthzipkinelk日志管理平台 一 链路追踪 1 概述 1.1 为什么需要链路追踪 ​ 微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0…

sqoop的安装配置

1. 上传并解压安装包 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../server/ 重命名&#xff1a;mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop 2. 配置环境变量 sudo vim /etc/profile # 配置sqoop的环境变量 export SQOOP_HOME/export/server/sqoop export PATH$PATH…

Camtasia2024破解永久激活码注册码分享最新

随着数字时代的到来&#xff0c;视频制作已成为许多人日常生活和工作中不可或缺的一部分。而在众多视频编辑软件中&#xff0c;Camtasia凭借其强大的功能和易用性&#xff0c;赢得了广泛的用户喜爱。近期&#xff0c;Camtasia 2024的破解版本在网络上引起了广泛关注。本文旨在为…

FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《03》

系列文章 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《01》 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《02》 说明 在上篇 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《02》 开始移植适配 FreeRTOS&#xff0c;FreeRTOS 移植适配…

大数据技术学习回顾01-大数据的特点、技术体系(三驾马车)

参考来源&#xff1a; 极客时间专栏&#xff1a;从0开始学大数据&#xff0c;作者&#xff1a;李智慧 大数据技术整体概览 大数据技术体系 大数据处理的主要应用场景包括数据分析、数据挖掘与机器学习。数据分析主要使用 Hive、Spark SQL 等 SQL 引擎完成&#xff1b;数据挖…

LaTeX 学习 第2节 数学结构

----用教授的方式学习 目录 2.1 上标与下标 2.2 上下画线与花括号 2.3 分式 2.4 根式 2.5 矩阵 ​​​​​​​LaTex安装包&#xff1a;https://download.csdn.net/download/weixin_38135241/89416392 LaTex- windows安装包&#xff1a;https://download.csdn.net/down…

unity38——MemoryProfiler性能分析器,截帧分析当前性能占用率的具体文件

定义&#xff1a;性能分析器 (Unity Profiler) 是一种可以用来获取应用程序性能信息的工具。可以将性能分析器连接到网络中的设备或连接到已连接到计算机的设备&#xff0c;从而测试应用程序在目标发布平台上的运行情况。还可以在 Editor 中运行性能分析器&#xff0c;从而在开…

ESP32 BLE学习(0) — 基础架构

前言 &#xff08;1&#xff09;学习本文之前&#xff0c;需要先了解一下蓝牙的基本概念&#xff1a;BLE学习笔记&#xff08;0.0&#xff09; —— 基础概念&#xff08;0&#xff09; &#xff08;2&#xff09; 学习一款芯片的蓝牙肯定需要先简单了解一下该芯片的体系结构&a…

shell编程基础(第18篇:更多的文件操作命令介绍)

前言 对于文件来说&#xff0c;除了它的文件内容之外&#xff0c;就是对其文件本身的操作&#xff0c;比如我们想要重命名文件、移动文件、复制文件、已经获取文件所在目录&#xff0c;文件名等操作&#xff0c;今天一起学习更多的文件操作相关的命令 basename 用于获取文件名…

使用Stable Diffusion制作角色三视图

使用Stable Diffusion制作角色三视图&#xff0c;可以借助ControlNet功能来实现人物姿势控制&#xff0c;并结合LoRA模型进行精细调整。以下是一般步骤&#xff1a; 安装Stable Diffusion WebUI: 建议使用最新版本&#xff0c;并确保已安装并正确配置ControlNet和LoRA模型。 准…

最新2024FL Studio21中文激活注册码获取方法步骤教程!

在音乐创作领域&#xff0c;FL Studio21无疑是一款强大的工具。然而&#xff0c;对于许多初学者来说&#xff0c;如何正确注册和激活FL Studio21成了一个难题。今天&#xff0c;我们就来为大家详细解答这个问题。 我们需要在FL Studio21的官方网站上购买正版软件。 在购买过程…

Interlinks Manager评测:WordPress 的最佳内部链接插件?

在这篇Interlinks Manager评测中&#xff0c;我们将彻底查看它是否真的是 WordPress 最佳内部链接插件&#xff01;我们还将检查它是否值得您尝试。现在就开始吧 快速浏览一下插件&#xff0c;你就会对其提供的功能有一个基本的了解。 Interlinks Manager是一款 SEO 插件&…