本文讨论被间接代码毁掉的可阅读性。

作者 | Matthew Rocklin

译者 | 弯月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:

我常常看到有些代码的作者为了抽象,而把细节放入某个外部函数中。请看下面的例子。

加入间接代码之前:

# main.pyif x.startswith("foo"):    do_something_with(x)

if x.startswith("foo"):    do_something_with(x)

加入间接代码之后:

# main.pyif is_foolike(x):    do_something_with(x)

if is_foolike(x):    do_something_with(x)
# utils.pydef is_foolike(x):    return x.startswith("foo")

def is_foolike(x):    return x.startswith("foo")

这种做法的理由可能包括:

  • 如果代码重复多次,那么这种抽象可以让代码更紧凑;

  • 如果代码重复多次,那么就应该找一个位置集中管理这段逻辑,以便将来可以集中修改;

  • 这种抽象隐藏了与功能要点无关的细节,就像散文中的脚注;

  • 这种抽象通过函数名称作为内联文档为一组操作命名;

  • 感觉代码更干净,更抽象。

学校老师就是这么教我们的——找到一些功能,抽象出去,然后继续。

避免间接的情况

然而,这种添加间接代码的行为也需要付出代价。当其他人阅读这段代码时,他们需要在多个文件定义的多个函数之间跳转。这种非线性的阅读过程更加耗费阅读者的精力。

在写代码的过程中,加入这种间接代码并没有任何问题,写代码的人的脑海中建立了一个抽象模型,因此将这种抽象写入代码是有意义的,感觉很好。但是,当其他人需要快速检查和理解一段代码时,就会遇到大麻烦。这发生在两种重要的情况下:

1、在代码审查期间。当其他人需要在代码合并到主项目之前,检查代码是否合理。这些审查人员需要花费的时间大约是写代码的时间的十分之一。

2、将来的调试。如果代码中存在任何问题,那么将来完全陌生的开发人员将不得不查看这段代码,并搞清楚代码的内容。他们必须在几分钟内理解这段代码,并确定相关的内容。他们没有时间理解代码背后完整的思维过程,而间接的代码会大大减慢理解的过程。

与原来的开发过程相比,现代社区代码中的审查和调试往往是瓶颈。因此,我经常鼓励开发人员避免抽象,并将函数定义写在代码内部。

我们仍然应该使用函数

需要明确的是,我们有很多理由将复杂的逻辑分成多个函数,特别是面对重复代码的时候,或者某些重要的政策可能会在将来发生变化时。因此,我们需要找到一个平衡点。

我希望在大多数情况下,写代码的人能够意识到除了原作者之外,每个阅读代码的人都会感受到间接代码带来的附加成本。

原文:http://matthewrocklin.com/blog/work/2019/06/23/avoid-indirection

作者:Matthew Rocklin,维护与协调Python数字计算生态系统中的多个库,特别是有关高效和可扩展的计算。

本文为 CSDN 翻译,转载请注明来源出处。

【END】

 热 文 推 荐 

☞小鹏员工承认备份特斯拉源代码;Apple Watch 现漏洞;Python 3.7.4 发布 | 极客头条

☞JavaScript 的函数式编程与面向对象编程区别在哪?

如果微软开发了 Android,会有何不同?

我在阿里的十年:从 BI 到产品经理,曾被程序员踢翻桌子骂

☞Libra的Move编程语言到底是个啥? 美女程序员通读26页的白皮书后, 找出了这些精华… | 技术头条

☞文末送书啦!| Device Mapper,那些你不知道的Docker核心技术

☞BigBiGAN问世,“GAN父”都说酷的无监督表示学习模型有多优秀?

☞学好正态分布有多重要?

☞实测!华为鸿蒙比 Android系统快60%!

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

