GO 中优雅编码和降低圈复杂度

news2024/9/21 0:50:19

本次主要是聊聊关于使用接口抽象和降低圈复杂度的方式

工作中,难免会遇到老项目老代码,不仅仅需要我们维护,可能还需要我们在原来的垃圾代码上进行新增功能或者是进行优化调整

例如

现有的老代码中关于用户系统这一块就已经经是摇摇欲坠,牵一发而动全身,并且去弄清其中的业务细节,那可以说是很难拨开迷雾,甚至交接都是一句话的那种,更是难上加难

这种情况,相信每个公司都会存在,毕竟过去的需求,过去的标准,放到现在来看,啥也不是

若是很多代码都是面向过程的,各种业务逻辑,非业务的逻辑都混合在一起,主流程上插入一些乱七八糟的逻辑,上下文并没有啥关系的东西,一个函数上千行的代码也是随处可见,这种情况狗看了都摇头

对业务函数需要做基本的封装

首先咱们编码前一定会去捋清楚基本的需求,设计,以及实现流程,对于需要用到的工具我们会对代码结构进行分层

例如一些与业务主逻辑没有什么关联的功能就可以独立封装,便于维护和使用,例如:

  • 工具包(例如语言中的各种计算,数据处理,加解密等等)
  • 基本的 rpc 通信
  • http 相关的各种通信方式
  • 基本的中间件,拦截器,打点接口延时等等
  • 数据库操作(独立封装 DAO 层提供出来)
  • 缓存操作
  • 消息队列
  • …等等

尽可能的将这些单独的功能模块拆解出去,独立出来,单独维护

对于那种没有必要同步的功能,完全可以通过异步化来进行处理,异步的话相信你会很容易想到消息队列来进行实现

自然实际项目中你能够看到最开始可能也会这样去做,但是随着业务越来越复杂,这些独立的模块被各种包进行使用,甚至有的开始慢慢的弄成定制化的方式

例如

func OpenTenant(){
    // 校验基本租户信息
    // 检查租户是否特权,完成权限分配
    // 检查实际开户的线路,分配各种租户下的必备账号
    // 完成各种系统的对接交互
    // 进行数据库操作
    // 返回结果
}

对于一个基本的开户流程,我们或许可以在代码中看到第一步做什么,第二步又做什么,第三步… ,然而每一个大步骤下面还有各种小步骤,每一个小步骤也会有自己的复杂逻辑

虽然有了基本的封装,但是使用的时候,可能还是会写到哪,需要啥就去按需定义啥

最终就会看到一个函数上千行,让你去阅读和维护,你内心能不拒绝吗吗?

发现对模块进行独立封装还是不太够,代码里面太多的冗余代码,这个时候咱们就可以使用接口来做抽象

用接口来做抽象

使用接口来做抽象的话,相当于是提前考虑好这一类的业务需要去考虑哪些问题,需要注意哪些场景,需要实现哪一些接口

不同的对象各自去实现自己的内容就可以了,单独去维护自己的对象

例如上面的 A 系统的开户流程

// 开户 interface{}
type OpenTenant interface{
   ValidateTenantInfo(xxx)xxx // 校验基本租户信息
   CheckPrivilege(xxx) xxx // 检查租户是否特权,完成权限分配
   CheckLine(xxx) xxx // 检查实际开户的线路
   ProcessNeccessaryAccount(xxx) xxx //分配各种租户下的必备账号
   ProcessNoticeMsg(xxx) xxx// 完成各种系统的对接交互
   AddTenant(xxx) xxx// 进行数据库操作
}

这仅仅是一个 demo,对于一个开户 interface{} 来说,A 系统可以去实现,B 系统仍然也可以去实现,各自完成自己的内容,例如这样

对于优化代码的话,我们就可以将上述的一些实现步骤,放到这个接口中来即可

咱们定义接口,更多的是去规范流程和便于维护,这样还可以让我们的程序往高内聚低耦合方面去靠,不同的对象之间,完全是安全的,自己玩自己的一套,只不过遵循的规范是一样的的

尽可能降低圈复杂度

圈复杂度也可以理解为条件复杂度,是一种用来衡量代码复杂度的标准

例如一些没有判断语句的代码,圈复杂度就是 1

