我在2016年伦敦Golang英国会议上谈论代码缩进线

在近期伦敦举行的 Golang 英国会议 上,我在地道的Go 语言窍门 交流(幻灯片)中讲到关于代码中的缩进线, 我想在这里稍微解释一下。

缩进线是“观察者无障碍视线的直线”

良好的代码缩进线不仅对你的功能没有任何影响,还可以帮助其他需要的人阅读你的代码。其他程序员(包括你未来的自己)可以浏览一个专栏并且理解代码的预期流程。如果他们不得不在脑子里分析 if 语句,若没有良好的缩进线,将会使这个任务变得非常艰难。

大多数人关注编写代码的代价(比如“这需要多长时间才能完成?”)但是维护代码的成本要高得多 - 特别是在成熟的项目中。 让功能明显,清晰,简单易懂才是至关重要的。

良好缩进线的建议:

  • 快乐路径居左侧对齐,这样你就可以快速扫描一列来查看预期的执行流程
  • 不要隐藏缩进大括号中代码逻辑
  • 尽早的退出 function
  • 避免 else return,考虑翻转 if 语句
  • return 声明作为最后一行
  • 提取 functionmethod 以保持结构小巧和可读
  • 如果你需要大缩进的代码,考虑当做一个 function 分解出来

当然,会有很多很好的理由来打破所有这些规则 - 但是采用这种风格作为默认规则,我们发现我们的代码变得更具可读性。

避免 else return

编写具有良好视觉效果的代码的关键是保持 else 结构小巧,或者如果可以的话,完全避免它们。 看下这个代码:

