Large-Scale C++ Software Design

John Lakos

出版时间

1996-07-20

ISBN

9780201633627

评分

★★★★★
书籍介绍
这本书最锋利之处,在于它把C++程序员的注意力从“逻辑设计”硬拽到了“物理设计”上——不是对象之间如何协作,而是头文件之间如何相互牵连、编译如何被拖垮。Lakos反复强调:依赖不会因为你把实现细节挪到类末尾就消失,它只是被藏了起来,却在编译时依旧生效。读者印象最深的,是那个朴素却有效的策略:多增加一层间接,往往就能化解纠缠。它适合那些被“每次改一行代码都要等十分钟重编整个工程”折磨的人,也适合愿意直面“无谓#include如何拖慢构建”这一隐蔽成本的工程师。当然也有声音嫌它过时,但正因其不追逐新潮,反而逼你回到C++工程里最基础、最易被忽视的耦合问题上。
AI导读
核心看点
  • 聚焦C++大型项目的物理设计与组件划分
  • 详解头文件管理与编译依赖优化策略
  • 通过代码组织降低耦合提升系统可维护性
读者共识
  • 内容极具实战价值,是大型项目必读
  • 有效解决头文件依赖导致的编译瓶颈
  • 部分读者认为版本较老但思想依然经典
精彩摘录
  • "定义:一个声明将一个名称引入一个程序;一个定义提供了一个实体(例如,类型、实例、函数)在一个程序中的惟一描述。 一个声明就是一个定义,除非: 它声明了一个没有详细说明函数体的函数; 它包含一个 extern 定义符并且没有初始化函数或函数体; 它是一个包含在一个类定义之内的静态类数据成员的声明; 它是一个类名声明; 它是一个 typedef 声明 一个定义就是一个声明,除非: 它定义了一个静态类数据成员; 它定义了一个非内联成员函数。"
  • "有些人会设法把成员函数分组为 get/set 对,如图 1-6 所示。对某些用户来说,这种风格是概念误导的结果,认为一个对象不过就是一个有数据成员的公共数据结构,每一个数据成员必须既有一个“get”函数(访问函数)又有一个“set”函数(操纵函数)。这种风格本身可能(有时候)会阻碍真正封装接口的产生,在真正封装的接口中,数据成员没有必要透明地反映在对象的行为中。"
  • "最后,还有在哪里放置数据成员的问题。完全封装好的类没有公共数据。从逻辑角度来看,数据成员只是类的实现细节。因此,许多人都愿意把类的实现细节(包括数据成员)放在类定义的末尾,如图 1-7所示。"
  • "虽然这个组织对于不成熟的客户来说可能更具可读性,把实现细节藏在类定义末尾的尝试掩饰了它们并未被隐藏的事实。在头文件中实现细节的存在会影响编译时耦合的程度,这种耦合不会因为在类定义中重新放置这些细节就简单地消失。 因为本书要研究物理的和组织的设计问题,我们始终把头文件中的实现细节放在公共接口的前面(部分原因是要强调它们的存在)。在第 6 章中,我们会讨论像这样的实现级的混乱如何才能被整个地从一个头文件中移走,从而确实对客户隐藏。"
  • "每次你增加一个特征去取悦一个人,你就扰乱和潜在地骚扰了你的客户库的其他人。曾经发生过这样的事情:原本是轻量级和很有用的类,经过一段时间后变得过于臃肿,不但不能做好每件事情,而且毫不夸张地说,它们已经变得每件事情都做不好了。"
  • "一个大型的C++程序通常会比同样的C程序有更多的头文件。一个文件包含不必要的头文件,是造成C++中过多耦合的原因。不管这些不必要的头文件是否会用到,过多的包含伪指令(#include),不仅会增加编译时的开销,而且也可能增加由于较低层次上改变了系统而必须重新编译整个程序的可能性。 如果忽略编译时依赖,那么有可能使得系统中每一个编译单元几乎包含每一个头文件,最终使整个工程项目编译变得跟爬行一样慢,这样会随着项目规模暴增。"
  • "尽量别把typdef这样的类型定义放到类外,尽量放到类内,否则维护者不好找其定义。这样一来,声明新类型就可以:className::NewType object了。 遵循以上规则,就可以使冲突降到最低,同时使得在大系统中寻找逻辑实体更加容易。"
  • "好的物理设计不仅仅是被动地决定系统的现有逻辑实体应如何划分。物理设计常蕴含要支配逻辑设计的输出。一个好的物理设计是一个没有循环的图。小项目物理设计不太重要,但是大型项目,物理设计往往是成功的关键。"
用户评论
软件构架
关于软件中的依赖。
有点老了。
影响深刻的一句: A variety of problems can be solved by adding an extra level of indirection.
应用软件编程方法来解决工程问题的逻辑思维能力、实际应用软件的编程开发能力。 课程内容包括:常用数据结构(数组、链表、队列、堆栈、树结构、图结构)的逻辑结构、物理结构、操作方法;基本算法(排序、查找)的类型、实现原理与应用;数据库基本理论与技术(数据库原理、类型;关系型数据库的应用);软件工程理论与实践(软件工程原理;应用软件的开发过程;设计、编码、测试方法)、面向对象的编程方法(原理、应用)。
求书
收藏
全部深度解读 →主题书单高分榜最近更新