golang 表格编程降低圈复杂度
发布于: 2020 年 09 月 22 日
在不了解圈复杂度之前,我们写出这样的代码,觉得无可厚非。
但是圈复杂度过大,会影响程序的可读性,可维护性,可扩展性,以及可测性。
现在推崇表格驱动的方式编程,我第一次接触表格编程是在做单元测试时了解到的,生成类似于表格的多个测试入参和期望的结果,通过一个单测函数即可完成多种类型的测试。
实际开发过程中亦可按照这种模式。
比较典型的一类是简单工厂模式,以下就是我将简单工厂的switch替换为表格编程的具体实践。
switch实现的圈复杂度为13的代码:
func NewDataOperator(ctype lb.TypeEnum, uid string) DataOperator { switch ctype { case lb.TypeMod: return &ModModel{Uid: uid} case lb.TypeModContent: return &ModContentModel{Uid: uid} case lb.TypeABXitem: return &ABXitemModel{Uid: uid} case lb.TypeDotting: return &DottingModel{Uid: uid} case lb.TypeDottingXitem: return &DottingXitemModel{Uid: uid} case lb.TypeGameCover: return &GameCoverModel{Uid: uid} case lb.TypeGameCoverXcid: return &GameCoverXcidModel{Uid: uid} case lb.TypeGame: return &GmGameModel{Uid: uid} case lb.TypeGameXitem: return &GameXitemModel{Uid: uid} case lb.TypeColumn: return &ColumnModel{Uid: uid} case lb.TypeTopicContent: return &TopicContentModel{Uid: uid} case lb.TypeTopic: return &TopicModel{Uid: uid} default: return nil}
map替换switch,将类型与函数作为map的键值,通过键获取func,执行函数,达到降低圈复杂度的目的。
var tableFunc = map[lb.TypeEnum]func(uid string) DataOperator { lb.TypeMod: createMod, lb.TypeModContent: createModContent, lb.TypeABXitem: createABXitem, lb.TypeDotting: createDotting, lb.TypeDottingXitem: createDottingXitem, lb.TypeGameCover: createGameCover, lb.TypeGameCoverXcid: createGameCoverXcid, lb.TypeGame: createGameModel, lb.TypeGameXitem: createGameXitem, lb.TypeColumn: createColumn, lb.TypeTopicContent: createTopicContent, lb.TypeTopic: createTopic,}//NewDataOperator 数据操作工厂函数func NewDataOperator(ctype lb.TypeEnum, uid string) DataOperator { if handler, ok := tableFunc[ctype]; ok { return handler(uid) } return nil}func createMod(uid string) DataOperator { return &ModModel{Uid: uid}}func createModContent(uid string) DataOperator { return &ModContentModel{Uid: uid}}func createABXitem(uid string) DataOperator { return &ABXitemModel{Uid: uid}}func createDotting(uid string) DataOperator { return &DottingModel{Uid: uid}}func createDottingXitem(uid string) DataOperator { return &DottingXitemModel{Uid: uid}}func createGameCover(uid string) DataOperator { return &GameCoverModel{Uid: uid}}func createGameCoverXcid(uid string) DataOperator { return &GameCoverXcidModel{Uid: uid}}func createGameModel(uid string) DataOperator { return &GmGameModel{Uid: uid}}func createGameXitem(uid string) DataOperator { return &GameXitemModel{Uid: uid}}func createColumn(uid string) DataOperator { return &ColumnModel{Uid: uid}}func createTopicContent(uid string) DataOperator { return &TopicContentModel{Uid: uid}}func createTopic(uid string) DataOperator { return &TopicModel{Uid: uid}}
划线
评论
复制
发布于: 2020 年 09 月 22 日阅读数: 59
版权声明: 本文为 InfoQ 作者【猴子胖胖】的原创文章。
原文链接:【http://xie.infoq.cn/article/da1c3bf56b3d7b744e96d1036】。文章转载请联系作者。
猴子胖胖
关注
6年ios开发,1年golang开发 2020.05.09 加入
还未添加个人简介
评论