代码整洁之道学习总结(1)------有意义的命名

这里写图片描述

1.名副其实

☛要点

如果名称需要注释来补充,那就不算是名副其实

☹糟糕代码

    public List<int[]> getThem (){
          List<int[]>  listl  = new  ArrayList<int[]> ();
           for (int[] x : theList)
              if (x[0] == 4){
                 listl.add(x[0]);}
          return listl;
     }

theList 中是什么类型的东西?
theList 0下标的意义是什么?
值4的含义是什么?
我们怎么使用返回的列表?

☺改进代码

假设这是一段扫雷游戏代码。

盘面就是theList的单元格列表,将其命名为gameBord

0下标是一种状态值

状态值‘4’表示已标记

    private List<int[]> gameBord;
    private int STATUS_VALUE = 0;
    private int FLAGED = 4;

    public List<int[]> getFlagedCells() {
        List<int[]> flagedCells = new ArrayList<int[]>();
        for (int[] cell : gameBord)
            if (cell[STATUS_VALUE] == FLAGED) {
                flagedCells.add(cell);
            }
        return flagedCells;
    }

☺更进一步

不用int[]表示单元格,而是用一个单独的类,该类包括一个名副其实的函数(isFlagged)

    public List<Cell> getFlagedCells() {
        List<Cell> flagedCells = new ArrayList<Cell>();
        for (Cell cell : gameBord)
            if (Cell.isFlagged()) {
                flagedCells.add(cell);
            }
        return flagedCells;
    }

2.避免误导

3.做有意义的区分

☛要点

以数字系列命名(a1,a2…)是依义命名的对立面。这样的名称纯属误导——完全没有提供正确信息

如果有一个Product类,还有一个ProductInfo或者ProductData,他们虽然名称不同,毫无任何区别

variable(可变的)一词永远不应出现在变量名中

Table一词永远不应出现在表名中

nameString会比name好吗?难道name会是一个浮点数?

☹糟糕代码

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

如果参数名为source和destination(目的地,目标,终点)这个函数就会像样许多

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

以上区分毫无意义

4.使用能读出来的名称

☛要点

人类进化到大脑中专门有一部分来处理语言,若不善加利用,实在是种耻辱

☹糟糕代码

private Date genymdhms;//生成日期,年,月,日,时,分,秒

☺改进代码

private Date generationTimeStamp;//生成时间戳

5.使用可搜索名称

☛要点

单字母名称和数字常量很难在一大篇文字中找出来

若变量或常量可能在代码中多次使用,应赋其便于搜索的名称

☹糟糕代码

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

☺改进代码

        int realDaysPerIdealDay = 4;
        final int WORK_DAYS_PER_WEEK = 5;
        final int NUMBER_OF_TASKS = 34;
        int sum = 0;
        for (int i = 0; i < NUMBER_OF_TASKS; i++) {
            int realTaskDays = TaskEstimate[j] * realDaysPerIdealDay;
            int realTaksWeeks = realTaskDays/WORK_DAYS_PER_WEEK;
            sum += realTaksWeeks;
        }

6.避免使用编码

☛要点

不必用m_前缀来标注成员变量。应把类和函数做的足够小,消除成员前缀的需要

这段看的有点懵逼。。。

☹糟糕代码

private String m_des;// The textual description

☺改进代码

private String description;

7.避免思维映射

☛要点

仅仅是因为有了a和b,就要取名为c,实在非像样的理由。

专业程序员了解,明确是王道

8.类名

☛要点

类和对象应该是名称或名词短语,如Customer,Account,避免使用Manager,Processor,data或Info这样的类名。

类名不应当是动词。

9.方法名

☛要点

方法名应当是动词或动词短语,如PostPayMent,deletePage或save。

重载构造器时,使用描述了参数的静态工厂方法名。例如

Complex fulcrumPoint = Complex.FromRealNumber(23.0);

同常好于

Complex fulcrumPoint = new Complex(23.0);

可以考虑将对应的构造器设置为private,强制使用这种命名手段。

10.别扮可爱

☛要点

谁会知道HolyHandGrenade(圣手手雷)这个函数是用来做什么的呢?DelteItems或许是更好的名称

言到意到,意到言到。

11.每个概念对应一个词

☛要点

给抽象概念对应一个词,并且一以贯之。

在同一堆代码中。有manager又有controller,driver,就会令人困惑。

总之,不要用多个词表示一个意思!

12.别用双关语

☛要点

避免用同一单词表示不同目的。

比如在多个类中都有add方法,该方法通过增加或链接两个现有值来获得新值。假设新类中有个方法,把单个变量放在集合中,这个方法如果再叫add,就是双关了,应该用insert或append好一些。

总之,不要用一个词表示多个意思!

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

☛要点

只有程序员会读你的代码,尽管使用程序员看得懂的名称。使用问题所涉领域来命名,可不算是聪明的做法。

14.使用源自所涉问题领域的问题

☛要点

如果不能使用程序员熟悉的术语来命名,使用问题所涉领域来命名。

我觉的以上两点写的有些矛盾。。

15.添加有意义的语境

☹糟糕代码

    public void printGuessStatistics(char candidate,int count) {
        String number;
        String verb;
        String pluralModifier;
        if(count == 0){
            number = "no";
            verb = "are";
            pluralModifier = "s";
        }else if(count ==1) {
            number = "1";
            verb = "is";
            pluralModifier = "s";
        }
        else {
            number = Integer.toString(count);
            verb = "are";
            pluralModifier = "s";
        }
        String guessMessage = String.format("There %s %s %s$s",verb,number,candidate,pluralModifier);
        System.out.println(guessMessage);
    }

☺改进代码

上列函数有点过长,要分解这个函数,需要创建一个GuessStatisticsMessage的类,把三个变量作为该类的成员字段。

class GuessStatisticsMessage
{
    String number;
    String verb;
    String pluralModifier;

    public String make(char candidate,int count) {
        CreatePluraDependentMessageParts(count);
        return String.format("There %s %s %s$s",verb,number,candidate,pluralModifier);
    }

    private void CreatePluraDependentMessageParts(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";
        pluralModifier = "s";
    }

    private void thereIsOneLetter() {
        number = "1";
        verb = "is";
        pluralModifier = "s";
    }

    private void thereAreNoLetters() {
        number = "no";
        verb = "are";
        pluralModifier = "s";
    }
}

16.不要添加没用的语境

☛要点

假设有一个“加油站豪华版”(Gas Station Deluxe)的应用,在其中给每个类添加GSD前缀就不是什么好点子了。

17.最后的话

不妨试试上面这些规则,看你的代码可读性是否有所提升。如果你是在维护别人写的代码,使用重构工具来解决问题。效果立竿见影,而且会持续下去。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值