Clean Code - 整洁代码 - 命名

命名

命名应该表明意图

  • 它为什么存在、它做了什么,它怎么使用。
  • 如果命名需要注释,那它没有表明它的意图。

坏的例子:

int d; // elapsed time in days

好的例子:

int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

避免虚假信息

程序员应该避免为代码留下错误的线索。

比如变量名为accountList,但是类型却不是List。使用accounts更好。

相似的概念使用相似的命名。避免不一致的命名。

有意义的区分

不同的用途,避免相似的命名。

坏的例子:

public static void copyChars(char a1[], char a2[]) {
  for (int i = 0; i < a1.length; i++) {
    a2[i] = a1[i];
  }
}

ProductInfo和ProductData

getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();

好的例子:

public static void copyChars(char source[], char destination[]) {
  for (int i = 0; i < source.length; i++) {
    destination[i] = source[i];
  }
}

customer和customerInfo

accountData和account

使用可发音的命名

class DtaRcrd102 {
  private Date genymdhms;
  private Date modymdhms;
  private final String pszqint = "102";
  /* ... */
};

重构为

class Customer {
  private Date generationTimestamp;
  private Date modificationTimestamp;;
  private final String recordId = "102";
  /* ... */
};

使用可搜索的命名

单个字母变量名和数字常量不容易搜索。

for (int j=0; j<34; j++) {
  s += (t[j]*4)/5;
}

重构为

int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j=0; j < NUMBER_OF_TASKS; j++) {
  int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
  int realTaskWeeks = (realdays / WORK_DAYS_PER_WEEK);
  sum += realTaskWeeks;
}

避免编码

命名不应该包含类型信息。

坏的例子:

PhoneNumber phoneString;
// name not changed when type changed!

成员前缀

public class Part {
  private String m_dsc; // The textual description
  void setName(String name) {
    m_dsc = name;
  }
}

重构为

public class Part {
  String description;
  void setDescription(String description) {
    this.description = description;
  }
}

接口与实现

坏的例子:

IShapeFactory

好的例子:

ShapeFactory 和 ShapeFactoryImp

避免思维映射

名称应该望文生义。

类名

类名应该使用名词或者名词短句。不应该是动词。

Customer, WikiPage, Account, 和 AddressParser.

避免使用Manager, Processor, Data, 或者 Info。

方法名

方法名应该使用动词或者动词短句。

比如postPayment, deletePage, save。

使用get、set、is前缀。

当重写构造器时,使用静态工厂方法,通过名称描述参数。

Complex fulcrumPoint = Complex.FromRealNumber(23.0);

优于

Complex fulcrumPoint = new Complex(23.0);

每个概念选择一个单词

fetch、retrieve、get同时使用会产生混乱。

使用解决方案领域名称

使用计算机术语、算法术语、模式术语、数学术语。

比如AccountVisitor、SocketAdaptor、JobQueue。

使用问题领域名称

使用业务领域名词。

添加有意义的上下文

firstName、lastName、state

添加前缀表示其是地址第一部分:

addrFirstName, addrLastName, addrState

更好的解决方案是创建一个新类Address来保存这些信息。

不要添加无理由的上下文

比如所有类名前缀为GSD。

短的名称比长的名称好。

accountAddress 和 customerAddress 是一个好的实例名,但不是一个好的类名。Address是一个好的类名。