[关闭]
@DevWiki 2015-07-02T21:11:27.000000Z 字数 2790 阅读 1227

CleanCode笔记---有意义的命名

CleanCode


更多内容详见:CleanCode笔记

1. 命名应该和实际意义相符合

反例:

  1. int w;
  2. int h;
  3. public int fun(){
  4. return w*h;
  5. }

从代码中看不出任何信息,w和h是何含义?

不如改为:

  1. int width;
  2. int height;
  3. public int calculateArea(){
  4. return width*height;
  5. }

这样没有注释也能看懂代码的意图.


2.避免误导

如果仅仅给你一个accountList,很容易让人误以为是一个账户类表.

  1. Account[] accountList;
  2. //此处又很长的代码
  3. accountList = getAccountList(); //你能辨别出accountList是什么吗?

为了避免误导,应该改为:

  1. Account[] accountGroup;
  2. //此处又很长的代码
  3. accountGroup = getAccountGroup(); //你能辨别出accountGroup是什么吗?

3.做有意义的区分

现在有三个类:

  1. public class Account{}
  2. public class AccountInfo{}
  3. public class AccountData{}

仅仅从类名你能区分这三个类有什么区别吗?
既然要区分他们就应该取一个有意义的名称区分.


4.用读得出的名称

有的程序员喜欢用自造的词语,比如:

  1. public void lxmcreateData(){
  2. //代码内容
  3. }

你能读出来上面函数的名称吗?函数本意是想创造数据,但是lxm是什么意思?翻到类头注释才知道,作者叫Lixiaoming.
如果改为下面这样,是不是更好读呢?

  1. public void createData(){
  2. //代码内容
  3. }

5.用可搜索的名称

经常在代码中可以见到类似a,b,w,h,e等这样的命名,而且同一个类中多次出现,特别是作为临时变量的i,j,k.当想查找时,编辑器也不知道你想要查找哪一个.
例如:

  1. private List<Student> studentList;
  2. public float getMathAvgScore(){
  3. float s = 0;
  4. for(int i = 0; i < studentList.size(); i++){
  5. s = s + studentList.get(i).getMathScore();
  6. }
  7. float a = s/studentList.size();
  8. return a;
  9. }
  10. public float getAvgScore(){
  11. float s = 0;
  12. for(int i = 0; i < studentList.size(); i++){
  13. s = s + studentList.get(i).getTotalScore();
  14. }
  15. float a = s/studentList.size();
  16. return a;
  17. }

如果改为下面这样,你觉得哪个更好呢?

  1. private List<Student> studentList;
  2. public float getMathAvgScore(){
  3. float mathTotalScore = 0;
  4. for(Student student : studentList){
  5. mathTotalScore = mathTotalScore + student.getMathScore();
  6. }
  7. float mathAvgScore = mathTotalScore/studentList.size();
  8. return mathAvgScore;
  9. }
  10. public float getAvgScore(){
  11. float totalScore = 0;
  12. for(Student student : studentList){
  13. totalScore = totalScore + student.getTotalScore();
  14. }
  15. float avgTotalScore = totalScore/studentList.size();
  16. return avgTotalScore;
  17. }

6.不要使用命名编码

什么是命名编码?就像前面的lxmcreateData()函数名就是命名编码.

命名前缀

就像前面的lxmcreateData()一样,该类中存在很多类似lxmXXX的函数,变量.
在命名时应避免使用这样的前缀

命名后缀

使用Eclipse时,我们生命一个变量时,往往会给出命名提示:

String nameString

这是很不必要的,不需要在变量后面都带上该变量的类型,除非该变量的命名不足以表现出其类型.


7.避免思维映射

每一个变量应明确其含义,不要让人在大脑中给其一个含义映射!
比如:

  1. for(int i = 0; i < studentList.size(); i++){
  2. s = s + studentList.get(i).getMathScore();
  3. }

与下面相比:

  1. for(Student student : studentList){
  2. mathTotalScore = mathTotalScore + student.getMathScore();
  3. }

下面的代码更直观,而上面的代码会让人去记住s代表什么含义.


8.类名

类名和对象名应该是名词活名词短语,如Customer,WikiPage,Account,AccountParser等,避免使用Manager,Processor,Data,Info等这样的类名.类名不应该是动词.


9.方法名

方法名应该是动词或动词短语,如postPayment,deletePage或save.
属性访问与修改和断言应该根据其命名,并依照javabean标准加上get,set,is前缀.
如:

  1. String name = person.getName();
  2. person.setName("Jack");
  3. player.isPlaying();

10.别装幽默

命名应该是直来直去的名称,不要使用一些俗语或俚语(不要以为别人都和你一样英文阅历很深).
别用whack()来表示kill().


11.每个概念对应一个词

如果你要写一个控制类,比如控制音频类.如果使用了AudioManager就不要在使用AudioController.否则别人是弄不懂二者之间区别.


12.别用双关语

比如add一词又很多含义,不要为了保持方法名一致就命名为add.
把单个条目放到集合中可以用put,不要用add;
把单个条目放大数据库中可用insert,不要用add.


13.使用解决方案领域的名称

有时同一个事物在不同领域有不同的含义,在写代码的过程中要用和项目相关领域的词汇命名.


14.使用源自于所涉及问题领域的名称

尽量使用问题所在的领域的词语来命名,这样可以明确代码解决问题的领域.


15.添加有意义的语境

有些词语会有一词多义的现象,如果找不到代替该词更好名称,那么至少给该词添加能明确含义的语境.


16.不要添加没用的语境.

就像前面的lxmcreateData()一样,前缀lxm是没有任何含义的.一定不要附带这样的没有意义的语境.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注