多年前看到老外的**,颇有同感,转帖到21ic网站。最近被“挖坟”,但**已经不见了,重新贴一下
原文见 http://www.ibm.com/developerworks/cn/linux/l-clear-code/
编写易于理解代码的六种方式
如何让您免受读不懂代码的折磨
Jeff Vogel (spidweb@spiderwebsoftware.com), 总裁, Spiderweb Software
简介: 对于一名开发人员,时间是最宝贵的资源。本文所要介绍的这六种编写可维护代码的方法可以保证让您节省时间和少受挫折:在编写注释上多花一分钟,会让您少受一小时研读代码的痛苦折磨。
发布日期: 2007 年 6 月 18 日
级别: 初级
访问情况 : 6976 次浏览
评论: 0 (查看 | 添加评论 - 登录)
平均分 (7个评分)
为本文评分
我学习编写、改善和维护代码的过程是很艰苦的。在过去的 12 年里,我一直在编写计算机游戏并通过曾红极一时的共享软件技术进行网络销售,并以此为生。这就是说,我常常要从空白的屏幕开始从头编码,当代码达到数万行之后才能拿去销售。
这也就是说,如果我出了错,我必须要自己去解决问题。当我在凌晨三点还在竭力寻找 bug 的时候,看着这些不知所云的晦涩代码,我不禁自问:“我的天啊,这些垃圾代码究竟是哪个笨家伙写的啊?”,很不幸,问题的答案是 “我”。
在学习了良好、正规的编码技巧之后,我大受其益。本文就包括了其中的一些实践。具有丰富经验的资深程序员大都对这些内容烂熟于心。他们可以通过本文优美的散文式的介绍再重温一遍,并可回顾一下在采取清晰编码的理念之前,编码是多么地令人头痛。
但更多的人会如同我一样,是无意间跌跌绊绊地闯入编程领域的,而且没有人为其灌输这些编程技巧和理念。本文所要介绍的这些内容对很多人来说也许很基础,但对于其他人来说却是极为宝贵的资源,因为之前没有人告诉过他。所以,如果您不想走弯路,那么本文将非常适合您。
示例
为了便于解释,本文全篇都将使用一个示例太空游戏程序,称为 Kill Bad Aliens。在这个游戏中,您将通过键盘来控制一个宇宙飞船,它可以在屏幕底端水平向前或向后移动,还可以向上发射子弹。
图 1. 我们的假想游戏
游戏发生在称为 Wave 的各个时间段。在每个 wave,外星人都会一个接一个地出现在屏幕顶端。它们到处飞,还会投掷炸*。外星人将按固定时间间隔出现。在杀死一定数量的外星人之后,一个 Wave 就告结束。
杀死一个外星人会给您加分。当结束一个 wave 时,根据您完成游戏所需时间的长短还会有额外的分数奖励。
如果被炸*击中,您的当前飞船就会炸毁,另一个飞船继而出现。如果被炸毁超过三次以上,游戏就结束了。如果您的得分很高,就会被晋级为 “人”,如果分数很低,就不能。
现在,我们可以坐下来开始用 C++ 编写这个 Kill Bad Alients 游戏了。首先定义几个对象来分别代表飞船、玩家的子弹、敌人和敌人的子弹。然后再编写代码来绘制这些对象。还需要编写代码来让这些对象可以随着时间的推移而到处移动。另外,也需要编写游戏逻辑、外星人 AI 以及能感知用户击键用意的代码等等。
那么,我们该如何实现这些以便当游戏编制完毕后,代码易懂、易维护,最起码地,不会一团糟呢?
回页首
提示 1:经常注释
请经常为代码添加注释。假设您编写了一个过程,但没有为它做注释,几个月后,您再回过头来想对它进行一些修整(您绝对会这么做),将需要花费很多时间去研读这些代码,原因就是因为您之前没有做注释。而时间是您最为宝贵的资源。丢失的时间是永远也找不回来的。
但注释和其他事情一样也是需要技巧的。只要多练习,在这方面的技能就会不断提高。注释有好有坏。
最好不要将注释写得过长。假设为一个函数做了注释,而这个注释在将来可以节省您理解代码所需的时间,比如说 10 分钟。这很好。现在假设所编写的注释过长,您花了 5 分钟编写这个注释,之后还要再花 5 分钟读懂这个注释。这样一来,实际上没有节省任何时间。这不是一种很好的做法。
当然,也不要将注释写得过短。如果在一两页之长的代码中找不到任何注释,那么这段代码最好清晰得 “晶莹剔透”,否则将来研读所需的时间将会很长。
再有,注释的方式不能太死板。当刚刚开始编写注释时,人们往往会头脑一热,写下这样的注释:
// Now we increase Number_Aliens_on_screen by one.
Number_Aliens_on_screen = Number_Aliens_on_screen + 1;
这么明显的东西显然不需要注释。如果代码非常混乱以致于需要逐行注释,那么更有利的方式是首先简化代码。在这种情况下,注释并不能节省时间,反倒会消耗时间。因为注释需要时间去研读,而且它们分布于屏幕上的实际代码中的不同位置,所以在显示器上一次只能看少许的注释。
此外,千万不要这么写注释:
Short get_current_score()
{
|