自己总结的C#编码规范--4.注释篇

  • 注释

注释毫无疑问是让别人以最快速度了解你代码的最快途径,但写注释的目的绝不仅仅是"解释代码做了什么",更重要的尽量帮助代码阅读者对代码了解的和作者一样多。

当你写代码时,你脑海里会有很多有价值的信息,但当其他人读你代码时,这些信息已经丢失,他们所见到的只是眼前代码。

  • 注释约定

如果IDE提供注释格式,则尽量使用IDE提供的格式,否则使用"//"来注释。类、属性和方法的注释在Visual Studio中都使用输入"///"自动生成的格式。

  • 类注释约定

/// <summary>

/// 类说明

/// </summary>

public class BinaryTree

  • 类属性注释约定

/// <summary>

/// 属性说明

/// </summary>

; }

  • 方法注释约定

/// <summary>

/// 方法说明

/// </summary>

/// <param name="parentNode">参数说明</param>

/// <returns>返回值说明</returns>

parentNode)

  • 代码间注释约定

  1. 单行注释,注释行数<3行时使用

    //单行注释

  2. 多行注释,2<注释行数<=10时使用

    /*多行注释1

    多行注释2

    多行注释3*/

  3. 注释块,10<注释行数时使用,用50个*

    /***************************************************

    * 代码块注释1

    *    代码块注释2

    *    ......

    *    代码块注释10

    *    代码块注释11

    ***************************************************/

  • 何时写注释的约定

  1. 以下三种情况我们需要在所有的类、类属性和方法都必须按照上述格式编写注释

    1. 客户方对代码注释重视程度较高
    2. 我们需要提供代码注释自动生成的API文档。

    1. 目前编写的是公共核心模块
  2. 如果客户方没有对注释特殊要求,那么按照下文中讨论的只在需要的地方加注释。不要加无谓的注释。
  • 常用注释标识的约定

这里约定下以后团队常用几种注释标识及含义:

//TODO: 我还没有处理的事情

//FIXME: 已知的问题

//HACK: 对一个问题不得不采用比较粗糙的解决方案

//XXX: 危险!这里有重要的问题

请团队成员自行在Visual Studio中配置FIXME和XXX为高优先级的Comments.

Steps: Tools->Options->Environment->Task List->Tokens->Add->OK

配置完成后,我们就能在Task List(Ctrl+w,t)窗口中的Comments选项中看到代码中存在的任务了。

  • 关于何时使用“///”和“//”的约定

a. 对于需要让调用者知道的信息,使用“///”注释,以便让调用者能在调用时看到。

b. 对于代码内部实现细节,需要维护者知道的注释,使用“//”。减少调用者阅读时间。

  • 不需要的注释

阅读注释会占用阅读真实代码的时间,并且每条注释都会占用屏幕上的空间。所以我们约定所加的注释必须是有意义的注释,否则不要浪费时间和空间。

区别要不要写注释的核心思想就是:不要为那些能快速从代码本身就推断的事实写注释。

  • 不要为了注释而注释

有些人可能以前的公司对于注释要求很高,如"何时写注释"章节中的要求。所以很多人为了写注释而注释。

再没有特殊要求的情况下我们要禁止写下面这种没有意义的注释。

/// <summary>

/// The class definition for Account

/// </summary>

public class BinaryTree

{

/// <summary>

/// Total counts of the nodes

/// </summary>

public int NodesCount { get; private set; }

/// <summary>

/// All the nodes in the tree

/// </summary>

public List<BinaryNode> Nodes { get; set; }

/// <summary>

/// Insert a node to the tree

/// </summary>

/// <param name="node">the node you want insert into the tree</param>

node)

  • 不要用注释来粉饰糟糕的代码

写注释常见的动机之一就是试图来使糟糕的代码能让别人看懂。对于这种"拐杖式注释",我们不需要,我们要做的是把代码改的能够更具有"自我说明性"。

记住:"好代码>坏代码+好注释"

如下面这段函数的注释

//Enforce limits on the reply as stated in the request

//such as the number of items returned, or total byte size,etc.

reply)

既然知道这个函数名会让人很难读懂,那么为什么不直接改好名字呢?这样所有调用这个函数的地方都能很快速知道这个函数的作用,不用再跟进来看函数的作用。

public void EnforceLimitsFromRequestOnReply(Request request,Reply reply)

  • 日志式注释

