原则31:将文件间的变异依存关系降至最低

这个原则着重讲述的是编译的依存关系,篇幅很长,理解起来也比较费劲。
这个原则是针对什么问题而提出来的呢?有的时候你在一个大工程里,你就修改了某个类中的一小部分实现,甚至就是一条语句,结果整个工程各种莫名其妙的错误出现了,然后你崩溃了。
作者说这是由于没有把接口从实现中分离造成的,那这又是什么意思呢?从作者所举的例子Person类来看,它的私有成员里面有很多其他类的对象,而这些对象又是Person类中某些函数的参数,如下图所示:


1.png

从这图可以看出作者所说的实现也就是私有成员中所列的这些东西,而它们又是其他类的对象。那既然用到了其他类那必须要引用其他类的头文件啊,就是使用#include命令。这样的话就形成了一定的编译依赖关系,这名词还是很有学术气息的。那形成编译依赖关系又能怎么样?那可以用一句话来概括——牵一发而动全身。
作者接着引用了一种惯常的思维,既然你说不要把实现和接口掺和在一起,那你就不实现呗,让那些被引用的类也只不过是类的声明而已不就得了,让后把它们一块放在命名空间里面。这种类的声明叫做前置声明。这样做的好处就是实现不会动,会动的只能是接口,那么用户只需要在接口被改动之后重新编译即可。
不过上面这种办法纯属扯淡!因为编译器必须知道编译期间某个对象的大小,编译器只能通过类的定义才能知道这个对象需要多大空间,现在你就给了一个声明,编译器哪知道那个对象到底需要多大地方?!在这一点上C++和Smalltalk,Java还是有区别的,因为后两者只提供指向类的指针,而指针大小是固定的。
于是乎得出了一种常用的设计方式,那就是接口和实现分离,再具体点就是一个类提供接口,另一个类提供实现。而接口类和实现类中连接的纽带就是一个作为指向实现类的私有智能指针。这种设计一般被称为pimpl(pointer to implementation)。
它体现的思想是使用生命的依存性去替换实现的依存性,这是编译依存性最小化的本质体现。
很奇怪,你仅仅是声明一个类,你就能用这个类定义一个形参并且放在函数形参列表中。其实还是那种情况,你只需要在用到定义的时候才真正去暴露类的定义,函数也是同理,所以你可以看到某个头文件中有很多声明式包括函数的和类的。那么你也会看到我经常把类和函数的声明的放到头文件中去,而把实现放到CPP中去。这样做的目的是降低与实现文件之间的编译依存关系。
作者还提到有些泛型类也是采用实现和声明分离的设计方式的,不过要使用关键字export,可是这一关键字已经很少出现在当代编译器当中了,所以我所见到的泛型都是实现和生命合而为一的。
从下面这个代码段可以看出在构造函数的形参列表中类的对象是可以new的,如下图所示:



另一种pimpl实现手段是写一个C++的interface,里面是virtual函数和pure virtual虚拟函数,当然interface里面可以含有成员变量,但是人们通常不那么做,因为就好像它的名字那样interface只是接口,而接口是供别人调用用的,所以它里面只需要函数足矣。Interface肯定是要被继承的,否则它啥用都没有,尤其是内涵pure virtual的interface。这个实现的任务就交给了它的子类,在这个interface中有那么一个函数,它的作用是返回一个已经实例化的对象的指针。这个函数被称为factory函数或者virtual构造函数,当然后者并不是说构造函数可以virtual。这些做法都是基于内联实现的。
上述这些做法多多少少会带来效率的低下。
总结一下作者的思想就是:
1、依赖于声明式,使用pimpl模式进行设计都会减小编译依存性。

2、头文件应该只包含声明。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容