写点什么

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
用户头像

猴子胖胖

关注

6年ios开发,1年golang开发 2020.05.09 加入

还未添加个人简介

评论

发布
暂无评论
golang 表格编程降低圈复杂度