如果是 if…else 那么圈复杂度就是 2 ,简单的就可以理解为涉及到判断条件的数量,那么就 +1

例如有这样的代码

func testDemo() {
    var op OpenTenant
    switch TenantType {
        case A:
            op = a.New()
        case B:
            op = b.New()
        case C:
            op = c.New()
        default:
           ...
    }
    op.ValidateTenantInfo()....
}

那么就如上demo ,来看,圈复杂度就是 4 ,其中有 3 个判断条件和一个默认的正常顺序,因此是 3 +1 = 4

这个时候,我们可以如何降低圈复杂度呢?

我们完全就可以使用表格的方式,访问数据直接访问表格就可以了,尽可能的减少这些判断条件,例如我们就可以这样来写

var openTenantMap = map[string]openTenantObject{
    A: a.New(),
    B: b.New(),
    C: c.New(),
}
func testDemo(){
    op := openTenantMap[TenantType ]
    ...
    op.ValidateTenantInfo()
    ...
}

这种方式,是不是就可以将圈复杂度降低到 1 了呢?而且看起来也优雅了很多

总结

主要叮嘱了我们维护和开发的时候,要重视封装,重视抽象,重视降低圈复杂度

只要你用心去打磨,自然会变得越来越好

但是可别生搬硬套,毕竟一些定制化的需求,定制化的代码你去做接口抽象是没有啥意义的,一起加油吧,xdm

至此,本次就是这样,希望能够给你带来一丁点帮助

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

文中提到的技术点,感兴趣的可以查看这些文章:

  • 关于 interface{} 会有啥注意事项?下
  • 关于 interface{} 会有啥注意事项?上
  • 设计模式之单例、工厂、发布订阅者模式
    可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

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

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

相关文章

新版精仿今日头条新闻网站源码/搭建教程+自动采集接口+采集更新文章【新闻站搭建源码】

精仿今日头条新闻网站源码,这个是新闻站搭建源码,含有搭建教程,也可以自动采集接口采集更新文章。源码亲测可用,mysql5.7、PHP7.3支持页面自适应,里面带有详细安装搭建教程。 功能特点: 1、这个网站可以自…

