当前位置:首页 > 科技  > 软件

Go 重构:尽量避免使用 else、break 和 continue

来源: 责编: 时间:2023-11-01 17:05:27 462观看
导读今天,我想谈谈相当简单的事情。我不会发明什么,但我在生产代码中经常看到这样的事情,所以我不能回避这个话题。我经常要解开多个复杂的 if else 结构。多余的缩进、过多的逻辑只会加深理解。首先,这篇文章的主要目的是让

今天,我想谈谈相当简单的事情。我不会发明什么,但我在生产代码中经常看到这样的事情,所以我不能回避这个话题。49J28资讯网——每日最新资讯28at.com

我经常要解开多个复杂的 if else 结构。多余的缩进、过多的逻辑只会加深理解。首先,这篇文章的主要目的是让代码更透明、更易读。不过,在某些情况下还是必须使用这些操作符。49J28资讯网——每日最新资讯28at.com

49J28资讯网——每日最新资讯28at.com

else 操作

例如,我们有简单的用户处理程序:49J28资讯网——每日最新资讯28at.com

func handleRequest(user *User) {    if user != nil {        showUserProfilePage(user)    } else {        showLoginPage()    }}

如果没有提供用户,则需要将收到的请求重定向到登录页面。If else 似乎是个不错的决定。但我们的主要任务是确保业务逻辑单元在任何输入情况下都能正常工作。因此,让我们使用提前返回来实现这一点。49J28资讯网——每日最新资讯28at.com

func handleRequest(user *User) {    if user == nil {        return showLoginPage()    }     showUserProfilePage(user)}

逻辑是一样的,但是下面的做法可读性会更强。49J28资讯网——每日最新资讯28at.com

break 操作

对我来说,Break 和 Continue 语句总是可以分解的信号。49J28资讯网——每日最新资讯28at.com

例如,我们有一个简单的搜索任务。找到目标并执行一些业务逻辑,或者什么都不做。49J28资讯网——每日最新资讯28at.com

func processData(data []int, target int) {    for i, value := range data {        if value == target {            performActionForTarget(data[i])            break        }    }}

你应该始终记住,使用 break 操作符并不能保证整个数组都会被处理。这对性能有好处,因为我们丢弃了不必要的迭代,但对代码支持和可读性不利。因为我们永远不知道程序会在列表的开头还是结尾停止。49J28资讯网——每日最新资讯28at.com

在某些情况下,带有子任务的简单功能可能会破坏这段代码。49J28资讯网——每日最新资讯28at.com

func processData(data []int, target int, subtask int) {    for i, value := range data {        if value == subtask {            performActionForSubTarget(data[i])        }        if value == target {            performActionForTarget(data[i])            break        }    }}

这样我们实际上可以拆出一个 find 的方法:49J28资讯网——每日最新资讯28at.com

func processData(data []int, target int, subTarget int) {    found := findTarget(data, target)    if found > notFound {        performActionForTarget(found)    }    found = findTarget(data, subTarget)    if found > notFound {        performActionForSubTarget(found)    }}const notFound = -1func findTarget(data []int, target int) int {    if len(data) == 0 {        return notFound    }    for _, value := range data {        if value == target {            return value        }    }    return notFound}

同样的逻辑,但是拆分成更细粒度的方法,也有精确的返回语句,可以很容易地通过测试来实现。49J28资讯网——每日最新资讯28at.com

continue 操作

该操作符与 break 类似。为了正确阅读代码,您应该牢记它对操作顺序的具体影响。49J28资讯网——每日最新资讯28at.com

func processWords(words []string, substring string) {    for _, word := range words {        if !strings.Contains(word, substring) {            continue        }                // do some buisness logic        performAction(word)    }}

Continue 使得这种简单的流程变得有点难以理解。49J28资讯网——每日最新资讯28at.com

让我们写得更简洁些:49J28资讯网——每日最新资讯28at.com

func processWords(words []string, substring string) {    for _, word := range words {        if strings.Contains(word, substring) {            performAction(word)        }    }}

本文链接:http://www.28at.com/showinfo-26-16385-0.htmlGo 重构:尽量避免使用 else、break 和 continue

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python十大常用库:让你的Python编程更上一层楼

下一篇: Java循环的终止方式

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top