为什么程序员应该避免间接代码?相关推荐

  1. java程序员可以只用windos吗_程序员要写多少代码 才能开发一个window操作系统

    开发一个window操作系统需要程序员写多少行代码呢? 微软的Windows系统是伴随我们已久的老朋友了,大多数人都是一代一代Windows的用上来,老用户几乎都形成一个共识,就是微软的系统有一代会很 ...

  2. python表白代码如何运行-程序员如何实现表白代码

    程序员实现表白代码的方法:首先打开代码编辑器:然后输入告白代码[while (life < end) {love++;},var you = function from_future_impor ...

  3. 程序猿之歌 PHP,1024丨腾讯第一首程序员之歌【Code代码】

    原标题:1024丨腾讯第一首程序员之歌[Code代码] "发布总是在半夜 回滚是永远的愁". 内存泄漏.深夜发布.需求变更,这些熟悉的词语和场景,相信对于每个程序员朋友来说,都有着 ...

  4. 多少行数_经验丰富的程序员和其每日代码行数

    John D. Cook是一位数学教授.程序员.顾问.经理人和统计学家,善于并享受结合运用这些技能来解决问题.他曾撰文说(中文): "最近,我听说了一个关于缺乏经验的程序员和经验丰富的程序员 ...

  5. 程序员在网吧写代码被暴打一顿!

    近期在网上看到一个新闻,程序员在网吧写代码被人暴打一顿! 事情是这样子的,那位程序员家里电脑坏了,又有一个很急的项目要赶,就在小区楼下的网吧去写代码!由于时间很急,项目有很大,程序员的思路必须非常清晰 ...

  6. 看国外女神级程序员,直播写代码一年的感悟

    我第一次直播写代码是在去年七月份.我想要直播一下我在业余时间内为开源项目领域所做的工作,尽管在youtube上的大部分直播都是关于游戏的.我比较擅长于NodeJS的硬件库方面的工作(尽管大部分项目都是 ...

  7. 支付宝程序员眼中的极致代码和卓越程序员是什么样的?

    "双十一"前夕,支付宝BASIC College举办了一场名为"超级Ma力大赛"的活动.这是一场只用代码说话的竞赛,共有数千名支付宝的工程师参加,程序员和程序媛 ...

  8. laravel改代码没变化_菜鸡程序员是如何写代码的?

    每个程序员都要历经从菜鸡到大牛过程蜕变胡过程.当初大家起点都差不多,工作多年后,有些人依然停留在菜鸡,有些人却已成为大牛,所有的事情,都是一点一滴习惯养成.让我们看看菜鸡程序员是如何写代码的?有可能找 ...

  9. 某程序员在网吧敲代码,出类拔萃,网友:为何我被打的却是我

    相信现在很多年轻人的娱乐场所都是网吧,并且绝大多数的人去网吧都是为了打游戏,很少有去学习的,但是伟大的程序员就不一样了,做什么事都是出类拔萃,引人注目,这里就有一名程序员在网吧敲代码,从打游戏的这群人 ...

最新文章

  1. PLSQL的 dynamic sql小例子
  2. redis系列:基于redis的分布式锁
  3. SET NOCOUNT ON 作用
  4. python优先队列_python实现最大优先队列
  5. python实现父类继承_Python多继承用super调用父类方法?
  6. C语言试题五十五之m个人的成绩存放在score数组中,请编写函数function,它的功能是:将高于平均分的人数作为函数值返回,将高于平均分的分数放在high所指定的数组中。
  7. Python中list(列表)、tuple(元组)、dict(字典)的基本操作快速入门
  8. codevs1700 施工方案第二季
  9. TextureUnpacker 分割 Texturepacker 产生的图片 支持windows 和 mac
  10. 超实用的脚本——检查oracle数据库是否存在潜伏的比特币勒索病毒
  11. php+psr4和自动加载,php自动加载规范 PSR4 (Thinkphp)
  12. Illustrator 教程,如何在 Illustrator 中创建和编辑作品?
  13. JSON (JavaScript Object Notation)
  14. 永久免费建站-个人博客开发
  15. 《高仿支付宝运动轨迹七日曲线图》
  16. java高并发之魂:Synchronize
  17. python数据分析与应用-Python数据分析与应用-课后习题答案
  18. 一文掌握inbreeding coefficient近交系数的计算
  19. 搭建vue前端脚手架
  20. 逐梦offer -- JVM篇

热门文章

  1. 在Axure中通过全局变量实现两个文本框与中继器联动
  2. SQL:union \union all、intersect 、except的用法
  3. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·002【SQL介绍、数据库的CRUD操作(DDL语句)】
  4. php中svn上传项目直接访问不了,phpstorm8 通过svn导入项目后项目右键列表里没有subversion选项,无法提交和更新啊?...
  5. MySQL课设小问题_MySQL必会的50个常见面试练习题
  6. linux静态和动态路由英文,静态路由和动态路由的特点
  7. escilpse 连接mysql,浅谈docker-compose网络设置之networks
  8. Linux生成子进程函数fork()
  9. 2021年中国地下采矿机械市场趋势报告、技术动态创新及2027年市场预测
  10. IT必须掌握的面试大全技巧教你怎么回答