本文是读完前言中提到的几本书后,结合自身的想法总结出来的如何写好注释的一些比较实用的方法。

另外本文是上一篇 注释篇 的一个补充

  • 如何写好注释

  • 避免使用不明确的代词

有些情况下,"it", "this"等代词指代很容易产生歧义,最安全的方式是不要使用将所有可能产生歧义的代词替换成实际指代的词。

如://Insert the data into the cache,but check if it's too big first.

"it"是指"data"还是"cache"? 在读完剩下的代码前谁也不知道指代的是谁。那还要注释做什么?替换成要指代的词后读者就可以直接了当的知道接下来的代码要做什么了。

//Insert the data into the cache,but check if the data is too big first.

  • 精确描述方法的行为

注释一定要精确的描述方法的行为。避免由于注释不准确而造成的误调用。

如你写了一个方法统计文件中的行数

//Return the number of lines in this file

public long CountLinesInFile(string fileName)

上面的注释不是很精确,因为有很多定义行的方式,下面几种情况这个方法的返回值无法根据注释快速的判断出来。

  1. ""(空文件)——0或1行?
  2. "hello"——0或1行?
  3. "hello\n"——1或2行?
  4. "hello\n\r world\r"——2、3或4行?

假设该方法的实现是统计换行符的(\n)的个数,下面的注释就要比原来的注释更好些。

//Count how many newline symbols('\n') are this file

这条注释包含更多的信息。读者可以知道如果没有换行符,这个函数会返回0。读者还知道回车符(\r)会被忽略。

  • 用输入输出例子来说明特殊的情况

对于注释来讲,一个精挑细选的例子比千言万语还要有效,而且更加直白有效,阅读速度更快。

如: /// <summary>

/// Remove the suffix/prefix of charsToRemove from the input source

/// </summary>

public string StripPrefixAndSuffix(string source, string charsToRemove)

这条注释不是很精确,因为它不能回答下面的问题

  1. 是只有按charsToRemove中顺序的字符才会被移除,还是无序的charsToRemove也会被移除?
  2. 如果在开头和结尾有多个charsToRemove会怎样?

而一个好例子就可以简单直白的回答这些问题:

/// <summary>

/// Example: StripPrefixAndSuffix("abbayabbazbaba","ab") returns "yababz"

/// </summary>

  • 适当的使用具名函数

假设你看见这样的函数调用:

ConnectMailServer(100,false);

因为直接传入的是数值和bool值,使得这个调用很难理解,在这种情况下可以使用C#的具名函数以便代码阅读者快速知道这两个参数的含意。

假设函数是这样的:public void ConnectMailServer(int timeout_s, bool useEncryption)

那我们可以这样使用具名函数:

ConnectMailServer(timeout_s: 100, useEncryption: false);

代码阅读者一眼就能看出这两个参数的作用。

  • 使用通用专有名词

代码的阅读者和调用者都是程序员,程序员间有大量的专有名词可以用来描述一些模式和解决方案,使用这些词,可以简单明了的阐述你代码的含意。

假设你原来的注释是这样的:

那么你完全可以简单的说:

//This class acts as a caching layer to the database.

程序员一看caching layer就明白这个类是做什么的了。而且就算新手不明白,你的注释也很难给他讲明白的,还不如给他个关键词,让他自己去Google或向别人请教。这样的效果比你的注释会好的多。

  • 更新代码时记得更新注释

再好的注释也会随着内容的更改而变得越来越没有意义,有时候甚至会对读者造成误导,产生不必要的bug。所以在更改代码后,记得要更新所更改代码的注释,使其表达最新代码的含意。

  • 只有能让别人读懂的注释才是合格的注释

当自己不确定自己的注释是否合格时,请周围的同事读下你的注释,看他读完注释后说出的想法是否是你想要表达的,是否有信息遗漏和误解等。

自己总结的C#编码规范--5.如何写好注释篇的更多相关文章

  1. 官方Java编码规范

    先由Sun制定,之后Sun把Java卖给了Oracle,最后就成了Oracle制定的了.但是版本比较旧了,停留在1999年. 相比Google的编码规范,罪名写的却别就是Sun采用的是4个空格进行缩进 ...

  2. Android的编码规范

    一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Butt ...

  3. PHP 高级编程(1/5) - 编码规范及文档编写

    PHP 高级程序设计学习笔记20140612 软件开发中的一个重要环节就是文档编写.他可以帮助未来的程序维护人员和使用者理解你在开发时的思路.也便于日后重新查看代码时不至于无从下手.文档还有一个重要的 ...

  4. 【原】JAVA SE编码规范

    /* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...

  5. 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...

  6. PHP编码规范PSR-2

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  7. Objective-C开发编码规范【转载】

    概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序.关于Objective-C的编码规范,苹果和谷歌都已经有很好的总结: Apple Coding Guide ...

  8. 前端编码规范之CSS

    "字是门面书是屋",我们不会去手写代码,但是敲出来的代码要好看.有条理,这还必须得有一点约束~ 团队开发中,每个人的编码风格都不尽相同,有时候可能存在很大的差异,为了便于压缩组件对 ...

  9. 前端编码规范之JavaScript

    上次浅谈了下关于CSS的编码规范,大部分童鞋持赞同意见,仍存在一些童鞋不太理解这些规范的意义. 如果是个人或者小作坊开发,其实这些所谓的编码规范也没啥意思,因为大家写好的代码直接就给扔到网上去了,很少 ...

随机推荐

  1. jQuery File Upload的使用

    jQuery File Upload 是一个Jquery文件上传组件,支持多文件上传.取消.删除,上传前缩略图预览.列表显示图片大小,支持上传进度条显示等,以下就介绍一下该插件的简单使用 1.需要加载 ...

  2. 性能测试四十六:Linux 从网卡模拟延时和丢包的实现

    Linux 中模拟延时和丢包的实现 使用ifconfig命令查看网卡 Linux 中使用 tc 进行流量管理.具体命令的使用参考 tc 的 man 手册,这里简单记录一下使用 tc 模拟延时和丢包的命 ...

  3. 如何获取jar包的在执行机上面的路径

    背景: 最近在项目中遇到一个小问题, 几行代码就能解决了 String path = this.getClass().getProtectionDomain().getCodeSource().get ...

  4. linux下配置docker和splash(图文)

    所需要环境:ubuntu16.04 第一步用:sudo apt install docker.io 第二步:完成后查看一下有没有成功 命令:docker -v,如果是输入错了写成了大V他会提示你有哪些 ...

  5. XML使用与总结

    xml是一种比较方便的数据储存方式,它适用于小数据的存储.最常见的适用地方莫过于各种web.config与app.config了.   一.创建一个简单的xml路径 public static str ...

  6. 什么是redis的雪崩和穿透

    缓存雪崩 如何应对缓存雪崩 首先要保证redis的高可用,可以使用redis cluster,开启redis持久化,redis之前要使用本地缓存,请求先走本地缓存,没找到再走redis 如果还是出现了 ...

  7. 【Oracle】Linux7安装11g 86%报错:Error in invoking target 'agent nmhs' of makefile

    http://blog.itpub.net/29475508/viewspace-2120836/

  8. CentOS6.9安装Kafka

    先设置jdk1.8 vi /etc/profile export JAVA_HOME=/usr/local/jdkexport JRE_HOME=/usr/local/jdk/jreexport CL ...

  9. [转] 那些在使用webpack时踩过的坑

    用webpack的过程,就是一个不断入坑和出坑的过程.回望来时路,一路都是坑啊!现把曾经趟过的那些坑整理出来,各位看官有福了~ 文章末尾有我用到的依赖的版本信息,若你发现某个问题与我在本文中的描述不一 ...

  10. MVC5干货篇,目录和路由

    MVC目录结构概述 文件夹或文件 描述 备注 /App_Data 此文件夹用于存放私有数据,如XML,或者SQL Server Express\SQLite的数据库文件,或其他基于文件的存储库 IIS ...