术语和定义
- 规则
编程时必须遵守的约定。 - 原则
编程时指导性的约定。
代码布局
- 当代码行或表达式超出或即将超出单屏显示时,需要换行。
- 缩进应该是每行一个Tab(4个空格)
- 接口和类定义之间、枚举和类定义之间、类和类定义之间至少空一行。
- 以下情况使用一个空行:1.方法与方法;2.方法中不同的逻辑块之间、方法与字段之间。
- 以下情况使用一个空格:1.关键字和左括号;2.多个参数用逗号隔开,每个逗号后都应加一个空格;3.所有的二元操作符都应用空格与他们的操作数隔开。一元操作符、++及--与操作数间不需要空格。4.语句中的表达式之间用空格隔开。
- 方法名和左括号间没有空格
*1.左花括号"{"放于关键字或方法名的下一行并与之对其,左花括号"{"要与相应的右花括号"}"对齐。2.通常情况下左花括号"{"单独成行,不与任何语句并列一行。3.if、while、do语句后一定要使用{},即使{}号中为空或只有一条语句。
命名规范
在命名规范中强调对称性和2/8原则,变量、常量、枚举、函数和语句在成对出现时请注意对称性。互补的命名方式更容易让人理解和联想。20%的代码相对于剩下80%的代码显得更加重要。例如对外API的命名比私有函数的命名更加值得关注;作用域小的变量命名相对于全局变量的命名可以更加自由。
- 在变量名中使用互补对,用正确的反义词或词组命名具有互斥意义的变量。
- 对于缩写有两个字母组成的标识符,所有字母大写,仅在开发人员一般都能理解时使用缩写。
- 使用复数形式命名集合属性,以肯定短语来命名布尔属性。
- 对于事件命名用动词或动词短语。使用动名词(动词的"ing"形式)创建表示事件前概念的事件名称,用过去式表示事件后的概念。不要使用"Before"或者"After"前缀或后缀来表示事件的先后。
- 命名空间使用公司或项目名称,后跟技术名称和可选的功能与设计。
- 特性命名应该总是将后缀Attribute添加到自定义特性类
- 不要为委托增加"Delegate"后缀,对事件处理程序名称使用EventHandler后缀。
注释
- 注释使用中文
- 通过对方法、变量、结构等正确的命名以及合理的组织代码结构,使代码成为自注释的。
- 提倡大段的功能性的注释,只要把实现的主要思想和流程写清楚就可以,没有必要每一句都加上注释。
- 代码和注释要同步维护,不再有用的即时删除,特别是错误的注释一定要删除。
- 注释应与其描述的代码相近,对代码的注释可放在其上方位置,需与其上面的代码用空行隔开;也可与代码同行,但不可放在代码下方。
- 一般情况下,代码中有效注释量不少于代码量的20%,最低不得少于代码量的10%。
- 注释与所描述内容进行同样的缩进。
- 对于供外部使用的API按照.NET指定的"///"注释格式对.NET代码进行注释。
- 文件头部必须进行注释。
可测性
在编写代码之前,应预设设计好程序与测试的方法和手段,并设计好各种调测开关及相应测试代码(如打印函数等)。
签入主干的代码不能存在临时的调试代码以及大段被注释掉的代码
开发人员对自己编写以及修改的代码必须做到单步调试,调试的要求是需要做到路径覆盖,并跟踪每一条语句。s
断言和错误处理
-
整个软件系统采用统一的断言,使用断言捕捉不应该发生的非法情况。
断言是用来处理不应该应该的错误情况的,通常用于捕获程序内部不可能发生的错误,而外部可能会产生的错误通常用异常处理方式,不能用断言来实现。
private StartAdjState ToStart()
{
...
if(isStarting)
{
Debug.Assert(false);
return StartAdjState.InvalidServoType;
}
}
private StartAdjState ToStart()
{
...
if(isStarting)
{
Trace.WriteLine("伺服为启动状态", "Warning");
return StartAdjState.InvalidServoType;
}
}
【特别说明】
上面给出了断言和错误处理的原则,但是并不是每一个地方我们都需要进行相关断言处理,否则断言和异常处理太多,一是会影响代码的可读性,同时也会增加很多不必要的预防成本。我们可以把某些接口选定为安全区域的边界(模块或是dll提供的外部接口),对穿越安全区域边界的数据进行合法性校验,并当数据异常时做出错处理。模块外部传入的数据,我们必须对输入数据的合法性进行检测,一旦数据通过了合法性检测,进入模块内部,我们可以假定数据是正确的,此时不需要重复去做一些数据合法性检测。同理,对于一个模块输出给外部模块使用的数据,必须对输出数据的合法性进行检测,但是如果这个输出数据只在内部使用,我们可以只做一些非常有必要的检测。
在类的层次我们也可以采用这个方法,类的公用方法假定数据是不安全的,他们负责检查数据并进行处理,一旦公用方案
接收了数据,那么类的私有方法就可以假定数据是安全的。