有人喜欢在每次编辑代码时,都在模块开始处加一条注释。这类注释就像是一种记录每次修改的日志。在很久以前这种记录对于维护还有意义。但是对于现在的源码控制来说,这些记录完全是冗余的,需要完全废除。

/***************************************************

* July-29-2014:Fix Bug-12345: Add new method to calculate nodes count

*    July-20-2014:Fix Bug-11111: Add Insert new node method

*    ......

*    July-20-2014:Task-00001: Create BinaryTree class

***************************************************/

  • 个人签名

//Added By XXXX

有人认为这种注释有助于不了解这段代码含意的人和他讨论。事实上确是这条注释放在那一年复一年,后来的代码和原作者写的源码越来越不一样,和XXXX也越来越没关系。

重申一下,TFS里都能看到这类信息,不要加在代码里。

  • 位置标识

//AddNodePlace1

//AddNodePlace2

有人喜欢在代码注释里加入位置标识以方便他查找代码的位置。

现在的IDE都集成了这些功能,如VS中可以使用Bookmark(Ctrl+b,t)。

不要将这类注释加到代码中。

  • 注释掉的代码

直接把代码注释掉是非常令人讨厌的做法。

其他人不敢删掉这些代码。他们会想代码依然在这一定是有原因的,而且这段代码很重要,不能删除。而且每个阅读代码的人都会去看一下这些被注释掉的代码中是否有他们需要注意的信息。

这些注释掉的代码会堆积在一起,散发着腐烂的恶臭。

  • 需要的注释

  • 记录你对代码有价值的见解

你应该在代码中加入你对代码这段代码有价值的见解注释。

如: //出乎意料的是,对于这些数据用二叉树比哈希表要快40%

//哈希运算的代价比左右比要大的多

这段注释会告诉读者一些重要的性能信息,防止他们做无谓的优化。

  • 为代码中的不足写注释

代码始终在演进,并且在代码中肯定会有不足。

要把这些不足记录下来以便后来人完善。

如当代码需要改进时:

//TODO:尝试优化算法

如当代码没有完成时:

//TODO:处理JPG以外的图片格式

你应该随时把代码将来该如何改动的想法用注释的方式记录下来。这种注释给读者带来对代码质量和当前状态的宝贵见解,甚至会给他们指出如何改进代码的方向。

  • 对意料之中的疑问添加注释

当别人读你的代码的时候,有些部分可能让他们有这样的疑问:"为什么要这样写?"你的工作就是要给这些部分加上注释。

如:

// 因为Connection的创建很耗费资源和时间,而且需要多线程访问,

// 所以使用多线程单例模式

public static Connection Instance

{

get

{

if(_instance==null)

{

lock (_lock)

{

if (_instance == null)

{

_instance = new Connection();

}

}

}

return _instance;

}

}

  • 公布可能的陷阱

当为一个函数或者类写注释时,可以这样的问自己:"这段代码有什么出人意料的地方吗?会不会被无用?"。基本上说就是你需要未雨绸缪,预料到别人使用你代码时可能遇到的问题。如:

//XXX: 因为调用外部邮件服务器发送邮件,所以耗时较长,请使用异步方法调用以防止UI卡死。

public void SendEmail(string to, string subject, string body)

  • 对于代码块总结性地注释

对于代码块的总结性注释可以使读者在深入细节之前就能得到该代码块的主旨,甚至有时候都可以直接跳过该代码块,从而可以快速准确的把握代码。

如读者看到://下面代码使用了二分查找算法来快速的根据用户Id找到相应用户

那么他就可以快速理解下面代码的逻辑,否则自己看二分查找还是要用些时间的。

时间: 2024-10-27 09:16:12

自己总结的C#编码规范--4.注释篇的相关文章

自己总结的C#编码规范--4.注释约定

注释 注释毫无疑问是让别人以最快速度了解你代码的最快途径,但写注释的目的绝不仅仅是"解释代码做了什么",更重要的尽量帮助代码阅读者对代码了解的和作者一样多. 当你写代码时,你脑海里会有很多有价值的信息,但当其他人读你代码时,这些信息已经丢失,他们所见到的只是眼前代码. 注释约定 如果IDE提供注释格式,则尽量使用IDE提供的格式,否则使用"//"来注释.类.属性和方法的注释在Visual Studio中都使用输入"///"自动生成的格式. 类注释

《从零开始学Swift》学习笔记(Day 57)——Swift编码规范之注释规范:

