GO怎么降低圈复杂度

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

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

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

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

  • 工具包(例如语言中的各种计算,数据处理,加解密等等)

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

GO怎么降低圈复杂度  go 第1张

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

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

尽可能降低圈复杂度

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

例如一些没有判断语句的代码,圈复杂度就是 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怎么降低圈复杂度”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注蜗牛博客行业资讯频道。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram