代码才是最好的注释

简介:

 一直以来都存在代码注释的作用的讨论。很多人认为注释是不必要的,写注释那是因为代码可读性太差了。我也同意这个原则。如果必须添加注释,我觉得可以添加一些解释代码为什么,而不是做什么的注释。下面我举个例子说明该如何除去代码中的注释。

    我们直接看代码,下面的代码是我要对注释进行清除的例子。(这段代码只是作为一个例子,没有做过多的考虑。)

复制代码
1  public  String recommendGift( double  budget){ 
2  //  get gifts from helper 
3  String[] gifts  =  giftHelper.getGifts(); 
4  String gift  = null
5 
 6  for  ( int  i  = 0 ; i  & lt; gifts.length; i ++ ) { 
7 
 8  gift  =  gifts[i]; 
9 
10  //  find out if gift already given 
11  boolean isAlreadyGiven  = false
12  for  (String given : giftsGiven) { 
13  if (gift.equals(given)){ 
14  isAlreadyGiven  = true
15  break
16 
17 
18 
19  //  calculate rating and budget 
20  int  x  =  rating  * 200
21  boolean ok  =  budget  & lt; x; 
22 
23  //  if both conditions satisfy, give it. 
24  if ( ! isAlreadyGiven  & amp; & amp; ok){ 
25  giftsGiven.add(gift); 
26  //  increment maintenance cost of the girlfriend 
27  maintenanceCost  +=  budget; 
28  return  gift; 
29 
30 
31 
32  return  gift; 
33  }
复制代码

这段代码是相当简单的。从礼物清单中挑选出不在已赠送的礼物列表中的而且不超过预算的第一份礼物。这段代码有如下几个问题:

1、方法过长

2、这个方法做的事情太多

3、可读性差,即使加了注释

4、注释告诉我们代码是干什么的,这些应该是代码自己的事情才对。

让我们开始整理一下这段代码。

首先,看下面代码段,非常明显,这些代码注释是不必要的。这种代码注释我们应该避免。它并没有提高代码的可读性,事实上起到了相反的效果。

//  get gifts from helper 
String[] gifts  =  giftHelper.getGifts();

接着,我将下面带注释的代码移动到一个分离的方法中。方法的命名可以来自给出的注释。

复制代码
//  find out if gift already given 
boolean isAlreadyGiven  = false
for  (String given  in  giftsGiven) { 
if (gift.equals(given)){ 
isAlreadyGiven 
= true
break

}
复制代码

修改后的代码:

复制代码
private  boolean isGiftNotAlreadyGiven(String gift) {
boolean isAlreadyGiven 
= true ;
for  (String given  in  giftsGiven) {
if (gift.equals(given)){
isAlreadyGiven 
= false ;
break ;
}
}
return  isAlreadyGiven;
}
复制代码

然后按照相同的方式继续下去,最终的代码如下:

复制代码
public  String recommendGift( double  budget)
{
String recommendedGift 
= null ;
for  (String gift  in  giftHelper.getGifts()) 
{
recommendedGift 
=  gift;
if (isGiftNotAlreadyGiven(recommendedGift) && isUnderBudget(budget))
{
updateMaintenanceCostAndGiftsGiven(budget, recommendedGift);
return  recommendedGift;
}
}
return  recommendedGift;
}

private void  updateMaintenanceCostAndGiftsGiven( double  budget, String gift)
{
giftsGiven.add(gift);
maintenanceCost  +=  budget;
}

private  boolean isUnderBudget( double  budget)
{
int  x  =  rating  * 200 ;
boolean ok 
=  budget  <  x;
return  ok;
}

private  boolean isGiftNotAlreadyGiven(String gift) 
{
boolean isAlreadyGiven 
= true ;
for  (String given  in  giftsGiven) {
if (gift.Equals(given)){
isAlreadyGiven 
= false ;
break ;
}
}
return  isAlreadyGiven;
}
复制代码

这里有几件需要注意的事情:

1、一个大方法按照它的功能被分割成几个小方法,这样代码就比较容易阅读了。

2、每个方法大概4到5行,非常理想!

3、注释去掉了,但是目的却达到了。用代码来代替了注释。

译自:Better way to comment.. code it.

译者说明:

1、文章的那段代码很有特色,正在恋爱的男程可以试一下代码里面的方法。

2、确实用代码来代替了注释。

3、从文章可以看到这段代码的演变主要是将注释变成了函数名和变量名。

4、对于老外来说,英文和代码类似,所以这样做就非常受用,通过看函数名,变量名就能明白函数的功能,Clean Code书中也是这样建议的。

5、对我们来说第一语言是中文的,英语不好情况就不一样了,这就是为什么国人的建议大多要求注释详尽,让代码更易读易懂;而老外的建议几乎是尽可能的少。

6、我建议符合我们的国情:尽可能多的注释。





本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/10/30/1864882.html,如需转载请自行联系原作者


相关文章
|
1月前
DTL注释
DTL注释。
8 1
|
1月前
|
编译器 C++
C++ 注释
C++ 注释
12 0
|
1月前
|
XML 程序员 编译器
C#注释
C#注释
19 0
|
1月前
|
C++
C++注释
C++注释
8 0
|
11月前
|
编译器 C++
C++ 注释
【摘要】 C++ 注释程序的注释是解释性语句,您可以在 C++ 代码中包含注释,这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。C++ 注释一般有两种:// - 一般用于单行注释。/* ... */ - 一般用于多行注释。注释以 // 开始,直到行末为止。例如:实例#include <iostream>using n...
|
JavaScript 前端开发 IDE
写好你的注释之 JSDoc
好的代码,注释肯定不能少,就目前而言基于 vue 的项目大部分都是使用的 vue2,vue2 相对于 ts 的支持没有那么完善,大部分包括我目前工作所在的团队,使用的 vue 版本都是采用 vue2
注释
注释
66 0
|
程序员
笑出腹肌的注释,就怕你不敢用!
笑出腹肌的注释,就怕你不敢用!
笑出腹肌的注释,就怕你不敢用!
|
程序员
10 个雷人的注释,就怕你不敢用!
本文来源网络: 1、码农何苦为难穷逼 2、删了就无法运行,我也不知道为什么
10 个雷人的注释,就怕你不敢用!
|
数据库 Go 数据挖掘
基因功能注释
基因功能的注释依赖于上一步的基因结构预测,根据预测结果从基因组上提取翻译后的 蛋白序列 和主流的数据库进行比对,完成功能注释。常用数据库一共有以几种: Nr:NCBI官方非冗余蛋白数据库,包括PDB, Swiss-Prot, PIR, PRF; 如果要用DNA序列,就是nt库 Pfam: 蛋白结构域注释的分类系统 Swiss-Prot: 高质量的蛋白数据库,蛋白序列得到实验的验证 KEGG: 代谢通路注释数据库. GO: 基因本体论注释数据库 除了以上几个比较通用的数据库外,其实还有很多小众数据库,应该根据课题研究和背景进行选择。
2329 0