6 命名
6.1 所有标识符的通用规则
标识符仅使用 ASCII 字母和数字,在下面注明的少数情况下使用下划线,很少情况下(当框架如 Angular 要求时)使用美元符号。
在合理范围内,尽可能给出描述性的名称。不要担心节省水平空间,因为让新读者立即理解你的代码远比这更重要。不要使用对项目外部读者来说模糊或不熟悉的缩写,也不要通过删除单词中的字母来缩写。
errorCount // No abbreviation.
dnsConnectionIndex // Most people know what "DNS" stands for.
referrerUrl // Ditto for "URL".
customerId // "Id" is both ubiquitous and unlikely to be misunderstood.不允许:
n // Meaningless.
nErr // Ambiguous abbreviation.
nCompConns // Ambiguous abbreviation.
wgcConnections // Only your group knows what this stands for.
pcReader // Lots of things can be abbreviated "pc".
cstmrId // Deletes internal letters.
kSecondsPerDay // Do not use Hungarian notation.例外:作用域不超过 10 行的变量(包括不属于导出 API 的参数)可以使用短的(例如单字母)变量名。
6.2 按标识符类型的规则
6.2.1 包名
包名全部使用 lowerCamelCase。例如,my.exampleCode.deepSpace,而不是
my.examplecode.deepspace 或 my.example_code.deep_space。
例外:包名可以符合 TypeScript 基于路径的模式。这通常是全小写的,并在文件名中存在下划线时使用下划线。
6.2.2 类名
类、接口、record 和 typedef 名称使用 UpperCamelCase
编写。未导出的类只是局部的:它们不标记 @private。
类型名称通常是名词或名词短语。例如,Request、ImmutableView 或
VisibilityMode。此外,接口名称有时可以是形容词或形容词短语(例如
Readable)。
6.2.3 方法名
方法名使用 lowerCamelCase 编写。@private
方法的名称可以选择性地以尾随下划线结尾。
方法名通常是动词或动词短语。例如,sendMessage 或 stop_。属性的
getter 和 setter 方法从来不是必需的,但如果使用它们,应命名为
getFoo(或对布尔值可选地使用 isFoo 或 hasFoo),setter 命名为
setFoo(value)。
下划线也可以出现在 JsUnit
测试方法名中,以分隔名称的逻辑组件。一种典型的模式是
test<MethodUnderTest>_<state>_<expectedOutcome>,例如
testPop_emptyStack_throws。命名测试方法没有唯一正确的方式。
6.2.4 枚举名
枚举名使用 UpperCamelCase
编写,类似于类,通常应该是单数名词。枚举中的各个项使用 CONSTANT_CASE
命名。
6.2.5 常量名
常量名使用
CONSTANT_CASE:全部大写字母,单词之间用下划线分隔。没有理由用尾随下划线命名常量,因为私有静态属性可以被(隐式私有的)模块本地变量替代。
6.2.5.1 “常量”的定义
每个常量是 @const 静态属性或模块本地 const 声明,但不是所有 @const
静态属性和模块本地 const
都是常量。在选择常量命名之前,考虑该字段是否真的感觉像一个深度不可变的常量。例如,如果该实例的任何可观察状态可以改变,它几乎肯定不是常量。仅仅打算永不修改该对象通常是不够的。
示例:
// Constants
const NUMBER = 5;
/** @const */ exports.NAMES = goog.debug.freeze(['Ed', 'Ann']);
/** @enum */ exports.SomeEnum = { ENUM_CONSTANT: 'value' };
// Not constants
let letVariable = 'non-const';
class MyClass {
constructor() { /** @const {string} */ this.nonStatic = 'non-static'; }
};
/** @type {string} */
MyClass.staticButMutable = 'not @const, can be reassigned';
const /** Set<string> */ mutableCollection = new Set();
const /** MyImmutableContainer<SomeMutableType> */ stillMutable =
new MyImmutableContainer(mutableInner);
const {Foo} = goog.require('my.foo'); // mirrors imported name
const logger = log.getLogger('loggers.are.not.immutable');常量的名称通常是名词或名词短语。
6.2.5.2 局部别名
只要局部别名比完全限定名称更能提高可读性,就应使用局部别名。遵循与
goog.require
相同的规则(??),保持别名的最后部分。别名也可以在函数中使用。别名必须是
const。
示例:
const staticHelper = importedNamespace.staticHelper;
const CONSTANT_NAME = ImportedClass.CONSTANT_NAME;
const {assert, assertInstanceof} = asserts;6.2.6 非常量字段名
非常量字段名(静态或其他)使用 lowerCamelCase
编写,私有字段可选择带尾随下划线。
这些名称通常是名词或名词短语。例如,computedValues 或 index_。
6.2.7 参数名
参数名使用 lowerCamelCase 编写。请注意,即使参数期望构造函数也是如此。
公共方法中不应使用单字符参数名。
例外:当第三方框架要求时,参数名可以以 $
开头。此例外不适用于任何其他标识符(例如局部变量或属性)。
6.2.8 局部变量名
局部变量名使用 lowerCamelCase
编写,如上所述,模块本地(顶级)常量除外。函数作用域中的常量仍然使用
lowerCamelCase 命名。请注意,即使变量持有构造函数也使用
lowerCamelCase。
6.2.9 模板参数名
模板参数名应该是简洁的、单词或单字母标识符,且必须全部大写,如 TYPE 或
THIS。
6.2.10 模块本地名称
未导出的模块本地名称是隐式私有的。它们不标记
@private。这适用于类、函数、变量、常量、枚举和其他模块本地标识符。
6.3 驼峰命名法(Camel case):定义
有时将英语短语转换为驼峰命名法有多种合理的方式,例如当存在缩写或不寻常的结构(如 “IPv6” 或 “iOS”)时。为了提高可预测性,Google 风格指定了以下(几乎)确定性的方案。
从名称的散文形式开始:
- 将短语转换为纯 ASCII 并去除任何撇号。例如,“Muller’s algorithm” 可能变成 “Muellers algorithm”。
- 将结果分成单词,在空格和任何剩余的标点符号(通常是连字符)处分割。
- 建议:如果任何单词在通常使用中已经具有传统的驼峰命名法外观,则将其拆分为组成部分(例如,“AdWords” 变成 “ad words”)。请注意,像 “iOS” 这样的单词本身并不真正是驼峰命名法;它违反了任何约定,因此此建议不适用。
- 现在将所有内容转为小写(包括首字母缩写词),然后仅将以下内容的首字符转为大写:
- ……每个单词,产生
UpperCamelCase,或 - ……除第一个外的每个单词,产生
lowerCamelCase
- ……每个单词,产生
- 最后,将所有单词连接成一个标识符。
请注意,原始单词的大小写几乎完全被忽略。
lowerCamelCase 的示例:
| 散文形式 | 正确 | 不正确 |
|---|---|---|
| “XML HTTP request” | xmlHttpRequest | XMLHTTPRequest |
| “new customer ID” | newCustomerId | newCustomerID |
| “inner stopwatch” | innerStopwatch | innerStopWatch |
| “supports IPv6 on iOS?” | supportsIpv6OnIos | supportsIPv6OnIOS |
| “YouTube importer” | youTubeImporter | youtubeImporter* |
*可接受,但不推荐。
对于 UpperCamelCase 的示例,将每个正确的 lowerCamelCase
示例的首字母大写。
注意:有些单词在英语中的连字符使用是模糊的:例如 “nonempty” 和
“non-empty” 都是正确的,所以方法名 checkNonempty 和 checkNonEmpty
同样都是正确的。