`

干掉你程序中的僵尸代码【转】

 
阅读更多

随着万圣节越来越流行,我感觉有必要跟大家讨论一下一个在软件开发中非常普遍的问题:僵尸代码。几乎所有我接触过的代码库里都四散着很多小段的,甚至大片大片的被注释掉的代

随着万圣节越来越流行,我感觉有必要跟大家讨论一下一个在软件开发中非常普遍的问题:僵尸代码。几乎所有我接触过的代码库里都四散着很多小段的,甚至大片大片的被注释掉的代码。这就是僵尸代码。

为什么称它们为僵尸代码?你知道,僵尸不并不是真的死的。就像恐怕电影里告诉我们的,尽管僵尸看起来是死人,但它们仍有能力四处出没袭击我们。相同的道理,僵尸代码也是处于不生不死之间…它们在伺机搞砸我们的工作。注释掉的代码还活着,它们就存在我们的代码库中。程序员在维护和重构代码时会和它们遭遇,通常是滚动屏幕时和它们擦肩而过,或是在进行关键词搜索时和它们撞个满怀。但这些代码也确实是死的,因为它们在软件产品中并不执行。因此,这些僵尸就应该被烧掉,立刻。

僵尸代码不死之躯

我认为,有两个原因导致了僵尸代码的肆虐:懒和害怕风险。懒程序员对代码有收藏癖。他们缺乏确信的勇气和清楚的认识去删除无用的代码,于是他们就把它们隐藏在注释里,期望有朝一日它们能复活来再次祸害人。代码需要经常的、有计划的删除,因为优秀的程序员都知道:代码就是债务。越少越好。当然,被注释掉的代码仍然是代码。

烂程序员也许会争辩说,他们注释掉这些代码是为了“万一”以后有人会需要它们。事实上,这好心反而是害了大家。这实际上说的是害怕风险,缺乏对版本控制系统作用的信任。有版本控制系统在,删除的代码永远不会真正的死掉。它们被埋到棺材里但却活着。所以,注释代码的方法没有多大实际效用。

对于程序来说,注释掉的代码跟删掉的代码一样,不起任何作用。让代码半死不活,以僵尸的形态存在,造成技术债务,最终会让你的团队受害。要果断,删掉它们。

僵尸代码降低信噪比

当写程序时,我们一定要努力使代码里有效信息的比率越高越好。这有助于人们理解程序,更快的阅读代码,防止我们因为误解而写出有问题的代码。僵尸代码直接的对抗代码的可理解性。它拖延我们阅读和维护代码的速度,因为它使我们在屏幕上看到更少的有效代码。它们就是视觉噪音,干扰人们的正常阅读。处于某些原因,有些程序员会接受这种妥协的做法,可是在现实中,谁会接受这种乱糟糟的画面。想象一下,如果纽约时报看起来像这个样子:

如何阅读这断断续续的文字?噪音的增加就是对可理解性的损害。对这些被注释掉的部分,尽管它们毫不相干,甚至会误导,但你却无法对它们视而不见。有人会说,这不是最终发布的产品,这些代码存在于开发过程中,拿它们跟发布的产品做对比,这就像拿苹果比桔子。但是请记住,被写出的每行代码平均都要被阅读10次。没错,你的代码的阅读人数没有纽约时报多,但是,你拥有的是一个最重要的忠实的阅读群体。就是我们。Knuth对此关切进行了精辟的总结:

“编程是一种一个人告诉另一个人他想让计算机做什么的艺术。”DonaldKnuth

而僵尸代码让你讲话讲不清楚。一个程序员需要去阅读被注释掉的代码吗?

僵尸代码造成歧义妨碍调试

注释掉的代码会带来歧义,人们会怀疑这些代码是否该注释掉。试想一下,你是一个来维护程序的程序员,突然看到了一片注释掉的代码,而程序就在这附近出了问题。这个程序员的任务会变得更棘手。他需要阅读和理解这些注释掉的代码,了解注释它们带来的影响。是因为测试而注释这些代码但忘了恢复吗?也许注释这些代码的人可以提供帮助,但他是谁?调查行动开始。多余的歧义会消耗你的时间,增加你的思考负担——本来可以是一次轻松的调试过程。

僵尸代码影响关键词搜索

在大型程序库中,grep/find命令将会是你锁定某些特定的代码片段的雷达。然而,如果程序库里到处散布着僵尸代码,很有可能你捕捉到的目标都是被注释掉的。这是干扰。浪费时间。

僵尸代码影响代码重构

反省(重构)能修复我们的灵魂。我们应该以小孩scout的做事原则为荣,永远把代码收拾得比你想象的要整洁。然而,当一个类或方法包含有大量的僵尸代码时,事情就不好处理了。如果重构这段程序,我是否还要参考注释掉的代码?它们近期将会被重新使用吗?它会影响我的新版的实现吗?这些问题对于维护的程序员来说本该不需要回答的。

此外,集成重构工具根本不会考虑这些注释掉的代码。因此,当方法,变量,类被重命名或修饰符改变时,这些注释掉的代码就不会同步做修改。当你再想把注释掉的代码复活时,它们很可能根本不能编译。

有例外吗?

没有。很明确。有人会说“我现在注释它们是因为我过会儿就要恢复它们。”OK,假设你是个家庭妇男,你走到起居室,看到:

想想你内心的对话。这是个漂亮的房子,但这个东西又丑且怪异。我想开灯,但怎么会有胶带?如果我撕掉胶带去开灯,会发生什么事情?你很可能最终决定找贴胶带的人。“哦,我想打开吊扇,但它启动时来回摇摆,掉了下来,我想修理它….”当然,这是应该的。而在你没修好它之前,胶带一直贴在开关上。我们当然不该让这些只修了一半的东西存在屋内。同样,我们也不接受这样的代码。

说的更明白些,任何被注释掉的代码都是僵尸代码,都应该被删掉。不管有多少。不管是在发布的产品中还是在开发环境中。僵尸代码有时会在生死之间摇摆。如果代码被注释掉,这很有可能有东西没有完成。经常是配置需要来回切换或逻辑分支左右摇摆。注释代码可能会做实验性的来回切换,删除这些代码,建一个记事贴,记录下需要做的事情。在记事贴中记下哪次提交版本时删除了这些代码。或者,新建一个版本分支专门做这事,合并时删除它们。这样,维护工作就不会受到干扰。

心里的核对表
如果你打算要注释一段代码,请先问问自己:

如果有可能的话,什么时候会取消注释?
是否能删掉它,如果日后有需要,从版本控制系统里找回?
对这些未完成的、有可能会回滚的代码,能否用版本分支来处理?
这种需要来回切换注释的功能可否通过配置实现?
重构时也需要重构这些注释掉的代码吗?
让我们开启第一次年度万圣节僵尸代码大清剿。

分享到:
评论

相关推荐

    Python植物大战僵尸源代码

    在Python版植物大战僵尸中,主要运用了面向对象编程思想,通过类和对象来实现游戏的各种元素,如植物、僵尸、场地等。 游戏的核心部分是game.py,这是一个主程序文件,它包含了游戏的主要逻辑。在game.py中,你可以...

    基于QT开发的植物大战僵尸游戏源代码,C++程序设计期末课程设计

    在本项目中,学生以“基于QT开发的植物大战僵尸游戏源代码”为主题,完成了C++程序设计的期末课程设计。这个项目不仅展示了C++语言的强大功能,还突显了QT框架在图形用户界面(GUI)开发上的优势。以下是关于这个...

    植物大战僵尸代码以及素材

    植物大战僵尸代码以及素材

    c++的植物大战僵尸模型以及代码c++编写

    10. **错误处理和调试**:良好的错误处理机制能确保程序在遇到问题时不会崩溃,而调试工具如GDB可以帮助定位和修复代码中的错误。 通过以上知识点的实施,我们可以构建一个基本的植物大战僵尸游戏模型。这个项目将...

    植物大战僵尸代码

    根据提供的标题、描述以及部分代码内容,我们可以了解到这是与游戏《植物大战僵尸》相关的代码片段。下面将基于这些信息深入探讨几个重要的知识点: ### 1. 植物大战僵尸游戏简介 《植物大战僵尸》是一款由PopCap ...

    Python 植物大战僵尸代码实现

    Python 植物大战僵尸代码, 使用pygame,功能实现如下: - 支持的植物类型:太阳花,豌豆射手,寒冰射手,坚果,樱桃炸弹。 - 支持的僵尸类型:普通僵尸,棋子僵尸,路障僵尸,铁桶僵尸。 - 使用json文件保存关卡信息...

    植物大战僵尸FLASH源代码

    4. 动画系统:FLASH的动画功能强大,源代码中包含了游戏内的各种动画效果,如植物发射豌豆、僵尸倒下等,这些都是通过时间轴和ACTIONSCRIPT结合实现的。 5. 音效处理:游戏中的音效是提升用户体验的重要组成部分,...

    Scratch少儿编程项目源代码文件案例-植物大战僵尸.zip

    《Scratch少儿编程项目源代码文件案例-植物大战僵尸》是一个专门为儿童设计的编程学习资源,旨在通过游戏化的教学方式,让孩子们在娱乐中掌握编程基础。该项目基于Scratch编程平台,利用其可视化编程语言,让孩子能...

    植物大战僵尸源码分享,javascript开发代码

    同时,"原版的植物大战僵尸JS版开源程序"表示我们有机会查看和学习到游戏的核心逻辑,这对于理解游戏机制和提升编程技能都极具价值。 接下来,我们关注一下标签:"植物大战僵尸 僵尸源码 植物代码 植物大战僵尸源码...

    C++程序设计期末课程设计QT开发的植物大战僵尸游戏源代码.zip

    C++程序设计期末课程设计QT开发的植物大战僵尸游戏源代码附开发文档 架构 采用 Qt 的 Graphics View 框架,Graphics View 框架提供了一个用于管理和交互大量定制的图形 项 Item 的场景 Scene,和一个用于可视化这些...

    在线H5网页版植物大战僵尸游戏源代码

    源代码中的JavaScript代码可能是游戏的核心部分,包括植物的生长、僵尸的移动、攻击判定等复杂逻辑。 4. **图像资源**:游戏中的所有视觉元素,如植物、僵尸、背景、图标等,通常以PNG或JPEG等格式存储。源代码中应...

    植物大战僵尸源代码.zip

    《植物大战僵尸源代码》是一款基于HTML和JavaScript技术开发的网页版游戏,它复刻了经典的游戏体验,提供了丰富的植物、僵尸以及多样的地图资源。这款游戏不仅包含了原版的多种游戏模式,还允许用户进行代码的添加和...

    C++编写植物大战僵尸 源代码

    在植物大战僵尸的源代码中,主要涉及以下几个关键知识点: 1. **面向对象编程**:C++的强项在于它的面向对象特性,通过类和对象的设计,可以清晰地模拟游戏中的各个元素,如植物、僵尸、场地等。每个类都包含了相关...

    植物打僵尸代码

    "植物打僵尸代码"是一个与游戏开发相关的主题,特别是针对一款名为"植物大战僵尸"(Plants vs. Zombies)的流行游戏。在这个项目中,我们可能会涉及到以下几个关键知识点: 1. **游戏编程基础**:游戏代码是计算机...

    植物大战僵尸源代码及图片

    在《植物大战僵尸》的源代码中,我们可以学习到如何利用Python进行游戏逻辑设计,包括事件处理、对象交互、状态管理等。 2. **Pygame库**:Pygame是Python的一个扩展库,专门用于开发2D游戏。它提供了窗口管理器、...

    植物大战僵尸-少儿编程scratch项目源代码文件案例素材.zip

    这个压缩包提供的"植物大战僵尸.sb2"文件,是一个完整的源代码案例,适合童程童美以及其他对少儿编程感兴趣的群体。 Scratch是麻省理工学院(MIT)媒体实验室“终身幼儿园团队”开发的一款图形化编程工具,专为初学者...

    Java植物大战僵尸代码.zip

    【Java植物大战僵尸代码.zip】是一个包含Java编程语言实现的"植物大战僵尸"游戏源代码的压缩包。这个游戏是基于著名的PopCap Games开发的《植物大战僵尸》的简化版本,旨在帮助开发者理解游戏开发的基本原理,同时...

    手机游戏 植物大战僵尸2011.jar程序java源代码

    4. **游戏对象**:在植物大战僵尸中,`p.class`可能代表植物类,`e.class`可能代表僵尸类,而`i.class`、`m.class`等可能包含了游戏中的其他元素或系统。每个类都封装了对象的属性和行为。 5. **事件处理**:游戏...

    植物大战僵尸1.0 python代码

    在植物大战僵尸中,游戏的每一帧更新都由一系列这样的控制结构来实现,例如检查是否有僵尸到达了花园,或者植物是否已经耗尽能量。 其次,数据结构的应用也是关键。游戏中的每个元素,如植物、僵尸、阳光等,都可以...

Global site tag (gtag.js) - Google Analytics