<从零开始学Swift>学习笔记(Day 57)--Swift编码规范之注释规范:文件注释.文档注释.代码注释.使用地标注释 原创文章,欢迎转载.转载请注明:关东升的博客 前面说到Swift注释的语法有两种:单行注释(//)和多行注释(/*...*/).这里来介绍一下他们的使用规范. 文件注释 文件注释就在每一个文件开头添加注释,文件注释通常包括如下信息:版权信息.文件名.所在模块.作者信息.历史版本信息.文件内容和作用等. 下面看一个文件注释的示例: /* Copyright (C) 201

自己总结的C#编码规范--1.命名约定篇

最近在为公司编写c#编码规范,以前对这方面研究不多,只是觉得代码能够出自己的意思就可以了. 我参考了以下资料 C# Coding Conventions NET设计规范约定惯用法与模式(第2版) 编写可读性代码的艺术 重构—改善既有代码的设计 高效程序员的45个习惯 代码整洁之道 发现其实真要写好一个代码规范是一件非常难的事情,这取决于规范制定者的经验,团队成员的水平,业务的具体需求,项目的复杂度,项目的进度,企业的文化氛围等等. 而且每次提笔要写的时候,总是有很多很多的想法想写进去,可是作为一

自己总结的C#编码规范--6.格式篇

格式 格式的统一使用可以使代码清晰.美观.方便阅读.为了不影响编码效率,在此只作如下规定: 长度 一个文件最好不要超过500行(除IDE自动生成的类). 一个文件必须只有一个命名空间,严禁将多个命名空间放在一个文件里. 一个文件最好只有一个类. 如果超过500行,考虑拆分类或者使用Partial 类将类按照功能拆分. 一个方法的代码最好不要超过50行,如果超过考虑将里面的逻辑封装成函数. 空格.空行 空行的使用以使代码清晰为为基本原则.空行影响程序的运行,但可以使代码看起来清晰,增加可读性,因此

浅谈编码习惯之注释篇

软件编码过程中,当注释代码时,要考虑到不仅将来维护你代码的开发人员要看,而且你自己也可能要看.用Phil Haack大师的话来说就是:"一旦一行代码显示屏幕上,你也就成了这段代码的维护者".因此,对于我们写得好(差)的注释而言,我们将是第一个受益者(受害者).以下是我个人的简单看法和平常的习惯. 1.模块注释 在一个程序模块的开始,应用注释说明模块的名字.功能.开发者和日期和版本变更历史,如下所示: /******************************************

iOS 注释的5要3不要和编码规范的26个方面

注释 代码注释,可以说是比代码本身更重要.这里有一些方法可以确保你写在代码中的注释是友好的: 不要重复阅读者已经知道的内容 能明确说明代码是做什么的注释对我们是没有帮助的. // If the color is red, turn it green if (color.is_red()) { color.turn_green(); }   要注释说明推理和历史 如果代码中的业务逻辑以后可能需要更新或更改,那就应该留下注释:) /* The API currently returns an arr

自己总结的C#编码规范--5.如何写好注释篇

本文是读完前言中提到的几本书后,结合自身的想法总结出来的如何写好注释的一些比较实用的方法: 如何写好注释 避免使用不明确的代词 有些情况下,"it", "this"等代词指代很容易产生歧义,最安全的方式是不要使用将所有可能产生歧义的代词替换成实际指代的词. 如://Insert the data into the cache,but check if it's too big first. "it"是指"data"还是&quo

IT兄弟连 Java语法教程 注释与编码规范

在程序代码中适当地添加注释可以提高程序的可读性和可维护性.好的编码规范可以使程序更易阅读和理解.下面将介绍Java中的集中代码注释以及应该注意的编码规范. 代码注释 通过在程序代码中添加注释可提高程序的可读性.注释中包含了程序的信息,可以帮助程序员更好的阅读和理解程序.在Java源程序文件的任意位置都可添加注释语句.注释中的文字Java编译器不进行编译,所有代码中的注释文字对程序不产生任何影响.Java语言提供了3种添加注释的方法,分别为单行注释.多行注释和文档注释. ●  单行注释 “//”为

java编码规范

右括号") "与其后面的关键字之间,关键字与其后面的左括号"("或"{"之间,以及"}"与"{"之间,要以一个空格隔开:除". "外,所有二元操作符的前.后要加空格:在逗号后边加一个空格. 说明: 一个紧跟着括号的关键词应该被空格分开: 空白应该位于参数列表中逗号的后面: 所有的二元运算符,除了".",应该使用空格将之与操作数分开.一元操作符和操作数之间不应该加空格,