整洁代码——提高代码可读性方法简述

本文简述了提高代码可读性的关键方法,包括命名策略,如遵循常见规则和原则;函数设计,强调使用少量参数和编写短小精悍的函数;以及格式规范,注重垂直和水平布局,使代码更易读。同时,良好的注释也是提升代码理解性的关键,用于阐述法律信息、代码意图和警示。
摘要由CSDN通过智能技术生成
      程序代码有双重目的,一是供机器执行,二是供程序员阅读。而代码的质量,往往体现在第二点,可读性是优秀代码的重要指标。在写代码时注意形成和保持代码的可读性,不仅有助于别人阅读,更有助于自己进一步的编写和完善。      《代码整洁之道》(Clean Code)一书提出了这样一种观念:”代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础”(Robert C. Martin,Object Mentor公司的创始人和总裁)。在编写代码时,实现既定的功能只是最基本的要求,不仅要写“对的代码”,更要写“整洁的代码”。
      对于“整洁代码”,C++语言的创始人Bjarne Stroustrup说道:“我喜欢优雅和高效的代码。代码逻辑直截了当,叫缺陷难以隐藏,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。”整洁代码的特点是形式上的优雅和功能上的高效:遵循“只做好一件事”的原则,使用简洁的逻辑解决这件事,以获得代码的“优雅”;周密地考虑并设计代码的层级结构,处理各种可能出现的异常,单一的功能和简洁的逻辑便于代码“性能最优”的调整,代码的高效水到渠成。
      “整洁代码”包含诸多的涵义,编写“整洁代码”需要遵循大量的技巧和规则,这里只从提高可读性的角度,从命名方法、函数设计、格式和注释四个方面,对提高代码可读性的方法做简单的探讨。

1. 命名方法


1.1. 一个例子

      为了说明命名方法对代码可读性的影响,先看下面一段代码:
public List<int[]> getThem() {  
   List<int[]> list1 = new ArrayList<int[]>();  
   for (int[] x : theList)  
      if(x[0] == 4)  
         list1.add(x);  
   return list1;  
}
从字面上看,函数名称叫getThem,最后返回了list1,说明这段代码是为了获取某样东西;程序遍历了theList,如果其中某项零下标值为4,则把它加到list1中。阅读这段代码,我们可以获知程序的工作流程,但无法知道它究竟实现了什么功能。想要真正弄懂这段程序的意义,我们至少要知道list1和theList代表什么?theList零下标有什么意义?值4有什么意义?返回值是做什么的?而这些内容在代码中都没有体现。假设这段代码是一个扫雷游戏程序中的一段,它用来获取当前雷区中标记了旗子的单元格,这里theList为整个雷区,int型数组表示单元格,零下标项是一种状态值,该状态值为4时表示“标记了旗子”;把零下标值为4的项,也就是标记了旗子的单元格存储到list1中,最后返回list1也就得到了雷区中标记了旗子的单元格。这样才算真正了解了这段代码的意义。
      把上面的代码作如下改写:
public List<int[]> getFlaggedCells() {  
   List<int[]> flaggedCells = new ArrayList<int[]>();  
   for(int[] cell : gameBoard)  
      if(cell[STATUS_VALUE] == FLAGGED])  
        flaggedCells.add(cell);  
   return flaggedCells;  
}
函数名getThem改名为getFlaggedCells,函数的目的就可以从函数名看出来,就是获取标记的单元格;原程序里面的集合指示随意取了一个名字叫list1,如果不往下读就无法知道里面到底要存什么东西,把它改写为flaggeCells,顾名思义就可以知道这个数组里存储的是被标记的单元格;原程序循环里变量的名称也是随意取的,可以看出来是要遍历整个theList,无法得知theList是什么,改写后就可以知道这里是遍历整个板面的单元格;从原程序的if语句里只可以看出这里要判断theList中整形数组的首元素是否为4,完全不知道为什么要这么做,而从改写后的代码中就可以获知这里是对单元格的状态值进行判断,判断单元格的状态是否是“已标记”,如果是则把这个单元格添加仅flagedCells中,进行记录;源程序返回值list1依旧不知所谓,改写flaggedCells表达返回值的意义,同时与函数名getFlaggedCells照应,任务完成。
      这里只修改了变量的名字,用常量代替了数值,把抽象的结构封装为类,代码的简洁性仍保留了下来,运算符、常量和嵌套的数量保持不变,但代码变得明确的多。更进一步,不用int数组表示单元格,而是另写一个类,包含一个函数isFlagged来掩盖4这个魔术数,代码就更加接近于自然语言。最终得到的代码如下:
public List<Cell> getFlaggedCells() {  
   List<Cell> flaggedCells = new ArrayList<Cell>();  
   for(Cell cell : gameBoard)  
      if (cell.isFlagged())  
         flaggedCells.add(cell);  
   return flaggedCells;  
}
      上面的例子说明命名的重要性,对于函数、变量、常量等内容,好的命名可以显提高代码的可读性。

1.2. 常见命名规则

      在介绍命名需要遵循的原则前
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值