文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

GO怎么降低圈复杂度

2023-07-04 18:23

关注

这篇“GO怎么降低圈复杂度”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“GO怎么降低圈复杂度”文章吧。

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

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

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

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

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

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

例如

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 系统仍然也可以去实现,各自完成自己的内容,例如这样

GO怎么降低圈复杂度

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

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

尽可能降低圈复杂度

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

例如一些没有判断语句的代码,圈复杂度就是 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 了呢?而且看起来也优雅了很多

以上就是关于“GO怎么降低圈复杂度”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