读书频道 > 网站 > 网页设计 > 大规模C++程序设计
0.2.3 过度的编译时依赖
15-04-24    下载编辑
收藏    我要投稿   

本文所属图书 > 大规模C++程序设计

《大规模C++程序设计》由世界级软件开发大师John Lakos亲笔撰写,是C++程序设计领域最有影响力的著作之一。作者结合自己多年从事大规模C++项目的开发经验,详细介绍了大规模C++程序设计涉及的一系列概念、理论、立即去当当网订购
如果你曾经尝试过用C++开发多文件程序,那么就会知道更改一个头文件可能会引起许多编译单元重新编译。系统开发的最早期阶段,进行一次更改会迫使整个系统重新编译,这不存在多大的负担。然而,随着系统的继续开发,更改一个低级头文件的想法会变得让人越来越不愉快。不仅重新编译整个系统所需的时间在逐渐增加,编译单个编译单元的时间也在逐渐增加。我们迟早会达到那么一个临界点,这时你会因为重新编译的代价而直接拒绝修改低级类。如果这个听起来很熟悉的话,那么你可能已经有过度编译时依赖方面的


经验了。

过度编译时耦合与小型项目几乎无关,对于大型项目可能会变成支配开发时间的重要因素。图0-3显示了一个过度编译时间的常见示例:起初看似很好的想法,随着系统规模的增长就会变得糟糕。myerror组件定义了一个MyError结构体,该结构体包含所有可能错误代码的枚举。每个新添加到系统中的组件都理所当然地包含这个头文件。不幸的是,每个新的组件可能有它自己的在主列表中还没有标识出来的错误代码。



随着组件数量的增加,我们将自己的错误信息代码添加到这个列表的愿望将会减弱。我们将倾向于重用已有的错误代码,只是为了避免更改myerror.h文件,这些错误代码大致合适就可以了。最终,我们将会放弃添加新的错误代码的想法,只是返回ERROR或者WARNING,而不更改myerror.h文件。这样做的时候,我们所做的设计就是不可维护并且几乎毫无用处的了。

还有很多其他方面的原因会引起不必要的编译时依赖。一个大型的C++程序常常比等效的C程序拥有更多的头文件。一个头文件对另一个头文件不必要的包含,是造成C++过多耦合的常见来源。例如,在图0-4中,仅因为类Simulator的客户端可能发现对象的定义有用就在simulator的头文件中包含这些定义,这没有必要。这样做迫使客户端依赖于所有这些组件的编译时间,而不管实际上是否需要这些组件。过多的包含指令不仅会增加编译客户端程序的花销,而且也会增加由于在较低层次上改变系统而需要重新编译客户端程序的可能性。

忽略编译时依赖,有可能导致系统中每个编译单元都包含系统中几乎所有头文件,使编译速度慢得跟爬行一样。第一个真正的C++大型项目之一(准确点说,数千人年的工作量)是Mentor Graphics公司研发的一个CAD框架产品。最初开发者不知道有多少编译时依赖会阻碍他们的工作。即使使用我们的大型工作站网络,重新编译整个系统也要花费整整一周的时间。

图0-4中显示的simulator组件在某种程度上举例说明了组织细节的问题。尽管开发出了缓解这一问题的表面技术,但是只有当不必要的编译时依赖被消除时,这个问题才会真正得到解决。


就像链接时依赖的情况一样,也有许多特定的技术适用于消除编译时依赖。


点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站