Large-Scale C++ Software Design

John Lakos

出版时间

1996-07-20

ISBN

9780201633627

评分

★★★★★
书籍介绍

Developing a large-scale software system in C++ requires more than just a sound understanding of the logical design issues covered in most books on C++ programming. To be successful, you will also need a grasp of physical design concepts that, while closely tied to the technical aspects of development, include a dimension with which even expert software developers may have little or no experience. This is the definitive book for all C++ software professionals involved in large development efforts such as databases, operating systems, compilers, and frameworks. It is the first C++ book that actually demonstrates how to design large systems, and one of the few books on object-oriented design specifically geared to practical aspects of the C++ programming language. In this book, Lakos explains the process of decomposing large systems into physical (not inheritance) hierarchies of smaller, more manageable components. Such systems with their acyclic physical dependencies are fundamentally easier and more economical to maintain, test, and reuse than tightly interdependent systems.In addition to explaining the motivation for following good physical as well as logical design practices, Lakos provides you with a catalog of specific techniques designed to eliminate cyclic, compile-time, and link-time (physical) dependencies. He then extends these concepts from large to very large systems. The book concludes with a comprehensive top-down approach to the logical design of individual components. Appendices include a valuable design pattern "Protocol Hierarchy" designed to avoid fat interfaces while minimizing physical dependencies; the details of implementing an ANSI C compatible C++ procedural interface; and a complete specification for a suite of UNIX-like tools to extract and analyze physical dependencies. Practical design rules, guidelines, and principles are also collected in an appendix and indexed for quick reference. 0201633620B04062001

John Lakos在Mentor Graphics公司工作。该公司编写的大规模C++程序比大多数其他公司要多,并且是首先尝试真正的大规模C++项目的公司之一。Lakos从1987年起就一直使用C++进行专业编程,并于1990年在哥哥伦比亚大学开设了面向对象编程方面的研究生课程。

AI导读
核心看点
  • 聚焦C++大型项目的物理设计与组件划分
  • 详解头文件管理与编译依赖优化策略
  • 通过代码组织降低耦合提升系统可维护性
适合谁读
  • 从事大型C++系统开发的资深工程师
  • 面临编译缓慢与耦合困扰的软件架构师
  • 希望深入理解C++物理设计的专业读者
读前提醒
  • 建议结合英文原版阅读以避开翻译障碍
  • 重点关注组件化设计与头文件组织章节
  • 需具备扎实的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.
应用软件编程方法来解决工程问题的逻辑思维能力、实际应用软件的编程开发能力。 课程内容包括:常用数据结构(数组、链表、队列、堆栈、树结构、图结构)的逻辑结构、物理结构、操作方法;基本算法(排序、查找)的类型、实现原理与应用;数据库基本理论与技术(数据库原理、类型;关系型数据库的应用);软件工程理论与实践(软件工程原理;应用软件的开发过程;设计、编码、测试方法)、面向对象的编程方法(原理、应用)。
收藏