书中第六章 隔离。 主要在撰述什么须要定义在头文件?什么应当移到编译单元中?

核心仍然是先区分接口定义与实现细节。实现细节的改变会导致客户代码的又一次编译,从逻辑上也表示与客户代码间可能存在着强耦合。

实现细节与隔离

主要考察下面实现细节。它们会在接口中引入实现细节。也是须要考虑进行隔离的内容:

  1. 继承
  2. 分层

    简单的说就是类的成员中有还有一个类的实例时,如Foo mFoo. 这个类就会依赖于Foo的定义。而转为持有地址时,即将关系从HasA改为HoldA时,就不存在这个问题。也就是定义为Foo* mFoo;或Foo& mFoo; 这也是Google C++ Coding Style以前就降低头文件依赖建议过的方式,后来则去掉了这项建议,改为:”不要为了使用前置声明,将成员变量改为指针类型”, 由于它反而添加了逻辑上的复杂度,比方额外的判空处理。
  3. 内联函数
  4. 私有成员
  5. 保护成员
  6. 编译器生成的默认实现函数,如拷贝。
  7. 包括指令,即头文件的包括。
  8. 默认參数
  9. 枚举

    在一些大型项目中。一些存有基本枚举类型的头文件。最后变成没人敢改,而更愿意新增头文件。事实上还不如放到详细的域或类中定义。

后面作者对各个细节推荐一些手法。相对照较简单。后面则介绍了几个经常使用手法:

  1. 协议类(接口类)
  2. Opaque Pointer和PIMPL
  3. Wrapper (封装器), 即引入中间层。

过程接口

考虑到上层代码对底层的操作需求。作者提出了过程接口(The Procedural Interface),能够结合常见的API来理解,它是一组函数的集合。出如今组件的顶部,并将功能的一个子集暴露给用户。

作者概括了编程接口的要求:

  1. 接口必须提供必要的功能来操纵底层系统。

  2. 接口一定不能暴露专属的实现细节。
  3. 底层组织的变化必须与client程序相隔离。
  4. 与该接口相关的开销一定不能过大。

在实现方式上,以面向对象的Wrapper来实现这种需求最佳的。而过程接口将针对无法简单使用独立的封装类来实现的系统。

事实上一个大型系统也是能够拆分出不同的领域。分别以Wrapper的形式来实现的。能够对照WebView的接口。以及Blink中的web层次。

书中主要是探讨了针对所持有对象的操作。

上面也提到的Opaque Pointer。还特别说明了Handle(句柄)模式来管理动态分配的对象。

一个过程接口既不是面向对象的也不是特别美观。但它确有一个非常大的长处:过程接口总是能够用于将大系统的组织与client程序相隔离–即使在设计的早期阶段并没有考虑这种接口。

隔离或不隔离

隔离会引入一些开销。选择是否进行隔离的常见原因包括:

  1. 暴露 (被使用的范围。或者扇入)
  2. 訪问数据的性能
  3. 创建对象的性能
  4. 开发成本 (在没有明白理由的情况强行隔离。会引入额外的开发工作)
  5. 组件的数量 (可能会新增组件,添加维护成本)
  6. 组件的复杂性 (引入新的复杂度。导致难以理解和维护)

作者提供两套经验值供决策时參考(中文编译的图表不太严谨,第5章有图标错。这里明明是两个表,却合成了一个表。)。

訪问的相对开销

  1. 内联函数传递值 : 1
  2. 内联函数传递指针 : 2
  3. 非内联函数,非虚函数 : 10
  4. 虚函数机制 : 20

创建相对于单独分配的成本

  1. 自己主动 (栈上) : 1.5
  2. 动态 (堆上) : 100+

作者最后讨论隔离决策时,建议是否进行隔离取于被使用的范围,性能要求的高低,以及成员函数的大小(是否轻量级)。性能要求高不要隔离。轻量级的实现也不须要隔离。

事实上就是隔离本身会引入开销。假设为了隔离引入的开销过式,或者引入更不稳定的复杂度。就不要急于隔离。而对于大型、广泛使用的对象则要尽早隔离。

