代码才是最好的注释

简介:

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

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

复制代码
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,如需转载请自行联系原作者


相关文章
|
8月前
DTL注释
DTL注释。
46 1
|
2月前
|
Python
注释
注释。
38 5
|
3月前
|
Java 编译器 C语言
2.2 注释
在编程中,/*与*/间的部分为注释,帮助他人理解程序。C语言支持多行及同行为代码添加注释,如/*这是C注释*/。C99引入了类似C++和Java的//注释方式,仅限单行://这是单行注释。甚至 int range;//此处也可注释。但需注意避免注释缺失结束标记导致的错误。
27 3
|
5月前
|
Java 测试技术 数据库连接
@Before 和 @BeforeClass 注释的区别
【8月更文挑战第22天】
360 0
|
8月前
|
算法 编译器 C++
C++注释
C++注释
67 2
|
8月前
|
存储 弹性计算 运维
使用注释
【4月更文挑战第29天】
40 2
|
8月前
|
编译器 C++
C++ 注释
C++ 注释
48 0
|
8月前
|
XML 程序员 编译器
C#注释
C#注释
83 0
|
编译器 C++
C++ 注释
【摘要】 C++ 注释程序的注释是解释性语句,您可以在 C++ 代码中包含注释,这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。C++ 注释一般有两种:// - 一般用于单行注释。/* ... */ - 一般用于多行注释。注释以 // 开始,直到行末为止。例如:实例#include <iostream>using n...
|
程序员
笑出腹肌的注释,就怕你不敢用!
笑出腹肌的注释,就怕你不敢用!
111 0
笑出腹肌的注释,就怕你不敢用!