如何写出优雅的代码?-从命名开始

在开发过程中,给函数起个好名字十分必要,好的名字可以缩短维护时间。

变量、函数或类的名称可以表现出程序大部分功能含义,真正好的命名不需要注释就应该知道其含义。那么, 如何写出优雅的代码?

一、见名知意

举个栗子🌰1:

1 int m //月

如果不看注释,应该不会知道m究竟表示何意,是月份(month)、米数(meter)还是分钟(minute),在变量定义过程中,尽可能要见名知意。

举个例子🌰2:

1 public List<int []> getList(){
2    List<int []> list1=new ArrayList<int []>();
3    for(int [] a:theList){
4        if(a[0]==4){
5            list1.add(a);
6        }
7    }
8    return list1;
9}

上面代码的格式没有问题,问题出现在代码表达上,命名太过模糊,很难知道其表达是何含义。

(1)theList中是什么类型?

(2)theList零下标条目的意义是什么?

(3)值4的含义是什么?如果我们开发的一款扫雷游戏,theList代表的是盘面列表,那么theList就应该改为gameBoard。盘面上每一个单元格都表示一个简单数组表示,零下标其实表示的是一种状态值,等于4表示为“已标记”。

只要改成有意义的名称代码就会得到改进:

1 public List<int[]> getFlagedCells(){
2    List<int []> flaggedCells=new  ArrayList<int []>();
3    for(int [] cell:gameBoard){
4        if(cell[STATUS_VALUES]==FLAGGED){
5            flaggedCells.add(cell)
6    }
7    return flaggedCells;
8}

代码格式完全没变,只是变换了名称,表达意义就完全不同。还可以进一步改进,不用int数组表示单元格,而是写一个类,用一个类去包装int数组,从而掩盖掉魔术数,于是改进后如下:

 1 public class Cell {
 2    private static final Integer FLAGGED=4;
 3    private int index;
 4
 5    public void setIndex(int index) {
 6        this.index = index;
 7    }
 8    public booleanis isFlagged(){
 9        if(this.index==FLAGGED){
10            return true
11        }
12        return false;
13    }
14}

 1    public List<Cell> getFlagedCells() {
 2        List<Cell> flaggedCells = new ArrayList<Cell>();
 3        for (Cell cell : gameBoard) {
 4            if (cell.isFlagged()) {
 5                flaggedCells.add(cell);
 6            }
 7            return flaggedCells;
 8        }
 9    }
10}

不用int表示单元格,而是写一个类,该类写一个状态函数(isFlagged)从而掩盖掉魔术数,让看代码的人,更能看懂其中含义,这就是选好变量名称带来的力量。另一方面,在实体属性的判断可以放在实体层,以往实体层只有set()、get()方法,这样的模型我们称之为“失血模型”,本质没有逻辑意义。

二、做有意义区分

函数和变量参数名尽量避免写无意义的废话,比如:

以数字命名(a1,a2,a3,…..,3N)没有任何意义,后期代码维护困难较大。

举个栗子🌰3:

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

上面函数是一个数组拷贝函数,如果把变量参数名改为source和destination会更好一些。《代码整洁之道》中有一句话:废话是没有意义的区分。假如代码中有很多种关于描述汽车信息名称,Car,CarInfo,CarData,它们的名称虽然不同,但是毫无区分意义,改成XXXCar会更好。Variable一词不应该出现在变量中,就好像table一词不应该出现在表中一样,NameString会比Name好吗?PhotoNumberInteger会比PhotoNumber表达的含义更清楚吗?

三、名称要易读

如果函数的名称不易读,那么交流起来也会变得十分困难。

举个栗子🌰4:

1 class MyProduct{
2    priavte Date genymdhms;
3    priavte Date modmdhms;
4    priavte final String paszqint ="102";
5    /*....*/  
6}

改进后:

1 class MyProduct{
2    priavte Date generationTimestamp;
3     priavte Date modificationTimestamp;
4    priavte final String recordId ="102";
5    /*....*/  
6}

四、使用可搜索的名称

使用可搜索的名称,不但可以很好表达属性的意义掩盖掉魔术数,也可以定位代码关键出处,维护起来更为方便。

比如 int 1 表示一个月第一天,但是代码中可能会出现几十个1,搜索起来极为不便,改成public static final Integer FIRST_DAY=1,则会简单的多。

五、不添加没用的语境

类名如果本身能够真实表达语境,那么就无需添加额外的语境。对于Address类来说,是一个非常好的类名,URL也是关于表示地址的非常的好的类名,无需使用URLAddress去添加额外address语境。只要名称能够表达清楚含义,就没必要添加额外的语境。但对于实体属性来说,accountAddress和customerAddress来说都是一个很好的命名。

六、类名和方法名

类名应该是名词或名词短语,如Customer、Wikipage、Account和AddressParse避免使用Date或者Info这样的类名,类名不应该是动词。

方法名应该是动词或动词短语开头,如postPayment,deletePage或者save、get。如果你是应用开发者或者维护者,不妨试试以上规则,优雅的代码应先从好的命名开始。以上就是本期分享,后续胖虎会继续给出如何写出优雅代码的系列分享

我是胖虎,用心写好每篇文,下期再见。

参考书籍:[1]《代码整洁之道》[美]Robert C. Martin.人民邮电出版社.2010.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容