编程规范实战—ID生成器

本文探讨了在后端业务系统开发中,为便于排查问题而设计的ID生成器。通过对原始代码的质量检查,发现了目录结构、设计原则、可扩展性、可测试性和可读性等方面的问题。通过五轮重构,包括提高可扩展性、可读性、可测试性,添加单元测试和优化代码,将代码改进为满足业务需求和功能需求的高质量实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求背景

假设你正在参与一个后端业务系统的开发,为了方便在请求出错时排查问题,我们在编写代码的时候会在关键路径上打印日志。某个请求出错之后,我们希望能搜索出这个请求对应的所有日志,以此来查找问题的原因。而实际情况是,在日志文件中,不同请求的日志会交织在一起。如果没有东西来标识哪些日志属于同一个请求,我们就无法关联同一个请求的所有日志。

我们可以给每个请求分配一个唯一 ID,并且保存在请求的上下文(Context)中。每次打印日志的时候,我们从请求上下文中取出请求 ID,跟日志一块输出。这样,同一个请求的所有日志都包含同样的请求 ID 信息,我们就可以通过请求 ID 来搜索同一个请求的所有日志了。

一份"能用"的代码实现

type IDGenerator struct {
	Logger *log.Logger
}

func (g *IDGenerator) Generate() (string, error) {
	hostName, err := os.Hostname()
	if err != nil {
		g.Logger.Printf("id generate error: %v", err)
		return "", err
	}
	randomCharList := make([]byte, 8, 8)
	count := 0
	for count < 8 {
		randNum := rand.Intn(123)
		if randNum >= 48 && randNum <= 57 {
			randomCharList[count] = byte('0' + (randNum - 48))
			count++
		} else if randNum >= 65 && randNum <= 90 {
			randomCharList[count] = byte('A' + (randNum - 65))
			count++
		} else if randNum >= 97 && randNum <=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值