if something.OK() {something.Lock()defer something.Unlock()err := something.Do()if err == nil {stop := StartTimer()defer stop()log.Println("working...")doWork(something)<-something.Done() // wait for itlog.Println("finished")return nil} else {return err}
} else {return errors.New("something not ok")
}

这代表了我们最初如何思考我们的功能在做什么(“如果某件事情没问题,那么就做,如果没有错误,那么做这些事情”等等),但是它变得很难遵循。

上面的代码很难遵循'快乐路径'(执行顺利进行的路线)。它在第二行开始缩进并从那里继续。 当我们检查来自 something.Do() 的错误返回时,我们进一步缩进。 事实上,语句“ return nil ”在代码中间完全丢失。

else 结构在 Go 和其他语言中作为单一行返回很常见,因为它们要处理中止或退出函数。 我认为他们不能保证缩进我们的其他代码。

翻转 if 语句

如果我们要翻译 if 语句*(如果你喜欢* , 就把它们过来) ,你可以看到代码变得更加可读:

if !something.OK() {  // flippedreturn errors.New("something not ok")
}
something.Lock()
defer something.Unlock()
err := something.Do()
if err != nil {       // flippedreturn err
}stop := StartTimer()
defer stop()log.Println("working...")
doWork(something)
<-something.Done() // wait for it
log.Println("finished")
return nil

在此代码中,我们正在尽早退出,退出代码与正常代码不同。而且,

  • 快乐路径沿着左侧向下保持,
  • 我们缩进只是为了处理错误和边缘情况,
  • 我们的 retutn 声明“ return nil ”在最后一行,并且,
  • 我们有更少的缩进代码块。

促进大型条件块的功能

如果你不能避免一个笨重的 else 结构或臃肿的选择切换的情况(我明白了,有时候你不能),那么就考虑把每个结构分解成它自己的功能:

func processValue(v interface{}) error {switch val := v.(type) {case string:return processString(val)case int:return processInt(val)case bool:return processBool(val)default:return fmt.Errorf("unsupported type %T", v)}
}

这比读取大量的处理代码更容易阅读。

分享你的经验

如果你同意我的观点,请考虑分享这篇文章 - 随着越来越多的人注册,更好的(更一致的)Go 代码将会出现。

你有一些难以阅读的代码吗? 为什么不在 Twitter @matryer 上分享它,可以看看我们是否可以找到一个更清洁,更简单的版本。

致谢...

评论家戴夫切尼大卫埃尔南德斯威廉肯尼迪

pycharm缩进对齐线_代码中的缩进线相关推荐

  1. java美元兑换_代码中的美元$

    这个题目其实有点标题党了,其实本篇文章主要内容应该是说"代码中的美元符号(dollar sign)".想总结一下我所看到的美元符号在代码中的起到的作用,当然了并不是说它作为格式化字 ...

  2. c# mysql代码中写事务_代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性...

    [c#]代码库代码中使用事务前提:务必保证一个功能(或用例)在同一个打开的数据连接上,放到同一个事务里面操作. 首先是在D层添加一个类为了保存当前操作的这一个连接放到一个事务中执行,并事务执行打开同一 ...

  3. 如何应对java服务器宕机_代码中如何应对缓存服务器宕机的情况

    今天在演练这样一个场景--假如所有缓存服务器都宕机,而且不能很快恢复,并且假设数据库服务器能够支撑,在代码中如何应对这样的情况? 之前的做法是在读缓存的地方捕获异常并写入日志,然后直接从数据库读取数据 ...

  4. java 代码坏味道_代码中的坏味道

    前言 在日常生活中,当我们买的水果放久了之后会发出一种难闻的气味("坏味道"),这个时候我们就应该把它扔掉.同样,代码也有"坏味道",当然确定什么是和不是代码& ...

  5. 找不到libmmd.dll无法继续执行代码_代码中的软件工程 - xieyupei

    ------------恢复内容开始------------ 本博客基于孟宁老师的menu项目案例,以VS Code + GCC运行环境.对代码开发中的软件工程思想做出一些思考. 相关资料: 项目源码 ...

  6. 17_传智播客iOS视频教程_代码中的面向过程与面向对象以及优缺点分析

    12312312 转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/7150982.html

  7. python中、if语句的下一句一定要缩进吗_【python公开课|Python if else对缩进的要求是什么,想做好python,就一定要看这个文章】- 环球网校...

    [摘要]在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注py ...

  8. 修改PyCharm缩进快捷键

    修改PyCharm缩进快捷键 PyCharm是一个广受欢迎的Python IDE,它提供了许多特性和工具来帮助您更有效地编写代码.其中一个重要的特性是缩进,它可以帮助您保持代码的可读性和一致性.在Py ...

  9. python代码模板_代码风格与文件模板

    1.文件模板 敢问童鞋们,是否有见过其他人的pycharm代码,上方总有一行"注释"一样的代码? 既能保留当时写代码的时间,也能指定文件字符编码,竟然还可以有一个署名!作者权呀! ...

最新文章

  1. linux工作笔记-linux之间文件传输图形界面工具gftp
  2. 怎么去掉ECSHOP的Powered by ECShop版权信息
  3. 最易懂的Spring IOC原理讲解
  4. linux centos php 安装,linux centos7.4 php7.1.31安装
  5. 基于FPGA实现IIC接口(EEPROM)
  6. django项目转pyc_Python自动化运维系列:Django搭建小博客
  7. Javascript游戏,街头霸王
  8. 同一个按钮,实现排序
  9. 虚短”“虚断”两板斧,搞定运算放大器 11张大图详(转)
  10. Legion使用:半自动化网络渗透工具
  11. qt自定义窗口标题栏
  12. PHP初级学习(三)
  13. linux qt kits叹号,windows系统,HBuilderX无法启动、点击无反应、或启动报错的解决方案...
  14. 基于python的百度云网盘资源搜索引擎设计架构
  15. Android自定义Drawable第十五式之啡常OK
  16. Windows Presentation Foundation 巡游
  17. VC窗口刷新InvalidateRect和…
  18. 微信公众号多客服开发介绍
  19. wyAPP苹果APP 技术支持Email:zcj331@163.com
  20. 花了六年时间,我才和你坐在一起画拓扑

热门文章

  1. Docker-创建支持ssh服务的镜像
  2. 【iOS】彩虹渐变色 的 Swift 实现
  3. share my tools With Xcode
  4. python3 urllib模块
  5. Ms Excel 2010合并单元格方法
  6. DotText源码阅读(2)-工程、数据库表结构
  7. PyCharm中文指南2.0
  8. JAVA基础之变量(数据类型及其转换)
  9. warning: initialization from incompatible pointer type error, forbidden解决
  10. Linux修改的文件“修改时间”