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


    结构体

    使用结构体的理由:

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

    指针

    使用指针的一般技巧

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

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

    C指针

    C语言指针使用技巧:

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

    全局数据

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

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

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

    使用全局数据的理由

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

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

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

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

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

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

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

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

    更多资源

    Maguire《Writing Solid Code》

    Meyers《Effictive C++》

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

    结构体

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

    全局数据

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

    指针

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

    要点

    • 结构体可以使程序更简单、更容易理解,以及更容易维护;
    • 每当你打算是用结构体的时候,考虑采用类是不是会工作得更好;
    • 指针很容易出错。用访问器子程序或类以及防御式编程实践来保护自己的代码;
    • 避免使用全局变量,不只是因为它们很危险,还是因为你可以用其他更好的方法来取代它们;
    • 如果你不得不使用全局变量,那么就通过访问器子程序来使用它。访问器子程序能为你带来全局变量所能带来的一切优点,还有一些额外好处。
  • 相关阅读:
    Android开发(十五)-Service和BroadcastReceiver
    Android开发(十四)-ContentProvider数据共享
    Android开发(十三)-图形与图像处理
    Android开发(十二)-Android应用资源
    Android开发(十一)-Intent和IntentFilter通信
    Android开发(十)-Activity和Fragment
    Android开发(九)-事件机制
    模拟面试
    二叉堆
    面试
  • 原文地址:https://www.cnblogs.com/liam-ji/p/11528641.html
Copyright © 2020-2023  润新知