第十三章 不常见的数据类型

结构体

使用结构体的理由:

  • 用结构体来明确数据关系;
  • 用结构体简化对数据块的操作;
  • 用结构体来简化参数列表;
  • 用结构体来减少维护。

指针

使用指针的一般技巧

正确地使用指针要求程序员采用一种双向策略。第一,要首先避免造成指针错误;第二,在编写代码之后尽快检测出指针错误。

  • 把指针操作限制在子程序或类里面;
  • 同时声明和定义指针;
  • 在与指针分配相同的作用域中删除指针;
  • 在使用指针之前删除指针;
  • 先检查指针所引用的变量再使用它;
  • 用狗牌字段来检测损毁的内存;
  • 增加明显的冗余;
  • 用额外的指针变量来提高代码的清晰度;
  • 简化复杂的指针表达式;
  • 画一个图;
  • 按照正确的顺序删除链表中的指针;
  • 分配一片保留的内存后备区域;
  • 粉碎垃圾数据;
  • 在删除或者释放指针之后把它们设为空值;
  • 在删除变量之前检查非法指针;
  • 跟踪指针分配情况;
  • 编写覆盖子程序,集中实现避免指针问题的策略;
  • 采用非指针技术。

C指针

C语言指针使用技巧:

  • 使用显式指针类型而不是默认类型;
  • 避免强制类型转换;
  • 遵循参数传递的星号规则;
  • 在内存分配中使用sizeof()确定变量的大小。

全局数据

全局数据可以在程序的任何位置访问。使用全局数据风险比使用局部数据大,通过一些子程序来访问数据很有用。

与全局数据有关的常见问题

  • 无意间修改了全局数据;
  • 与全局数据有关的奇异的和令人激动的问题;
  • 与全局数据有关的代码重入问题;
  • 全局数据阻碍代码重用;
  • 与全局数据有关的非确定的初始化顺序事宜;
  • 全局数据破坏了模块化和智力上的可管理性。

使用全局数据的理由

  • 保存全局数据;
  • 模拟具名常量;
  • 模拟枚举类型;
  • 简化对其常用的数据的使用;
  • 消除流浪数据。

只有万不得已时才使用全局数据

  1. 首先把每一个变量设置为局部的,仅当需要时才把变量设置为全局的;
  2. 区分全局变量和类变量;
  3. 使用放问题子程序。

用访问器子程序来取代全局数据

使用访问器子程序是实现抽象数据类型和信息隐藏的一种核心方法。

  • 使用访问器子程序的优势;
    • 你获得了对数据的集中控制;
    • 你可以确保对变量的所有引用都得到了保护;
    • 你可以自动获得信息隐藏的普遍益处;
    • 访问器子程序可以很容易地转变为抽象数据类型。
  • 如何使用访问器子程序;
    • 要求所有代码通过访问器子程序来存取数据;
    • 不要把你所有的全局数据都扔在一处;
    • 用锁定控制对全局变量的访问;
    • 在你的访问器子程序里构建一个抽象层;
    • 使得对一项数据的所有访问都发生在同一抽象层上。

如何降低使用全局数据的风险

  • 创建一种命名规则来突出全局变量;
  • 为全部的全局变量创建一份注释良好的清单;
  • 不要用全局变量来存放中间结果;

更多资源

Maguire《Writing Solid Code》

Meyers《Effictive C++》

核对表:使用不常见的数据类型的注意事项

结构体

  • [ ] 你使用结构体而不是使用单纯的变量来组织和操作相关数据吗?
  • [ ] 你考虑创建一个类来代替结构体吗?

全局数据

  • [ ] 所有的变量是否都是局部的或者是类范围的?除非绝对有必要才是全局的?
  • [ ] 变量的命名规则能把局部数据、类数据和全局数据区分开吗?
  • [ ] 你对所有的全局变量都加以文档说明吗?
  • [ ] 避免使用伪全局数据,即被四处传递且包含有杂乱数据的巨大对象吗?
  • [ ] 用访问器子程序来取代全局数据吗?
  • [ ] 把访问器子程序和数据组织到类里面吗?
  • [ ] 访问器子程序提供了一个在底层数据类型实现之上的抽象层吗?
  • [ ] 所有相关的访问器子程序都位于同一抽象层吗?

指针

  • [ ] 把指针操作隔离在子程序里吗?
  • [ ] 指针引用合法吗?或者说指针有可能成为空悬指针吗?
  • [ ] 代码在使用指针之前检查它的有效性吗?
  • [ ] 在使用指针所指向的变量之前检查其有效性吗?
  • [ ] 指针用完后被设置为空值吗?
  • [ ] 就可读性而言,代码用了所有需要使用的指针变量吗?
  • [ ] 链表中的指针是按正确的顺序加以释放的吗?
  • [ ] 程序分配了一片保留的内存后备区域,以便在耗尽内存的时候能够优雅地退出吗?
  • [ ] 是不是在没有其他办法可用的情况下最终才使用指针的?

要点

  • 结构体可以使程序更简单、更容易理解,以及更容易维护;
  • 每当你打算是用结构体的时候,考虑采用类是不是会工作得更好;
  • 指针很容易出错。用访问器子程序或类以及防御式编程实践来保护自己的代码;
  • 避免使用全局变量,不只是因为它们很危险,还是因为你可以用其他更好的方法来取代它们;
  • 如果你不得不使用全局变量,那么就通过访问器子程序来使用它。访问器子程序能为你带来全局变量所能带来的一切优点,还有一些额外好处。
原文地址:https://www.cnblogs.com/liam-ji/p/11528641.html