大佬们这段 golang 代码怎么优化,这么多 if 判断
大佬们这段 golang 代码怎么优化,这么多 if 判断
...
col := column.typeFn(column.ctype)
//primaryKey
if column.ColumnFn["primaryKey"] != nil {
col = col + column.ColumnFn"primaryKey"
}
//autoIncrement
if column.ColumnFn["autoIncrement"] != nil {
col = col + column.ColumnFn"autoIncrement"
}
//default
if column.ColumnFn["default"] != nil {
col = col + column.ColumnFn"default"
}
//notNull
if column.ColumnFn["notNull"] != nil {
col = col + column.ColumnFn"notNull"
}
//comment
if column.ColumnFn["comment"] != nil && !column.Add {
col = col + column.ColumnFn"comment"
}
...
sth like this?col := column.typeFn(column.ctype)constraints := []string{"primaryKey", autoIncrement", "default", "notNull", }for _, cs := range(constraints) { if column.ColumnFn[cs != nil { col = col + column.ColumnFn[cs](column) }}
能用就不要动,重构是非常费力不讨好的事情
可以使用 switch 或者策略模式替换这段代码 www.javanorth.cn/2022/07/08/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F-20220712/
谢谢大佬们
GPT3.5您可以通过将相似的逻辑整理成一个函数,并使用循环来遍历需要执行的函数,以减少代码的冗余。以下是一个优化后的示例:goCopy code// 定义一个函数类型,用于处理特定的 ColumnFntype ColumnFuncHandler func(column Column) string// 处理 ColumnFn 的函数func processColumnFn(column Column, fnName string, fnHandler ColumnFuncHandler) string { if column.ColumnFn[fnName] != nil { return fnHandler(column) } return ""}// 处理所有 ColumnFn 的函数func processAllColumnFns(column *Column) string { var result string // 定义需要处理的函数名列表 fnNames := []string{"primaryKey", "autoIncrement", "default", "notNull", "comment"} // 遍历函数名列表,执行相应的处理函数 for _, fnName := range fnNames { result += processColumnFn(column, fnName, column.ColumnFn[fnName]) } return result}// 在你的代码中调用 processAllColumnFnscol := column.typeFn(column.ctype) + processAllColumnFns(column)通过这种方式,您可以将重复的逻辑整理到函数中,并通过循环来遍历需要执行的函数。这样可以使代码更加清晰、可维护,并减少冗余。同时,如果以后需要添加或删除某个 ColumnFn ,只需在 fnNames 中进行相应的修改,而不必在每个条件语句中进行更改。
挺好的,清晰明了。别改了。
col := column.typeFn(column.ctype)// 定义需要按顺序处理的列属性columnAttributes := []string{"primaryKey", "autoIncrement", "default", "notNull", "comment"}for _, attr := range columnAttributes { if fn, ok := column.ColumnFn[attr]; ok && (attr != "comment" || !column.Add) { col += fn(column) }}
我是直接问 chatgpt 的。
我建议更名叫 v2ai 😎
挺好的.一眼明了见过这种代码吗a:=xxx//一些简单的代码b:=a//一些简单的代码c:=b//一些简单的代码d:=c
清晰明了,我看写得挺好。楼里唯一能认同的理由是行数多,这个可以用表驱动来合并,特别注意的是,我建议一行一个策略,不然排序、合并代码冲突的时候要傻眼的
确实写的比我好
怎么没人提 validator 呢struct tag 就是设计来简化这坨没必要的 if 判断的
var col strings.Buildercol.WriteString(column.typeFn(column.ctype))// column functionscolumnFns := []string{"primaryKey", "autoIncrement", "default", "notNull", "comment"}for _, fn := range columnFns { if column.ColumnFn[fn] != nil { col.WriteString(column.ColumnFnfn) }}finalCol := col.String()
#13 这个感觉更像是 ORM 建表那里?不太像是参数检查。
看起来不够酷,确是最简洁高效的
简洁明了,如果是别人写的就不要改了。另外行数也挺多的,如果用行数来考核的话,也能取得不错的成绩。
从命名推测 ColumnFn 应该就是所有要调用的处理函数,如果是要添加一个新的方法,为了方便扩展,那直接这样就可以吧for n, cf := range column.ColumnFn { col = col + cf(column)}如果不是为了扩展,那还是别闲的没事改代码了。。。
这个错了,看起来是在拼字符串?这样就乱序了。。。
keys := []string{"primaryKey", "autoIncrement", "default", "notNull", "comment"}for _, key := range keys { if column.ColumnFn[key] != nil { if key != "comment" || !column.Add { col = col + column.ColumnFn[key](column) } }}
怎么去掉呢? 好像是开了 OneDrive 全盘同步? 这个箭头不是快捷方式的箭头,是表示对应的文件开了 NTFS 的压缩功能 不是的 这个怎么处理 #2 那用…
今天 QQ 群挺热闹,来了个拳打 Vue 脚踢 React 顺手骂了一下前端所有 UI 库的大神:精简浓缩版发言:- Vue, React, Angular 都是垃圾- 所有 …
有点受不了,aws 怎么这么麻烦啊,有一万个要配置的东西,他为了解决所有的需求场景,就搞了一个又大又全又复杂的玩意儿出来,有没有更适合个人开发用的简单点的云服务啊,心智负担小点…