c++ 结构体转为string_煎鱼 Go Gin 系列十三:优化应用结构和实现Redis缓存

本文介绍了如何重构Gin应用的结构,减轻API逻辑负担,增强错误处理,并实现了Redis缓存。通过拆解、分层代码,优化了错误返回方法,并提供了Redis的配置、Prefix、Key设置以及工具包封装。此外,文章还讨论了避免'箭头型'代码的重构策略。
摘要由CSDN通过智能技术生成

前言

之前就在想,不少教程或示例的代码设计都是一步到位的(也没问题)

但实际操作的读者真的能够理解透彻为什么吗?左思右想,有了今天这一章的内容,我认为实际经历过一遍印象会更加深刻

本文目标

在本章节,将介绍以下功能的整理:

  • 抽离、分层业务逻辑:减轻 routers.go 内的 api 方法的逻辑(但本文暂不分层 repository,这块逻辑还不重)。
  • 增加容错性:对 gorm 的错误进行判断。
  • Redis 缓存:对获取数据类的接口增加缓存设置。
  • 减少重复冗余代码。

问题在哪?

在规划阶段我们发现了一个问题,这是目前的伪代码:

if ! HasErrors() {
    	if ExistArticleByID(id) {
    		DeleteArticle(id)		code = e.SUCCESS	} else {
    		code = e.ERROR_NOT_EXIST_ARTICLE	}} else {
    	for _, err := range valid.Errors {
    		logging.Info(err.Key, err.Message)	}}c.JSON(http.StatusOK, gin.H{
    	"code": code,	"msg":  e.GetMsg(code),	"data": make(map[string]string),})

如果加上规划内的功能逻辑呢,伪代码会变成:

if ! HasErrors() {
        exists, err := ExistArticleByID(id)    if err == nil {
            if exists {
        		err = DeleteArticle(id)    		if err == nil {
        		    code = e.SUCCESS    		} else {
        		    code = e.ERROR_XXX    		}    	} else {
        		code = e.ERROR_NOT_EXIST_ARTICLE    	}    } else {
            code = e.ERROR_XXX    }} else {
    	for _, err := range valid.Errors {
    		logging.Info(err.Key, err.Message)	}}c.JSON(http.StatusOK, gin.H{
    	"code": code,	"msg":  e.GetMsg(code),	"data": make(map[string]string),})

如果缓存的逻辑也加进来,后面慢慢不断的迭代,岂不是会变成如下图一样?

2419b38dec065af025c730dc0d333aaa.png
image

现在我们发现了问题,应及时解决这个代码结构问题,同时把代码写的清晰、漂亮、易读易改也是一个重要指标

如何改?

在左耳朵耗子的文章中,这类代码被称为 “箭头型” 代码,有如下几个问题:

1、我的显示器不够宽,箭头型代码缩进太狠了,需要我来回拉水平滚动条,这让我在读代码的时候&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值