OO编程基本功(3) 注释

OO编程基本功(3)  注释

1. 避免依赖注释来逃避重构

注释在code中可以使得代码更容易理解,可是相当多的情况下,它会使得程序员过于“依赖”注释而容许代码的自我说明程度降低。

需要注释?是否代码名称不够清晰,或者代码的抽象层次混乱,还是代码的动机不够明确导致需要注释来做额外说明?合格的代码本身一般是不需要额外注释的。

例如:

//newPasswordMUST at least 6 digits
User.Password= newPassword ;

可以重构为:

privateconst string PASSWORD_MIN_LENGTH = 6;
publicvoid ChangePassword(string newPassword){
Assert.IsTrue(newPassword.Length>= PASSWORD_MIN_LENGTH );
User.Password= newPassword;
}

再如:

//Employeeis eligible to retire
if(Employee.Age> 65 && Employee.Payed){
...
}

重构为:

if(Employee.EligibleToRetire){

}

privatebool EligibletoRetire{
get{
returnthis.Age > 65 && this.Payed;
}
}

什么时候使用注释

既然重构是使得code更加清晰的主要手段,那么什么时候使用注释?

1. 公司版权的说明

// Copyright (C) 2003,2004,2005 by XXX. All rightsreserved.

2. sample

var date = new Date("dd-MM-yyyy"); // sample: 10-11-2014

3.一些必要的注解说明

例如

if(...){
return 0 ;
}
return 1 ; // 1: eligible 2 :non-eligible

再如在单元测试中,测试性能

for(var i = 0;i < 1000/*并发一千个线程来模拟高并发情况*/; i++){

}

再如,还是多线程情况(提醒共享资源环境下,别忘了对多线程访问的考虑):

//do not forget take care of multi-thread scenarios
var resource = new ShareResource();

4.TODO

例如:

User.Login();
//TODO : finish order logic

不必要的注释

1. 以注释来逃避代码不完善的理由

try {
LoadFiles();
}
Catch(IOException exp){
//Do nothing
}

如果swallow这个异常,那么为什么要捕捉这个异常?更没有必要用一个注释来作为什么都不做的理由。

2. 啰嗦的注释

//1.Student Age > 6
//2.Region is valid
public void IsEligible(Student student){
...
}

注释完全没有必要把代码的实现逻辑写在函数头。可以用注释来引导自己去写代码的实现,但是实现之后建议及时清理掉以免代码逻辑修改后造成与代码不同步形成误导。毕竟,代码是唯一不会说谎的。(软件UI,文档,注释都会“说谎”)

3. 没必要为每个property , member都写一个说明

/**
* The Manager implementation with which this Containeris
* associated.
*/
protected Manager manager = null;

/**
* The cluster with which this Container is associated.
*/
protected Cluster cluster = null;

/**
* The human-readable name of this Container.
*/
protected String name = null;

显然,如果为每个字段,属性,方法都写注释,看上去很统一,却严重影响了代码的可读性。代码本身应该具备自我解释的能力,如果发现需要注释来弥补,则应考虑重构。

4. 不必要的日志注释

例如:

* Changes (from 11-Oct-2001)
* --------------------------* 11-Oct-2001 :Re-organised the class and moved it to new package
* com.jrefinery.date (DG);
* 05-Nov-2001 : Added a getDescription() method, andeliminated NotableDate
* class (DG);
* 12-Nov-2001 : IBD requires setDescription() method,now that NotableDate
* class is gone (DG); Changed getPreviousDayOfWeek(),
* getFollowingDayOfWeek() and getNearestDayOfWeek() tocorrect
* bugs (DG);
* 05-Dec-2001 : Fixed bug in SpreadsheetDate class(DG);
* 29-May-2002 : Moved the month constants into aseparate interface
* (MonthConstants) (DG);
* 27-Aug-2002 : Fixed bug in addMonths() method,thanks to N???levka Petr (DG);
* 03-Oct-2002 : Fixed errors reported by Checkstyle(DG);
* 13-Mar-2003 : Implemented Serializable (DG);
* 29-May-2003 : Fixed bug in addMonths method (DG);
* 04-Sep-2003 : Implemented Comparable. Updated theisInRange javadocs (DG);
* 05-Jan-2005 : Fixed bug in addYears() method(1096282) (DG);

这种注释看上去好像很整齐,当前好多公司都在follow,其实完全没有必要,因为source control已经为我们做了同样的事情,这种注释只会降低代码的可读性,长时间以后提供的信息也完全没有人会去看。

5. 噪音注释需要屏蔽

/**
* Default constructor.
*/
protected Student() {
}

谁不知道这是默认构造函数呢?

再如:

/**
* Returns the day of the month.
*
* @return the day of the month.
*/
public int getDayOfMonth() {
return dayOfMonth;
}

这样的注释如果是一种规范,那么完全没有必要和意义。

6. 避免署名注释

//added by Richard

和日志注释一样没有必要,source control 工具已经为我们做了同样的事情。

7. 避免“暂时注释掉”的代码

InputStreamResponse response = newInputStreamResponse();
response.setBody(formatter.getResultStream(),formatter.getByteCount());
// InputStream resultsStream =formatter.getResultStream();
// StreamReader reader = newStreamReader(resultsStream);
//response.setContent(reader.read(formatter.getByteCount()));

