代码简洁之道之我见
写出整洁代码的原因:培养良好的职业素养,成为卓越的程序员。
一、有意义的命名
1.类名和对象名应该是名词或名词短语;方法名应当是动词或动词短语。
2.每个概念对应一个词。
3.使用计算机领域名称。
记住只有程序员才会读你的代码。所以尽管用那些计算机科学的术语、算法名、模式名、数学术语吧。如果不能用程序员所熟悉的术语来给手头的工作命名,就采用从所涉问题领域而来的名称吧。
4.添加有意义的语境。
如,可以添加前缀addrFirstName、addrLastName、addrState等,以此提供语境。
二、整洁的函数
函数是所有程序中的第一组代码。
1、短小
函数的第一规则是短小。每个函数要一目了然,每个函数都只说一件事,而且每个函数都依次序把你带到下一个函数。这就是函数应达到的短小的程度。
一个函数(方法)的最优行数限定在 30 行以内。
代码块和缩进
if语句、else语句、while语句等,其中的代码块应该只有一行。函数的缩进层级不该多于一层或两层。
2、只做一件事
函数应该做一件事。做好这件事。只做这一件事。要判断函数是否不止做了一件事,就是看是否能再拆分出一个函数,该函数不仅只是单纯地重新诠释其实现。
3、每个函数一个抽象层级
要确保函数只做一件事,函数中的语句都要在同一抽象层级上。函数中混杂不同抽象层级,往往让人迷惑。读者无法判断某个表达式是基础概念还是细节。一旦细节与基础概念混杂,更多的细节就会在函数中纠结起来。
自顶向下读代码:向下规则
代码拥有自顶向下的阅读顺序。每个函数后面都跟着位于下一抽象层级的函数,这样在查看函数列表时,就能循抽象层级向下阅读了。
4.参数
如果函数看来需要两个、三个或以上参数,就说明其中一些参数应该被封装为类。
三、整洁的类
1、类的组织
类应该从一组变量列表开始。如果有公共静态常量,应该先出现。然后是私有静态变量,以及私有实体变量。很少会有公共变量。
公共函数应跟在变量列表之后。把由某个公共函数调用的私有工具函数紧随在该公共函数后面,更符合由顶向下的原则。
2、类应该短小
关于类的第一条规则是类应该短小。第二条规则是还要更短小。
函数通过计算代码行数衡量大小。对于类,通过计算权责来进行衡量。
类的名称应当描述其权责。如果某个类无法命名以精确的名称,这个类就太长了。类名越含混,该类越有可能拥有过多的权责。
一个类文件的最优长度限制在 200 行以内。
单一权责原则
单一权责原则任务,类或模块应有且只有一条加以修改的理由。
有大量短小类的系统并不比有少量庞大类的系统拥有更多移动部件,其数量大致相等。
系统应该由许多短小的类而不是少量巨大的类组成。每个小类封装一个权责,只有一个修改的原因,并与少数其他类一起协同达成期望的系统行为。
3.内聚
类应该只有少量实例变量。类中的每个方法都应该操作一个或多个这种变量。通常而言,方法操作的变量越多,就越粘聚到类上。如果一个类中的每个变量都被每个方法所使用,则该类具有最大的内聚性。
一般来说,创建这种极大化内聚类既是不可取也是不可能的;另一方面,我们希望内聚行保持在较高的位置。内聚性高,意味着类中的方法和变量互相依赖、互相结合成一个逻辑整体。
保持函数和参数列表短小的策略,有时会导致为一组子集方法所用的实例变量数量增加。出现这种情况时,往往意味着至少有一个类要从大类中挣扎出来。应该尝试将这些变量和方法分拆到两个或多个类中,让新的类更为内聚。保持内聚性就会得到许多短小的类。
四、整洁的格式
1.垂直格式
可能用大多数为200行、最长500行的单个文件构造出出色的系统,尽管这并非不可违背的原则,但是短文件通常比长文件易于理解。
概念间垂直方向上的区隔
代码都是从上往下读,从左往右读。每行展现一个表达式或一个子句,每组代码行展示一条完整的思路。这些思路用空白行区隔开来。
每个空白行都是一条线索,标识出新的独立概念。
垂直方向上的靠近
如果说空白行隔开了概念,靠近的代码行则暗示了他们之间的紧密关系。所以,紧密相关的代码应该互相靠近。
垂直顺序
自上而下展示函数调用依赖顺序。
2.横向格式
应该尽力保持代码短小。代码一行长度达到100个字符也还可以接受,再多的话,就有点肆意妄为了。
缩进
类的声明、类的方法相对于该类缩进一个层级。方法的实现相对于方法声明缩进一个层级。代码块的实现相对于容器代码块缩进一个层级,以此类推。