golang 代码重构求助

2023-07-18 11:14:16 +08:00
 yujianwjj
type A {
	Config string
}

A 是从文件中反序列化得到的。 之前 A.Config 是明文保存的,现在要求是改成密文。但是代码里面有大量使用 A.Config 的地方,我现在要每个使用 A.Config 地方都要修改,有点麻烦。有没有好的解决方案?

2100 次点击
所在节点    Go 编程语言
13 条回复
Nazz
2023-07-18 11:28:08 +08:00
封装个 GetConfig 方法, 替代直接访问
javalaw2010
2023-07-18 11:29:17 +08:00
A 加个字段叫 SecretConfig,发序列化到这个字段上,然后顺手解密到 Config 字段上,其他不动
aapeli
2023-07-18 11:30:46 +08:00
密文保存。明文使用??

自定义 序列化和反序列化函数,在序列化函数中加密,在反序列化函数中解密

例如,假设文件中的内容是 json

type Config string

func (c *Config) UnmarshalJSON(data []byte) error {
var value string
if err := json.Unmarshal(data, &value); err != nil {
return err
}

// value 目前是密文

c.Value = jie_mi(value)
return nil
}


func (c Config) MarshalJSON() ([]byte, error) {
var value string = c
return json.Marshal(jia_mi(value))
}
lsk569937453
2023-07-18 11:32:23 +08:00
用 github copilot ,简直是重构神器。。。
aapeli
2023-07-18 11:33:01 +08:00
这样的话 Config 底层类型是 string 可以直接当 string 用,不用改任何调用方的代码,内存里的 Config 存储的是明文. 只有在保存和加载的时候才是密文
TuringGunner
2023-07-18 11:42:18 +08:00
Config 换成密文的,新增一个明文的字段用来读取文件初始化
shellcodecow
2023-07-18 11:45:06 +08:00
@lsk569937453 #4 除了提示以外,有什么高级用法吗?
YuuuuuuH
2023-07-18 15:15:15 +08:00
1. 先封装一个 `GetConfig() string`

```go
func (a *A) GetConfig() string {
return a.Config
}
```

2.使用 `gofmt` 批量替换引用 Config 的代码, `gofmt -d -r 'a.Config -> a.GetConfig()' <your-path>` (-d 表示只展示 diff ,不直接写入文件), 替换之后运行单元测试,保证不出错。
3.改写`GetConfig` 方法,在方法中将密文解密成明文返回。
hopingtop
2023-07-19 09:35:51 +08:00
按照我的理解,OP 是不是想这样?

type A struct {
conf string `json:"Config"`// 存入你存入的配置
Config string `json:"-"` // 这个先为空, 假设已 JSON 序列化做示例
}

然后你看看 A 这个结构体怎么生成的,是不是一次生成,到处用。
如果是:那你就再 生成方法那里, 类似于 执行一个 Init() 方法,把 conf -> Config


这样你在使用的地方用 A.Config 就不需要改动。

如果这个结构体生成的地方很少,那么可能几行代码就解决了。
hopingtop
2023-07-19 09:39:48 +08:00
@hopingtop #9 我从 OP 的描述中。理解到的就是
1. 之前 文件中是保存的 明文,现在想 文件中保存 密文
2. 想改最少的代码,实现这个功能。

得出上述建议,如果我理解错了,就当我没说 ~ ~#
mingdongshensen
2023-07-19 12:18:30 +08:00
也许可以用访问者的设计模式,定义访问者 visitor 去持有 config ,使用的地方调用 config 对象的方法,其内部在调用 config 所持有的特定的被预先注入的 visitor 对象的方法,相当于内部重定向了,最后在 visitor 被调的方法内去做解密工作
shaoyie
2023-07-26 22:26:11 +08:00
find . -name "*.go" | xargs sed -i -e 's/A\.Config/A.SecretConfig/g'
shaoyie
2023-07-26 22:26:34 +08:00
直接文件替换

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

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

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

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

© 2021 V2EX