这篇“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 系统仍然也可以去实现,各自完成自己的内容,例如这样
对于优化代码的话,我们就可以将上述的一些实现步骤,放到这个接口中来即可
咱们定义接口,更多的是去规范流程和便于维护,这样还可以让我们的程序往高内聚低耦合方面去靠,不同的对象之间,完全是安全的,自己玩自己的一套,只不过遵循的规范是一样的的
圈复杂度也可以理解为条件复杂度,是一种用来衡量代码复杂度的标准
例如一些没有判断语句的代码,圈复杂度就是 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怎么降低圈复杂度”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。