代码大全2阅读笔记 10~1
第6章 可以工作的类
警惕有超过约7个数据成员的类。
优先使用“深层副本(deep copies)”,除非论证可行,才采用“浅层副本(shallow copies)
第7章 高质量的子程序
复杂的布尔判断,应该使用子程序来实现。
人类很难同时记住超过7个单位的信息。
子程序的名字是它的质量的指示器。如果名字糟糕但恰如其分,那说明这个子程序设计得很差劲。如果名字糟糕而且又不准确,那么它就反映不出程序是干什么的。不管怎样,糟糕的名字都意味着程序需要修改
第8章 防御式编程
- 保护程序免遭非法输入数据的破坏。检查所有来源于外部的数据的值。
- 用错误处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况。
- 可以让软件的某些部分(某个抽象层,公用方法等)处理“不干净的”数据,而让另一些部分处理“干净的”数据,即可让大部分代码无须再担负检查错误数据的职责。
异常
用异常通知程序的其他部分,发生了不可忽略的错误。在恰当的抽象层次抛出恰当的异常,比如底层异常不应该在高层抽象中被抛出。
第3部分 变量
第10章 使用变量的一般事项
初始化
- 在声明变量的时候初始化。
- 理想情况下,在靠近第一次使用变量的位置声明和定义改变量。
- 在可能的情况下使用final或者const。
作用域
使变量的引用局部化,减小变量的作用域:
-
在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量。
-
直到变量即将被使用时再为其赋值。
-
把相关语句放在一起,可能的情况下提取成单独的子程序。
-
开始时采用最严格的可见性(比如设为private),然后根据需要扩展变量的作用域。
“方便性”和“智力可管理性”两种理念之间的区别,归根结底来源于侧重写程序还是读程序之间的区别。
每个变量只应该用于单一用途,且不应该有隐藏含义(比如当x大于5000时代表什么)。
第11章 变量名的力量
通常,对变量的描述就是最好的变量名。名字对于代码读者的意义要比对作者更重要。
一个好名字通常表达的是“what”而不是“how”。一般而言,如果一个名字反映了计算的某些方面而不是问题本身,那么它反映的就是“how”而不是“what”了。
较长的名字适用于较长的作用域,较短的名字适用于短的作用域(循环、小的方法等)。
计算限定词,如Total、Sum、Average、Min、Max、String、Pointer等等,应该放在名字的最后。
典型的布尔变量名:done, error, found, success, ok等。布尔变量应该是那些隐含了“真/假”含义的名字,如done和success等。应该使用肯定的布尔变量命名,而不是notFound,notDone等。
枚举类型要有统一的组前缀。
避免使用具有相似含义的名字。如果你能够交换两个变量的名字而不会妨碍对程序的理解,那么你就需要为这两个变量重新命名了。
命名规则应该能够区分局部数据、类的数据和全局数据。
第12章 基本数据类型(Fundamental Data Types)
Tips:
-
避免使用Magic Number。
-
每次遇到除法时都要检查预防除零错误。
-
显式地使用类型转换。
-
避免混合类型的比较。
-
整数:小心溢出。
-
浮点数:避免“相等”判断,避免数量级相差巨大的数之间的加减运算。
-
字符和字符串:尽早决定是否使用Unicode
-
C语言中的字符串:
-
警惕任何包含字符串和等号的表达式
-
字符串的长度声明为“CONSTANT+1”
-
用null初始化字符串以避免没有结束符的字符串,使用
calloc()
而不是malloc()
-
-
布尔变量:使用布尔变量来简化复杂的判断
-
数组:
-
任何情况下,确认所有的数组下标都没有超出数组的边界
-
尽量使用容器来取代数组,或者将数组作为顺序化结构来处理
-
-
自定义类型
-
使用自定义类型(通过typedef等方法)实现更好的抽象
-
给所创建的类型取功能导向的名字,避免使用那些代表了计算机数据类的类型名(如BigIngeger
-
, LongString等)。
第13章 不常见的数据类型
-
指针:
-
把指针的操作限制在子程序或类里面。比如通过
NextLink()
,PreviousLink()
等方法代替直接操作指针。 -
指针的声明和定义放在一起(一行)。
-
在与“指针分配”相同的作用域中删除指针。
-
在使用指针之前检查指针。
-
用额外的指针变量来提高代码清晰度,避免类似
pointer->next->last->next
等使用指针的方法 -
在删除或者释放指针之后把它们设为空值(null)
-
-
全局数据:
-
仅在确实需要的使用使用全局数据(首先把每一个变量设置为局部的,仅当需要是再设置为全局的)
-
全局数据应该让人一看便知,如果使用了全局数据,就公开地使用
-
用访问器子程序(Access Routines)来取代全局数据
-
根据全局数据的功能,把全局数据分为不同的模块(包、类)
-
用
static
关键字或者它的等价物来声明该数据,确保该数据只有单一实例 -
确保对一项数据的所有访问都发生在同一个抽象层上
-
-
文章参考:https://blog.csdn.net/gaopenghigh/article/details/50285363