1.代码低耦合
低耦合性是结构良好程序的特性,低耦合性程序的可读性、可维护性、可重用性和扩展性会比较好,而紧耦合模块或者系统之间关系太紧密,存在相互调用,如果修改其中一个对象,那么另一个对象也需要修改
。当两个对象过于紧耦合时,修改代码可能会是一场噩梦,同时更有可能在每次修改时引入bug。
2.避免上帝对象
上帝对象是指包含太多变量和函数的大型类或模块
。“知道得太多”和“做得太多”都会造成一些问题,原因有以下两点:
- 其他类或模块会变得过分依赖于数据(紧密耦合)。
- 由于所有代码都挤在同一个地方,使得整体结构杂乱无章。相较于上帝对象,分解为许多小对象可能会更好。
3.拒绝长函数
顾名思义,长函数是指函数太长了。虽然没有一个特定的数字表示多少行代码对于一个函数来说“太长”,但当你看到这个函数时,你就会知道它是不是太长。一个长函数意味着包含了太多的功能实现。一般情况下长函数应该被分解成许多子函数,其中每个子函数被设计为处理单个任务或问题
。理想情况下,原始的长函数将变成一个子函数调用列表,从而使代码更清晰,更易于阅读。
4.标识符命名有意义
一个或两个字母的变量名、无明显意义的函数名称、过分修饰的类名、使用变量类型标记的变量名称(例如,b_isCounted表示布尔变量),或者在一个代码中混合使用不同的命名规则,所有这些都将导致代码难以阅读,难以理解和难以维护
。一般而言,变量名称应该简短但具有描述性
。函数名通常应该至少有一个动词,并且函数名称应该表现出该函数的功能
,但是不要使用太多的单词,类名也是如此。
5.杜绝幻数
当你正在浏览一些其他人写的代码,这时你发现了一些硬编码的数字
。它们也许是if语句的一部分,或者是一些难以理解的计算的一部分,看起来没什么意义,而你需要修改该模块,但却无法理解这些数字的含义
,这会使你非常苦恼。因此在编程时,应该不惜一切代价避免这些所谓的“幻数”。硬编码数字在写的时侯是有意义的,但是它们很快就会失去所有含义 ,特别是当其他人试图维护你的代码时。其中一种解决方法是留下数字的注释,但更好的选择是将幻数转换为常量变量(用于计算)或枚举(用于if语句和switch语句)
。通过给幻数起一个名字,代码可读性一目了然
,同时也不太容易出现错误。
6.避免深度嵌套
深度嵌套的代码并不总是很糟糕,但可能会产生问题,因为它很难理解,特别是变量没有被很好地命名的情况下,甚至更加难以修改
。如果你发现自己正在编写一个双重,三重甚至四重for循环,那么代码将可能试图在超出自身的范围外查找数据。那么你应该提供一种方法,使之可以通过包含该数据的对象或模块函数调用来请求数据。另一方面,深层嵌套的if语句通常表明你试图在单个函数或类中处理过多的逻辑代码块。事实上,深层嵌套和长函数往往是同时出现的。如果你的代码有大量的switch语句或嵌套的if-then-else语句,你可能需要实现一个状态机或策略模式
。
7.简洁的代码
你在程序多个无关部分执行相同的逻辑代码块,然后发现需要修改该逻辑代码块,但是却不记得所有执行该代码块的地方,假设最终你只修改了5个位置,而实际上有8个位置的代码块需要进行更改,这就会导致结果出现错误。一般情况下转化为函数是比较好的习惯,这样如果你需要修改此逻辑代码块,就只需要修改该方法,再将其应用于所有调用该方法的地方就可以了
。
8.代码注释
代码在任何地方都没有注释。没有函数的功能注释,没有类的使用概述,没有对算法的解释等等。有人可能会说,写得好的代码不需要注释,但事实上,即使是写的最好的代码也不如注释更容易被理解。在写注释的时候,要记住你的目的是为解释代码块为什么存在,而不是解释代码块在做什么
。注释能帮助你更好的理解自己和他人的代码,减少工作量,所以不要忽视他们。