本文档将代码编写标准按划分为两个等级:[必须遵守]、[建议遵守],以求在执行代码编写标准的过程中可以更加人性化的适应一些不会为项目带来风险的个人习惯。
1.大小写约定
大小写约定属于[必须遵守]的规则。
大小写样式
本文档中将出现两种大小写样式,这里先分别定义:
Pascal大小写 将标识符的首字母和后面连接的每个单词的首字母都大写。可以对三字符或更多字符的标识符使用 Pascal 大小写。例如:BackColor
Camel大小写 标识符的首字母小写,而每个后面连接的单词的首字母都大写。例如:backColor
标识符大小写规则
下表中列出常见的代码元素的样式规范和示例:
标识符 | 样式 | 示例 |
类 | Pascal | MyClass |
枚举类型 | Pascal | ErrorLevel |
枚举值 | Pascal | FatalError |
事件 | Pascal | ValueChanged |
异常类 | Pascal | WebException |
只读的静态字段 | Pascal | RedValue |
接口 | Pascal | ISomthing |
方法 | Pascal | DoSomting |
参数 | Camel | typeName |
属性 | Pascal | BackColor |
常量 | 大写 | REGEX_PARSE_URL |
在本规范中,复合词和缩写词被视为一个单词整体。
例:单词 identifier 的 [单缩写词] id,在函数名中应写为 Id。
例:Hash Table 的 [复合词] hashtable,在类名中应写为 Hashtable。
2.通用命名约定
通用命名约定讨论的是如何为代码元素选择最适合的名称,属于[必须遵守]的规则。
名称的选择
1.请选择易读的标识符名称
例如,英文属性名称 HorizontalAlignment 比 AlignmentHorizontal 更具可读性。
2.可读性比简洁性更重要
例如,属性名称 CanScrollHorizontally 比 ScrollableX(指 X 轴,但意义不明确)更好。
3.避免使用与常用编程语言的关键字冲突的标识符
缩写和首字母缩写单词
尽量避免使用缩写或首字母缩写词。这类名称的可读性较差。同样,要确定某个首字母缩写词是否已受到广泛认可也是很困难的。
除非必要,不要使用任何未被广泛接受的首字母缩写词。
接口、类和结构的名称
通常,类型名称应该是名词短语,其中名词是由类型表示的实体。
从开发人员的角度选择标识实体的名称;名称应反映使用场合。
下面的准则适用于如何选择类型名称:
1. 按照 Pascal 大小写格式,使用名词或名词短语(或偶尔使用形容词短语)为类、接口和值类型命名。
2. 不要为类名加前缀(如字母 C)。接口不适用此规则,它应以字母 I 开头。
3. 考虑在派生类(包括直接或者间接继承)的末尾使用基类名称。
例如,从 Stream 继承的类型以 Stream 结尾,从 Exception 继承的类型以 Exception 结尾。
4. 为接口名称加上字母 I 前缀,以指示该类型为接口。
5. 在定义类/接口对(其中类是接口的标准实现)时,一定要确保类和接口的名称除接口名称以字母 I 为前缀外,二者应完全相同。
例如,IAsyncResult 接口和 AsyncResult 类。
以上准则中提及的从某个其他类型继承的类型,指的是所有的继承者,而不只是直接继承的类型。
例如,“向从 Exception 继承的类型添加 Exception 后缀”这一准则意味着在继承层次结构中具有 Exception 的任何类型都应该使用以 Exception 结尾的名称。
枚举的名称
不要在枚举值名称中使用前缀。例如,不要对 ADO 枚举使用 ad 之类的前缀,也不要对多格式文本枚举使用 rtf 之类的前缀,依此类推。
这还意味着不应在枚举值名称中包含枚举类型名称。下面的代码示例演示了不正确的枚举值命名。
final class Teams { const TeamsAlpha = 1; const TeamsBeta = 2; const TeamsDelta = 3; }
不要将 Enum 用作枚举类型的后缀。
不要在标志枚举的名称中添加 Flags 作为后缀。
对枚举使用单数名称,除非枚举值是位域。
对使用位域值的枚举(也称为标志枚举)使用复数名称。
类型成员的名称
类型包含以下几种成员:方法、属性、字段
方法的名称
使用动词或动词短语作为方法的名称。通常,方法对数据进行操作,因此,使用动词描述方法的操作可使开发人员更易于了解方法所执行的操作。
定义由方法执行的操作时,应从开发人员的角度仔细选择明确的名称。不要选择描述方法如何执行其操作的动词,也就是说,不要使用实现细节作为方法名称。
属性的名称
使用名词、名词短语或形容词作为属性的名称。名词短语或形容词适合于属性,因为属性保存数据。
不要使用与 Get 方法同名的属性。
例如,不要将一个属性命名为 EmployeeRecord,又将一个方法命名为 GetEmployeeRecord。开发人员会不知道使用哪个成员来完成其编程任务。
使用肯定性短语作为布尔值属性的名称(如使用 CanSeek 而不使用 CantSeek)。
此外,还可以为布尔值属性添加前缀(如 Is、Can 或 Has),但要注意使用得当。
考虑为属性提供与其类型相同的名称。
如果某个属性已强类型化为某个枚举,则该属性可与该枚举同名。
例如,如果有一个名为 CacheLevel 的枚举,则返回其中一个枚举值的属性也可以命名为 CacheLevel。
字段的名称
字段的命名准则适用于静态公共字段和静态受保护字段。不要定义公共实例字段或受保护实例字段。有关更多信息,请参见字段设计。
在字段名称中使用 Pascal 大小写格式。
使用名词或名词短语作为字段的名称。
参数名称
选择适当的参数名称可极大改善库的可用性。适当的参数名称应指示该参数会影响的数据或功能。
对参数名称使用 Camel 大小写。
使用描述性参数名称。在大多数情况下,参数名称及其类型应足以确定参数的用法。考虑使用反映参数含义的名称而不是反映参数类型的名称。
由于PHP属于弱类型语言,所以函数注释中应该注明每个参数的类型,如果是复杂结构的array类型,应该附带结构的注释说明。
3.代码格式约定
代码格式约定讨论的是怎样书写更清晰整齐的代码。
文件格式
代码文件应统一使用UTF8编码保存,不包含BOM文件头。
开发工具换行符应统一设置成Linux的/n格式,而不是Windows的/r/n格式。
对齐方式
代码缩进以括号为层级划分条件,包括:{、[、(。
每级代码缩进一个级,缩进可以Tab或者4个空格为单位。
代码换行
在任何时候,应该尽量将处理不同逻辑的代码用空行分隔开,以提高代码可读性。例如:
$resource = ResourceBo::Instance->GetUserResource($userId, $resourceId); $resource->value = $resource->value + 1;
在函数参数列表过长时,可以将参数列表换行并缩进一位,也可以每个参数占据一行并缩进对齐。
在任何时候,{ 与 } 之后,以及 } 之前,都不应该有任何代码。{ 之后应该立即换行缩进,} 应该单独一行。
代码分隔
在while、if、for、foreach之后应空一格再继续书写。
函数声明时,应在函数名括号之间空一格。
函数参数列表,应该在每个参数之间空一格。
语句中的操作符和操作数之间应该用空格分隔开。
for 循环中,三个子句应该空格分割。