大佬们这段 golang 代码怎么优化,这么多 if 判断

104 天前
 pdxjun

大佬们这段 golang 代码怎么优化,这么多 if 判断

        ...
	col := column.typeFn(column.ctype)

        //primaryKey
	if column.ColumnFn["primaryKey"] != nil {
		col = col + column.ColumnFn["primaryKey"](column)
	}
	//autoIncrement
	if column.ColumnFn["autoIncrement"] != nil {
		col = col + column.ColumnFn["autoIncrement"](column)
	}

	//default
	if column.ColumnFn["default"] != nil {
		col = col + column.ColumnFn["default"](column)
	}
	//notNull
	if column.ColumnFn["notNull"] != nil {
		col = col + column.ColumnFn["notNull"](column)
	}

	//comment
	if column.ColumnFn["comment"] != nil && !column.Add {
		col = col + column.ColumnFn["comment"](column)
	}
       ...
2757 次点击
所在节点    Go 编程语言
22 条回复
jkm
104 天前
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)
}
}
```
yinxs2003
104 天前
能用就不要动,重构是非常费力不讨好的事情
yinxs2003
104 天前
可以使用 switch 或者策略模式替换这段代码
https://www.javanorth.cn/2022/07/08/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F-20220712/
pdxjun
104 天前
谢谢大佬们
falser101
104 天前
GPT3.5
您可以通过将相似的逻辑整理成一个函数,并使用循环来遍历需要执行的函数,以减少代码的冗余。以下是一个优化后的示例:

go
Copy code
// 定义一个函数类型,用于处理特定的 ColumnFn
type 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
}

// 在你的代码中调用 processAllColumnFns
col := column.typeFn(column.ctype) + processAllColumnFns(column)
通过这种方式,您可以将重复的逻辑整理到函数中,并通过循环来遍历需要执行的函数。这样可以使代码更加清晰、可维护,并减少冗余。同时,如果以后需要添加或删除某个 ColumnFn ,只需在 fnNames 中进行相应的修改,而不必在每个条件语句中进行更改。
9136347
104 天前
挺好的,清晰明了。别改了。
mydev6666666
104 天前
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)
}
}
mydev6666666
104 天前
我是直接问 chatgpt 的。
yulon
104 天前
我建议更名叫 v2ai 😎
zjttfs
104 天前
挺好的.一眼明了
见过这种代码吗
```
a:=xxx
//一些简单的代码
b:=a
//一些简单的代码
c:=b
//一些简单的代码
d:=c
```
CEBBCAT
104 天前
清晰明了,我看写得挺好。楼里唯一能认同的理由是行数多,这个可以用表驱动来合并,特别注意的是,我建议一行一个策略,不然排序、合并代码冲突的时候要傻眼的
cmsyh29
104 天前
@falser101 确实写的比我好
GeruzoniAnsasu
104 天前
怎么没人提 validator 呢

struct tag 就是设计来简化这坨没必要的 if 判断的
xiaomada
104 天前
var col strings.Builder
col.WriteString(column.typeFn(column.ctype))

// column functions
columnFns := []string{"primaryKey", "autoIncrement", "default", "notNull", "comment"}
for _, fn := range columnFns {
if column.ColumnFn[fn] != nil {
col.WriteString(column.ColumnFn[fn](column))
}
}

finalCol := col.String()
CEBBCAT
104 天前
@GeruzoniAnsasu #13 这个感觉更像是 ORM 建表那里?不太像是参数检查。
namek
104 天前
看起来不够酷,确是最简洁高效的
CodeCodeStudy
104 天前
简洁明了,如果是别人写的就不要改了。另外行数也挺多的,如果用行数来考核的话,也能取得不错的成绩。
dhb233
104 天前
从命名推测 ColumnFn 应该就是所有要调用的处理函数,如果是要添加一个新的方法,为了方便扩展,那直接这样就可以吧
for n, cf := range column.ColumnFn {
col = col + cf(column)
}

如果不是为了扩展,那还是别闲的没事改代码了。。。
dhb233
104 天前
@dhb233 这个错了,看起来是在拼字符串?这样就乱序了。。。
hoosin
103 天前
```
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)
}
}
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1011498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX