点击上方“CSDN”,选择“置顶公众号”

关键时刻,第一时间送达!

我们的代码库混乱得一塌糊涂。所以有一天,我们决定做一些改进:也就是移动一堆文件。于是,我们花了两个月的时间完成了此次重构。

【编者按】本文作者Craig Silverstein 写了一系列文章来记录可汗学院在 2017 年和 2018 年对 Python 代码进行的重大重构,本文为其中第一篇。在本文中,作者介绍了代码在哪些地方出现问题,想要努力修正的内容,以及这项工作为何如此之困难,从而来帮助人们利用本文中介绍的技巧和代码来避免这些困难。

注:可汗学院(Khan Academy),是由孟加拉裔美国人萨尔曼·可汗创立的一家教育性非营利组织,主旨在于利用网络视频进行免费授课,现有关于数学、历史、金融、物理、化学、生物、天文学等科目的内容。

以下为正文:

我们的代码库混乱得一塌糊涂。所以有一天,我们决定做一些改进:也就是移动一堆文件。于是,我们花了两个月的时间完成了此次重构。

我们的代码库究竟有什么问题?可能包括:

  1. 有一些文件名为 parent.py,coaches/parent.py,users/parent.py 和 api/internal/parent.py,每个文件都包含了有关可汗学院学生家长的部分逻辑。

  2. 有一个名为 login.login.Login.login 的方法。 (这个方法是登录过程的一部分。)

  3. 根目录有 234 个 python 文件。超过 10%的代码保存在根目录。不看也知道,很多文件之间根本毫无关联。其中有 ip_util.py 等底层工具,也有 dismissed_items.py 等奇怪的特殊工具,还有 activity_summary.py 之类的应用程序逻辑文件,以及 appengine_stats.py 等开发工具。我们还有 93 个 Python 子目录。 (另外还有一些非 Python 代码。)虽然根目录被各种文件塞满,但是其中 30 个子目录仅包含不到 5 个文件。

经过重构后,与家长有关的代码仅保存在两个 Python 文件中。(一个是 API,另一个囊括了所有其它内容。)登录方法现在叫做 login.handlers.ka_login.login_and_set_current。并且 Python 子目录减少到了原来的一半,而根目录中的文件数量只有原来的 1/20。

这些问题都是如何发生的?

说的冠冕堂皇一点就是日积月累。大家在创建子目录的时候,以为那个目录会成为重大项目,但是事实却并非如此。而大家把新建的文件放在根目录下的原因是根目录下有个相似的文件。最终问题就一点点积累起来了。在找不到与手头的工作相关的已有代码时,我们一般都会在新文件中写新的代码。而当代码的组织变得毫无道理时(与公司当前的产品或与组织结构不相关时),大家找不到更好的地方保存新文件,所以就随便放了。没有人专门负责代码的结构,代码永远也得不到任何修整与重塑。

我们进行了哪些改善?

我们在 2017 年底预留了 6 周时间,让整个公司集中精力解决技术债务,因此我们 3 人决定利用这段时间来重塑代码库(Python 部分)。

注:我们只重构了 Python,因为 Javascript 代码已经组织得很好了。JS 代码组织得越好,用户的下载包就越紧凑,且用户体验越快。因此,JS 代码在提高性能的时候已被清理得很整齐,而 Python 代码还很乱。

我们从子目录着手。一位熟悉大部分代码库的高级工程师设计了初步的目录结构。其中一些用于 test_prep 或 translation 等产品。其他一些则用于 coaches 或 login 等主要数据结构和工作流程。还有一些用于邮件或 pubsub 等底层的基础设施。然后他们花了两天时间将代码库中的每个文件都转入了这些目录中。有几十个无法分类的文件,暂时标记为 TODO。

经过这次粗略的修整后,真正的工作才拉开序幕。另一个组重新浏览了代码库中的每个文件,并根据需要进行重新分类。在这个过程中,有些目录被删除了,有些新的目录加了进来,还有些目录被分割或合并了。经过更仔细的检查后,文件最终被转移到别的目录下。期间经常遇到文件被拆分的情况,因为它们保存了不相关的代码。(尤其是一些较大的文件被分到 4 个不同的目录中!)这项工作没有捷径,我们几乎把代码库中所有代码都看了一遍。

这一步中最有意思的事情是我们如何重新考虑代码库的一些部分。例如,以前我们的 emails 目录保存了可以向用户发送的所有类型的电子邮件。经过此次分析后,我们意识到如果 emails(现在改名为 email)中只包含邮件发送框架的话,代码会更整洁,并且每个具体的邮件应该与其最密切的代码保存在一起(比如 SAT 相关的邮件保存在 sat 中,新用户的邮件保存在 login,等等)。与之类似,我们将 API 处理程序从 api 目录中拿出来,放到各自相关的项目目录中。这两种组织方式各有利弊,但是之前我们想都没想就采用了前者。在重构过程中,我们重新考量了这两种方案。

在决定了各个文件的去向后,我们使用了 slicker 来实际移动文件。这个工具就像 mv,但是更加智能,不仅可以重命名文件,还可以自动修正所有的 imports 以及注释和字符串的引用,例如 mock.patch('path.to.symbol')。它还可以将函数和类从一个文件移到另一个文件,因此我们利用这个功能来分割文件。

做 Python 代码重构,竟发现这些“潜规则”!相关推荐

  1. 用Python代码自己写Python代码,竟如此简单

    用Python代码自己写Python代码,竟如此简单 Python作为一门功能强大且使用灵活的编程语言,可以应用于各种领域,具有"无所不能"的特质. Python甚至可以代替人,自 ...

  2. python代码重构技巧_Python代码重构

    代码重构是一件很是辛苦却很是有意义的事情,代码重构的缘由在于:django 一.代码过于冗余.沉余架构 二.代码过于耦合函数 三.代码过于复杂学习 四.接口调用超出三层优化 此次重构主要在于架构问题, ...

  3. Python代码重构

    前言: 看网上写Python重构文章的基本都是重复Python编码规范及一些tricks,希望找到简单的唯一性原理 常见问题 代码重复 代码无测试 代码面向过程 质量保证(Quality Assura ...

  4. 重构 Python 代码系列之一

    前言 对自己写的冗长代码,想重构但又无思路?这里整理了系列介绍python代码重构优化的方法,助你一臂之力.这是 Python 重构系列的第一部分,系列文章会陆续推出. 文章目录 前言 1.将for循 ...

  5. python 代码-python经典代码

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 在昨天的文章中,我们介绍了关于python列表推导式 的使用,字典推导式 ...

  6. 代码重构(一):函数重构规则

    [笔记] 以下是通用的代码重构规则 python代码重构技巧看这里:Python重构代码的一些模式 ========================== 重构是项目做到 一定程度后必然要做的事情.代码 ...

  7. eclipse 下安装PyDev并导入faster rcnn python代码调试

    Python在算法研究应用非常广泛,最近要研究faster rcnn的python代码,就得学习python,所以就需要一个趁手的工具来看python代码,否则只是用文本编译器找代码实在是太影响效率了 ...

  8. 假设检验怎么做?这次把方法+Python代码一并教给你

    (图片付费下载于视觉中国) 作者 | Jose Garcia 译者 | 张睿毅 校对 | 张一豪.林亦霖 编辑 | 于腾凯 来源 | 数据派THU(ID:DatapiTHU) [导读]本文中,作者给出 ...

  9. 0代码就能做Python数据分析,这个Jupyter插件,用起来就像Excel一样简单

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码? 没错,只需要加载这个名为Mito的小工具包,用Python做数 ...

最新文章

  1. Rancher-创建自己的应用商店教程
  2. 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载四(使用程序载入事件)...
  3. 差分约束 1:pku 1201 Intervals 2:pku 1364 King 3:hdu 1534
  4. XFtp中文乱码解决
  5. python语言支持苹果系统吗_Mac系统上的一款Python编程平台
  6. 使用 Boost.MPI 的 all_reduce() 计算最小值的示例
  7. vim 实际行跟屏幕行移动命令
  8. 安卓app开发工具_怎么开发app软件需要多少钱?主流app开发工具盘点
  9. 统计个人已完成的工作量_团队工作量及团队价值贡献统计、核算、评审及提升的重要性...
  10. mysql手动安装配置,mysql8.0.11 winx64手动安装配置教程
  11. 重量级 | 重量级!Maven史上最全教程,看了必懂
  12. 9、Fiddler中设置断点修改Request
  13. 前端宽度一至显示宽度不一致_html2canvas在不同设备生成图片大小不一致问题
  14. labelImg标注工具(win10安装)
  15. java从本地下载pdf文件_java下载PDF文件
  16. linux iometer安装教程,硬盘测试软件IOMETER安装配置指南
  17. BigDecimal精度控制
  18. gitlab小记(一)
  19. github这个项目,几行代码生成海报及二维码
  20. AP AUTOSAR 6——Execution Management

热门文章

  1. opencv 编译报错(CMake Error: The following variables are used in this project, but they are set to not )
  2. Linux使用I/O复用函数的超时机制的定时器
  3. 中国蔬菜汤市场趋势报告、技术动态创新及市场预测
  4. dnf显示与服务器数据异常怎么办啊,DNF:你这该死的数据异常网络中断连接,让我心在痛泪在流...
  5. 从入门到入土:Nessus出击:使用nessus扫描某台靶机
  6. 用JAVA FX制作3D魔方游戏
  7. 企业如何挖掘知识“金矿”?这本白皮书讲得够透彻
  8. 7大编程误区,你避开了吗?
  9. Pascal之父、编程祖师爷尼古拉斯•威茨痛批:教授成了项目经理,大学过于“重论文轻教学“...
  10. 有奖征文 | 蒋涛邀你悦评《UNIX传奇》新书,赢技术进阶好礼