【C++】多线程的学习笔记(2)——白话文版(bushi

目录 前一篇 本章内容提要 使用mutex锁的原因 mutex锁的概念 mutex的使用教程 锁的声明以及命名 mutex的加锁以及解锁 例子 结果 注意 mutex的其他方式的锁介绍 lock_guard 介绍 例子 运行结果 adopt_lock参数 unique_lock 介绍 try_to_lock defer_lock re…

fic2023(完结,AIRDROP放弃)

AIRDROP 1.请分析苹果手机导出日志,airdrop所使用的扫描模式(Scanning mode)为?? 直接搜索可得Scanning mode Contacts Only 2. AirDrop服务计划监听端口号是多少? 8770 3.AirDrop中接收到图片的识别码(identifier)是多少?(标准格式:12345678-1234-5678-1234-5678…

工厂生产线管理所需的系统介绍

工厂生产线管理对于提高生产效率、优化资源利用和确保产品质量至关重要。在现代化工厂中,采用各种系统来支持生产线的管理和运营。本文将全方位介绍工厂生产线管理所需的系统,包括生产计划系统、设备监控系统、质量管理系统和数据分析系统。 一、生产计划…

Adobe_InDesign_2023_18.4.0.056图文安装教程及下载

Adobe InDesign是Adobe公司的一个桌面出版 (DTP)应用程序,简称“Id”,主要用于各种印刷品的排版编辑。InDesign是一款功能强大的出版物创作、排版和打印软件,可以帮助出版物和广告创作者提高效率,节省时间,改善印刷质量。InDesign…

大模型部署手记(6)通义千问+Jetson AGX Orin

1.简介 组织机构:阿里 代码仓:https://github.com/QwenLM/Qwen 模型:Qwen/Qwen-7B-Chat-Int4 下载:http://huggingface.co/Qwen/Qwen-7B-Chat-Int4 modelscope下载:https://modelscope.cn/models/qwen/Qwen-7B-Ch…

设计模式——Decorator(装饰器模式)

Decorator(装饰器模式) 目的: 动态地给一个对象添加一些额外的职责。 适用性: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 简单解释 当有一个已经完成的系统,其中类和对象的关系的错综复杂的&#x…

【MySql】Mysql之备份与恢复

目录 一、mysql日志概述 1、日志类型与作用 2、日志配置文件 3、日志配置文件的查询 二、备份的类型❤ 1、物理备份 1.1 冷备份 1.2 热备份 1.3 温备份 2、逻辑备份❤ 2.1 完全备份 2.2 差异备份 2.3 增量备份 2.5 如何选择逻辑备份策略 3、常见的备份方法 3…

大模型部署手记(3)通义千问+Windows GPU

1.简介 组织机构:阿里 代码仓:GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed by Alibaba Cloud. 模型:Qwen/Qwen-7B-Chat-Int4 下载:http://huggingface…

Modelsim测试覆盖率操作说明

1、打开Project窗口界面 2、在project界面下,选中所有需要测试覆盖率的.v文件(不包括tb文件),鼠标点击右键,在Properties选项中选择Coverage选项,选择需要测试的覆盖率类型 3、重新编译所有的源文件&#x…

【gitlab】从其他仓库创建项目

需求描述 解决方法 以renren-fast脚手架为例 第一步 第二步 第三步 第四步 参考文章

Echarts 教程二

Echarts 教程二 Echarts 常用配置篇柱状图常用配置折线图常用配置散点图常用配置饼图常用配置地图常用配置 Echarts 常用配置篇 柱状图常用配置 配置柱状图的最大最小值 平均值 显示柱状图文字 柱状图宽度 折线图常用配置 配置最大最小值 平均值 标记区域 线的平滑 线的样式 等…

苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到?

(一)TestFlight 能够让您:邀请内部和外部的测试人员为应用程序提供反馈。 跟踪应用程序在测试过程中发现的 bug 和用户体验问题。 收集 Crash 报告,了解应用程序在真实设备上的运行状况。 要使用 TestFlight,您可以按照…

用Python操作Word文档,看这一篇就对了!

本文主要讲解Python中操作word的思路。 一、Hello,world! 使用win32com需要安装pypiwin32 pip install pypiwin32 推荐使用python的IDLE,交互方便 1、如何新建文档 from win32com.client import Dispatchapp Dispatch(Word.Application…

大模型部署手记(4)MOSS+Jetson AGX Orin

1.简介 组织机构:复旦大学 代码仓:GitHub - OpenLMLab/MOSS: An open-source tool-augmented conversational language model from Fudan University 模型:fnlp/moss-moon-003-sft-int4 下载:https://huggingface.co/fnlp/mos…

【C语言】八大排序算法

文章目录 一、冒泡排序1、定义2、思想及图解3、代码 二、快速排序1、hoare版本2、挖坑法3、前后指针法4、非递归快排5、快速排序优化1)三数取中选key值2)小区间优化 三、直接插入排序1、定义2、代码 四、希尔排序1、定义2、图解3、代码 五、选择排序1、排…

Solidity 合约漏洞,价值 38BNB 漏洞分析

Solidity 合约漏洞,价值 38BNB 漏洞分析 1. 漏洞简介 https://twitter.com/NumenAlert/status/1626447469361102850 https://twitter.com/bbbb/status/1626392605264351235 2. 相关地址或交易 攻击交易: https://bscscan.com/tx/0x146586f05a451313…

(c语言进阶)数据存储——整形存储

1.Release程序运行时会对Debug程序进行优化 例如将变量创建在数组之后,避免了数组越界引用时导致死循环的可能。 2.整形变量所占空间的大小 3.构造类型 数组的类型为去掉数组名之后的剩余部分 4.指针类型 5.空类型 6.数值的不同表现形式 7.数据在内存中的两种存…

03.requests入门

1、requests概述 ​ 前面的课程中我们了解了requests模块是一个网络请求模块,可以帮助我们模拟成客户端去请求服 务器的数据。我们今天就是主要针对这个模块进行学习。 ​ 我们可以在浏览器中抓取到这些请求与响应的内容,那么我们可以“伪造”请求吗?也就是不再通过 浏览器…

python+pygame+opencv+gpt实现虚拟数字人直播(一)

AI技术突飞猛进,不断的改变着人们的工作和生活。数字人直播作为新兴形式,必将成为未来趋势,具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作,提供更具个性化和多样化的互动体验,成为未来的一种趋…