代码大全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

posted @ 2020-10-02 00:34  第厘  阅读(82)  评论(0编辑  收藏  举报