大型项目开发: 隔离 (《大规模C++程序设计》书摘)的更多相关文章

  1. CakeDC(cakephp company)Git workflow--适合于较大团队大型项目开发

    CakeDC Git workflow是一个项目开发和版本发布的工作流,在这个工作流程中开发和版本发布周期是基于几个关键阶段(key phases): Development: 所有活跃的开发活动都由 ...

  2. Vue/Egg大型项目开发(一)搭建项目

    项目Github地址:前端(https://github.com/14glwu/stuer)后端(https://github.com/14glwu/stuer-server) 项目线上预览:http ...

  3. Vue/Egg大型项目开发(二)数据库设计

    项目Github地址:前端(https://github.com/14glwu/stuer)后端(https://github.com/14glwu/stuer-server) 项目线上预览:http ...

  4. 在大型项目上,Python 是个烂语言吗

    Robert Love, Google Software Engineer and Manager on Web Search. Upvoted by Kah Seng Tay, I was the ...

  5. PHP开发大型项目的一点经验

    一.变量 最好是把所有的变量存储在一个数组中,这样在程序的开发中可以带来很多的方便,特别是当程序很大的时候.变量的命名就当适合自己的习惯,不管是用拼音还是英语,至少应当有一定的意义,以便适合记忆.变量 ...

  6. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-2.中大型公司里面项目开发流程讲解

    笔记 2.中大型公司里面项目开发流程讲解     简介:讲解一个项目如何从零到上线,经历过怎样的步骤和流程                  1.一个中大型项目的开发流程,从需求调研到项目上线    ...

  7. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习

      C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...

  8. Python不能用于大型项目?关于Python的10大误解

     语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pyt ...

  9. Python不能用于大型项目?人们对Python的十大误解

    Python 类型系统的特点是拥有强大.灵活的类型操作. 维基百科上对此作出的阐述. 而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系 ...

随机推荐

  1. ACM_巧克力

    Chocolate,Chocolate Time Limit: 2000/1000ms (Java/Others) Problem Description: 都说发神喜欢吃巧克力,有一次发神徒弟买了一 ...

  2. ACM_最短网络(最小生成树)

    Problem Description: Farmer John has been elected mayor of his town! One of his campaign promises wa ...

  3. [转]Linux定时任务Crontab详解

    转自:http://blog.chinaunix.net/uid-7552018-id-182133.html 今天做了个数据库的备份脚本,顺便系统得学习一下Linux下定时执行脚本的设置.Linux ...

  4. C# Autofac 出现 尝试创建“XXController”类型的控制器时出错。请确保控制器具有无参数公共构造函数 错误解决方案

    出现以下错误: 总结解决方案: 本项目采用构造函数方法进行依赖注入,由于个人原因在业务层相互注入了接口,导致交叉:报错

  5. 个人作业——Alpha项目测试

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnbl ...

  6. Android常用的Dialog对话框用法

    Android的版本有很多通常开发的时候对话框大多数使用自定义或是 Google提供的V4, V7 兼容包来开发保持各个版本的对话框样式统一,所以这里使用的是V7 包里的AlertDialog. im ...

  7. 关于用友 U8-UAP二开的一些事

    这是关于一个刚刚接触用友U8的二次开发的一些小心得. 首先就是用友二开的论坛,http://u8dev.yonyou.com/ 当然这个论坛做得不怎么样,提出了好几个问题,都没有回复的. 以下是关于二 ...

  8. Angular——流程控制指令

    基本介绍 (1)ng-repeat,类似于for循环,对数组进行遍历 (2)ng-switch on,ng-switch-when,类似于switch,case 基本使用 ng-repeat < ...

  9. html5——多媒体(三)

    自定义进度条 1.video标签是内联块,可以设置宽高,但是需要用大盒子将其包裹起来进行定位 2.小盒子设计成进度条样式,并进行定位 3.进度条样式中的特殊按钮可以用web字体 4.通过点击实现视频的 ...

  10. (转)Hibernate框架基础——cascade属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52760010 我们以部门和员工的关系为例讲解一对多关联关系映射时,删除部门时,如果部门有关联的 ...