往往由于“不舍得”删而暂时放在那里,以后可能会用到?果断拿掉吧,sourcecontrol 会帮你存好的,为了其它coder阅读起来舒服,避免造成误导。

OO编程基本功(3) 注释

时间: 2024-08-02 13:33:31

OO编程基本功(3) 注释的相关文章

OO 编程基本功--(1)

OO编程的基本功 (1) 本系列将浅谈一些OO编程语言的基本功. 编程的基本功决定了代码质量,编程思路以及编程水平,在工作中是重中之重.本文作为开篇,介绍一下OO编程中的基础与重点--保证抽象的一致性. Code 什么是Code?把需求转为软件环境下可正确执行的软件的过程,称为编程.而实现这个编程的具体化流程,就叫做写code.在OO的编程世界里,写code既像写story,又像写一篇从抽象到具体的文章. 为了说明本文的主旨-保证抽象的一致性,我们就以code与Story和Code与写文章的对比

OO编程基本功(2)--命名

OO编程基本功(2)--命名 1. 使用词组作为函数名称,名词作为类名称,描述性的词作为变量名 如果business使用了domain model,类名称通常为model的名称,就是我们domain model里面直接map过来的名称: Customer Student Account 注意,如果出现了XxManager , XXExecutor , XXProcessor 之类的名称,那么要考虑修改design了,因为很可能已经follow过程式的编程思维. 方法名示例 在business 层

编程基本功(4)

编程基本功 (4) 数据结构与对象 数据结构 在OO世界里,数据结构往往意味着没有不论什么能力的纯实体.这样的情况是非常少见的(由于意味着纯粹数据结构的集成). 样例: public struct Point { public double X {get; set;} public double Y {get; set;} private double x; private double y; } 1. 我们能够用它来存一个点,这个点能够是不论什么形状的一部分 2. 它不具备不论什么能力,仅仅是

脚本编程基本功

脚本编程基本功 一.脚本基础 1.格式要求:首行shebang机制:#!/bin/bash 2.#注释(日期.联系方式.作者.目的.文件名) 3.检测脚本中的语法错误 bash -n /path/to/some_script 4.调试执行 bash -x /path/to/some_script 二.变量 1.Shell中变量命名法则:不能使程序中的保留字:例如if, f等:只能使用数字.字母及下划线,且不能以数字开头:见名知义 :统一命名规则:驼峰命名法,大驼峰和小驼峰. 2.Shell中命名

编程基本功训练:流程图画法及练习

对于"程序设计"的工作,很多刚開始学习的人的理解就是"写代码".相同,新手们苦恼的问题是,他们仅仅会"写代码".当接到一个新的任务,不少人总是在第一时间就爬到键盘上去敲代码.敲着敲着,就把自己绕糊涂了.头晕脑胀地坚持下来,程序能执行,阿弥托佛,赶紧撤.这样做出的程序,并不可靠. 在程序设计中,最重要的不是敲代码,而是设计.就像建筑.机械等行业的要画设计图.施工图,程序设计的思路也有必要用图的形式画出来.绘图的过程就是思考的过程,因为其直观性,绘图

编程基本功训练:流程图画法及练?

对于"程序设计"的工作,很多刚開始学习的人的理解就是"写代码".相同,新手们苦恼的问题是,他们仅仅会"写代码".当接到一个新的任务,不少人总是在第一时间就爬到键盘上去敲代码.敲着敲着,就把自己绕糊涂了.头晕脑胀地坚持下来,程序能执行,阿弥托佛,赶紧撤.这样做出的程序,并不可靠. 在程序设计中,最重要的不是敲代码,而是设计.就像建筑.机械等行业的要画设计图.施工图,程序设计的思路也有必要用图的形式画出来.绘图的过程就是思考的过程,因为其直观性,绘图

各种语言编程中的注释总结

JAVA: 单行注释 // 多行注释 /*..........*/ 多行注释快捷键:Ctrl+/ 或者 Ctrl+Shift+C 或者 Ctrl+Shift+/ HTML: <!-- 注释内容 --> JSP中的HTML注释: <!-- 注释内容 --> JSP页面中的普通注释 <% // 注释内容 %>    <% /* 注释内容 */ %> .....

阿里巴巴Java 开发手册编程规约之注释规约

1. [强制]类.类属性.类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用//xxx 方式.说明: 在 IDE 编辑窗口中, Javadoc 方式会提示相关注释,生成 Javadoc 可以正确输出相应注释: 在 IDE 中,工程调用方法时,不进入方法即可悬浮提示方法.参数.返回值的意义,提高阅读效率. 2. [强制]所有的抽象方法(包括接口中的方法) 必须要用 Javadoc 注释.除了返回值.参数.异常说明外,还必须指出该方法做什么事情,实现什么功能.说明: 对子类

C语言编程规范--------2 注释

2.1 注释的原则 注释的目的是解释代码的目的.功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息. 示例:如下注释意义不大. /* if receive_flag is TRUE */ if (receive_flag) 而如下的注释则给出了额外有用的信息. /* if mtp receive a message from links */ if (receive_flag) 2.2 说明性文件头部应进行注释 说明性文件(如头文件.h 文件..inc 文件..de