Golang Go语言代码重构求助

type A {
	Config string
}

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


Golang Go语言代码重构求助
14 回复

封装个 GetConfig 方法, 替代直接访问

更多关于Golang Go语言代码重构求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


A 加个字段叫 SecretConfig,发序列化到这个字段上,然后顺手解密到 Config 字段上,其他不动

密文保存。明文使用??

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

例如,假设文件中的内容是 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))
}

用 github copilot ,简直是重构神器。。。

这样的话 Config 底层类型是 string 可以直接当 string 用,不用改任何调用方的代码,内存里的 Config 存储的是明文. 只有在保存和加载的时候才是密文

Config 换成密文的,新增一个明文的字段用来读取文件初始化

#4 除了提示以外,有什么高级用法吗?

  1. 先封装一个 GetConfig() string

    go<br>func (a *A) GetConfig() string {<br> return a.Config<br>}<br>

    2.使用 gofmt 批量替换引用 Config 的代码, gofmt -d -r 'a.Config -&gt; a.GetConfig()' &lt;your-path&gt; (-d 表示只展示 diff ,不直接写入文件), 替换之后运行单元测试,保证不出错。
    3.改写GetConfig 方法,在方法中将密文解密成明文返回。

按照我的理解,OP 是不是想这样?

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

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


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

如果这个结构体生成的地方很少,那么可能几行代码就解决了。

#9 我从 OP 的描述中。理解到的就是
1. 之前 文件中是保存的 明文,现在想 文件中保存 密文
2. 想改最少的代码,实现这个功能。

得出上述建议,如果我理解错了,就当我没说 ~ ~#

也许可以用访问者的设计模式,定义访问者 visitor 去持有 config ,使用的地方调用 config 对象的方法,其内部在调用 config 所持有的特定的被预先注入的 visitor 对象的方法,相当于内部重定向了,最后在 visitor 被调的方法内去做解密工作

find . -name “*.go” | xargs sed -i -e ‘s/A.Config/A.SecretConfig/g’

直接文件替换

您好!

针对您提到的Golang代码重构需求,以下是一些通用的重构建议和步骤,希望能对您有所帮助:

  1. 代码审查:首先,进行彻底的代码审查,找出重复代码、不必要的复杂度以及潜在的性能瓶颈。这一步是重构的基础。

  2. 模块化设计:将代码按照功能模块进行拆分,每个模块负责单一的职责。这有助于提高代码的可读性和可维护性。

  3. 函数提取:对于过长的函数,尝试将其拆分成更小的函数,每个函数负责一个具体的子任务。这有助于降低函数的复杂度,提高代码的可读性。

  4. 变量命名:确保变量命名具有描述性,能够清晰地表达变量的用途。良好的命名是代码自文档化的关键。

  5. 错误处理:检查并优化错误处理逻辑,确保错误能够被适当地捕获和处理,同时避免不必要的panic。

  6. 性能优化:在保持代码可读性的前提下,对关键路径进行性能优化,如减少不必要的内存分配、优化算法等。

  7. 单元测试:为重构后的代码编写或更新单元测试,确保重构没有引入新的bug。

  8. 持续集成:将重构后的代码集成到持续集成系统中,通过自动化测试来确保代码质量。

希望这些建议能够帮助您顺利进行Go语言代码的重构。如果有具体的代码片段或问题,欢迎进一步讨论!

回到顶部