[TOC]
# 有意义的命名
## 命名原则
### 1. 名副其实
变量、函数或类的名称应该已经答复了所有大问题。如果还需要注释来补充,就不算名副其实。
> Bad
```java
int d; //消释的时间,以日计
```
> Good
```java
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
```
选择体现本意的名称能让人更容易理解和修改代码。
> Bad
```java
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x: theList) {
if (x[0] == 4) {
list1.add(x);
}
}
return list1;
}
```
- **theList类型不明**
- **theList下标意义不明**
- **常量4意义不明**
- **不知如何使用返回列表**
> Good 比如代表扫雷 获取`已标记`的单元格信息
```java
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard) {
if (cell[SYATUS_VALUE] == FLAGGED) {
flaggedCells.add(cell);
}
}
return flaggedCells;
}
```
> 优化版
```java
public List<Cell> getFlaggedCells()
{
List<Cell> flaggedCells = new ArrayList<Cell>();
for (int[] cell : gameBoard) {
if (cell.isFlagged()) {
flaggedCells.add(cell);
}
}
return flaggedCells;
}
```
### 2. 避免误导
避免使用与本意相悖的词。
### 3. 做有意义的区分
> Bad
- a1 a2 a3 等数字系列命名
- 已经有了Product类,又有了ProductInfo和ProductData...
废话都是冗余。Variable一词永远不应当出现在变量名中。Table一词永远不应当出现在表名中。
> Bad
- getActiviveAccount();
- getActiviveAccounts();
- getActiviveAccountInfo();
### 4. 使用读得出来的名称
### 5. 使用可搜索的名称
单字母名称和数字常量有个问题,就是很难在一大篇文字中找出来。
`WORK_DAYS_PER_WEEK`要比数字`5`好找的多
### 6. 避免使用编码
- 匈牙利语标记法 X
- 成员前缀 X
- 接口和实现 X(前导字母I被滥用)
### 7. 避免思维映射
### 8. 类名
类名和对象名应该是名词或名词短语。
> Good
`Customer`、`WikiPage`、`Account`.etc
> Bad
`Manager`、`Processor`、`Data`、`Info`
### 9. 方法名
使用动词或动词短语。
`postPayment`、`deletePage`或`Save`
```java
Complex fulcrumPoint = Complex.FromRealNumer(23.0);
```
通常好于
```java
Complex fulcrumPoint = new Complex(23.0);
```
### 10. 别扮可爱
不要使用俗语或俚语。
### 11. 每个概念对应有一个词
每个抽象概念选一个词,并且一以贯之。
> Bad
`fetch`、`retrieve`和`get`来给在多类中的获取数据命名,不易记忆。
一堆`controller`中又有`manager`还有`driver`,就会令人困惑。
### 12. 别用双关语
### 13. 使用解决方案领域名称
使用CS术语、算法名、模式名、数学术语等等
### 14. 使用源自所涉问题领域的名称
### 15. 添加有意义的语境
> Bad
```java
private void printGuessStatistics(char candidate, int count) {
Stirng number;
String verb;
String pluralModifier;
if (count == 0) {
number = "no";
verb = "are";
pluralModifier = "s";
} else if ( count == 1 ) {
number = "1";
verb = "is";
pluralModifier = "";
} else {
number = Integer.toStirng(count);
verb = "are";
pluralModifier = "s";
}
String guessMessage = String.format(
"There %s %s %s%", verb, number, candidate, pluralModifier
);
print(guessMessage);
}
```
> Good
```java
public class GuessStatisticsMessage {
private String number;
private String verb;
private String pluraModifier;
public String make(char candidate, int count) {
createPluralDepentMessageParts(count);
return String.format(
"There %s %s %s%s",
verb, number, candidate, pluraModifier
);
}
private void createPluralDepentMessageParts(int count) {
if (count == 0) {
thereAreNoLetters();
} else if (count == 1) {
thereIsOneLetter();
} else {
thereAreManyLetters(count);
}
}
private void thereAreManyLetters(int count) {
number = Integer.toString(count);
verb = "are";
pluraModifier = "s";
}
private void thereIsOneLetter() {
number = "1";
verb = "is";
pluraModifier = "";
}
private void thereAreNoLetters() {
number = "no";
verb = "are";
pluraModifier = "s";
}
}
```
### 16. 不要添加没用的语境
# 函数
- 短小 20行封顶最佳
- 只做一件事