加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 程序设计 > 正文

Item 31 减小文件之间的编译依赖

发布时间:2020-05-27 16:54:23 所属栏目:程序设计 来源:互联网
导读:C++在接口和实现之间的分离这部分工作做的不好。像下面这样的类定义,不仅指明了接口,也包含了一部分的实现细节。这将导致对实现的依赖。实现一旦改变,将增加整个的编译时间。 class Person{public:Person(const std::string name, const Date birthday, co

C++在接口和实现之间的分离这部分工作做的不好。像下面这样的类定义,不仅指明了接口,也包含了一部分的实现细节。这将导致对实现的依赖。实现一旦改变,将增加整个的编译时间。

要想编译Person,就必须要知道string、Date和Address的定义。这些定义都是通过下面那样的include来提供的:

可是,这样的include建立了Person对这些头文件的编译依赖。如果这三个头文件改变,Person就要重新编译(string是标准库,改变的机率不大,可以随便包含)。当然依赖Person的也要重编,于是产生了级联效应。
解决这个问题有两个办法:把Person变成句柄类(Handle Class)或接口类(Interface Class)。

先看句柄类:

可以看到,这个头文件不再依赖Date和Address的头文件了,所以可以放心地把Person给客户使用。
因为这个Person只是一个声明(而非定义),隐藏了实现细节,所以用户不会写出依赖内部实现的代码;当Person的实现改变时,使用的客户也不会再受波及。

这种方案的特征:两个头文件!
比如上面的Person类,就会有PersonFwd.h和PersonImpl.h两个。给客户用的只有PersonFwd.h。

再看接口类:

使用接口类,一般会在接口类里定义工厂函数(factory function),或叫作虚拟构造函数(virtual ctor),然后再从Person里派生出实体类(concrete class)。 使用接口类和句柄类的代价:运行时的速度会慢一点;内存会多一点。 句柄类:因为使用了impl指针,所以多了一点内存。这个指针要初始化,要为对象申请内存,要销毁。 接口类:有虚函数指针,要进行函数跳转。 无论是句柄类,还是接口类,都不能使用inline函数。以Person为例,PersonFwd.h里是不能出现任何函数体的。 但是因为这一点点代价就不使用句柄类和接口类了吗?答案是否定的。因为要尽量减小对客户的影响。

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读