注释里尽量写为什么,而不是做了什么。
做了什么,看代码就好,代码不会骗人。但为什么要写成这样,有时候就非常让人困惑。有可能是处理某个 corner case,有可能是绕过某个系统限制,也可能是什么奇葩需求,这种代码,没有当时的 context,过几个月看,像甲骨文一样,不知道是想干什么。再有年轻力壮的,看不顺眼来优化一下,以后就不知道哪个地方会崩了。
其实,大部分的代码应当是不言自明的,不需要注释。
在开发过程中,为了赶进度,我们很容易「欠下技术债务」,也就是为了赶时间,用了一些不规范的写法。技术债务积累多了,人称「屎山」,日后应用出现问题,查起bug来非常的费劲,改起来也可能修一个bug出两个bug,甚至严重的,一改就崩溃。
所以每次发完一个版本,要及时review,并抽时间优化,有必要的话,重构下。关于如何重构我很久之前写过一篇文章,可能观点有点简单,就随便看看吧。
有的人觉得这个代码日后会用到,所以经常把一大段代码注释掉,然后一年过去了,接手的同事也不敢删,于是留了一段祖传的无用注释。我认为,放心删掉吧,把代码变更追踪的功能交给svn或者git等版本管理工具。删了之后在log里写清楚你删了什么内容就好,日后如果用得到,你直接就去log里找当初的更改,然后复制回来就行了。这样做的好处是:
这是老生常谈了,拼音命名变量的坏处是,你很可能很快忘记一个变量的意义,而且可读性也不好。例如下面这段代码,你能看出变量名什么意思吗?
var renwu = new Renwu() renwu.create() renwu.run()
renwu是人物还是任务啊?renwu.run()是人物跑动还是任务执行啊?你可能写完代码三天后都忘了。
有的公司喜欢代码具有「自解释性」,认为代码如果需要注释,那就是代码没写好。其实我认为,写好代码后依然需要规范的注释,这可以方便输出文档,尤其是庞大的项目。例如你是做后端的,你做的REST API客户端要调用,你不能让他们直接读你的代码吧?这时候规范的注释就能帮你很大的忙了。
例如Javadoc,可以把你规范的Java代码注释转成格式好看的文档。
有的人写代码喜欢把所有东西都写在一个函数里,其实大可不必,这样的后果是大量抽象层级不一样的内容连接在一起,导致这个函数可读性不好。这里举个例子
public void loadgame(username+password){ initResource(); Socket s=new Socket("localhost",6666); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); dout.writeUTF(username+password); dout.flush(); dout.close(); loadScene(); }
这是不是读起来磕磕碰碰的。因为他们不是一个抽象层级的代码,你读起来思维需要多次转换。但如果改成
public void loadgame(username, password){ initResource(); login(username, password) loadScene(); } private void login(username,password)) { Socket s=new Socket("localhost",6666); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); dout.writeUTF(username+':'+password); dout.flush(); dout.close(); }
是不是就好读多了,把几个抽象级一样的函数放一起,把底层操作分开函数放。这样不仅利用阅读,也在debug时迅速查找。
最后再说一句,结对编程也是个不错的实践,我和我的猫咪都挺喜欢