阅读Amazon和ACCU的评论表明,John Lakos 的书,大型 C++ 软件设计可能是模块化的罗塞塔石碑。
与此同时,这本书似乎真的很稀有:没有多少人读过它,也没有盗版电子版在四处飘荡。
所以你怎么看?
我读过它,并认为它是一本关于大型 C++ 项目的一些实际问题的非常有用的书。如果您已经阅读了很多有关 C++ 的内容,并且对物理设计及其含义有所了解,那么您可能不会在本书中找到那么多非常“新”的内容。
另一方面,如果你的构建需要 4 个小时,而你不知道如何缩减它,那么获取一份副本,阅读它,然后全部接受。
您将很快开始编写物理上更好的代码。
[编辑] 如果您想从某个地方开始,并且无法立即获得这本书,我发现即使在阅读了大型 C++ 设计之后,关于物理结构的 Games From Within 系列也很有用。
有趣的是,“More C++ Gems”包含 Lakos 的书的缩短版(到 88(!)页),也可以在 Google 图书上在线浏览(完全,我相信,因为它属于本书的前半部分).
所以,享受每个感兴趣的人:)
Lakos 曾为制作 EDA 软件的 Mentor Graphics 工作。他参与了用 C++ 构建 EDA 软件,他们希望有效地使用 C++(“开销不超过 C 代码的 5%”),并整理出如何在早期工作站上构建软件,而这些软件确实需要很长时间才能编译一个大型 C++ 应用程序。
这本书读起来很不错——它讨论了各种各样的话题,而拉科斯确实知道他的东西。他确实来自必须从 C++ 编译器中获取高效代码的背景,以及如何设置 C++ 程序以使其可维护并合理快速地编译和链接。
我认为Lakos有很多见解,我建议您阅读它。然而,在模板等功能被广泛使用之前,它是“传统的”C++。我的副本不出售;^)
我认为这本书在 1990 年代后期读起来很不错。那时它已经过时了,现在与 1950 年代的电话簿一样重要。
我与 Lakos 一起工作了几年,他试图实施这些想法。我也有我用大约 2000 个源文件构建的现代 C++ 项目——规模足够大,从那以后我又构建了几个。使用诸如冰淇淋之类的程序可以通过并行分布式构建轻松减少构建时间。每个编译器都会缓存打开的标头——只有通过做一些真正令人发指的事情,任何现代构建工具(如 scons)才能扩展到数千个翻译单元,而无需做任何真正特别的事情,包括测试在内的构建时间需要几分钟才能完成。
将您的库接口限制为一些“词汇类型”(与 OO 概念的含义不同,他的意思是只使用 Int、float、string、char 和其他一些我不记得的)是非常糟糕的扩展建议任何事物。您的构建将寻找类型不匹配,您不希望在运行时这样做只是为了更容易编写 make 文件。
这就是本书的主要内容——我如何编写 C++ 以便它与 1993 年的工具一起使用?此外,这本书描述的 Mentor Graphic 项目在所有人看来都是一场灾难。甚至这本书本身也暗示了这一点。
大规模 C++以源代码形式交付——这些是“物理依赖项”,而不是链接库(本书从未提及其他更重要的依赖项,如数据库、套接字、处理器架构等)。
这本书充满了听起来不错的想法,但在实践中还有更好的方法来扩大规模。如果您想研究大型 C++ 库,请查看Boost或Xerces,看看它们做了什么。他们确实是在实施大型项目,而不是写关于它们的文章。
它有点过时了(实际上它在编写时已经过时了)。如果我没记错的话,其中很多是关于减少您现在可能使用模板所做的依赖关系。
尽管这可能是大型项目中要学习的课程之一,但您通常不会使用尖端功能和工具。
是的,在某些方面,这本书有点过时,其中一些是特定于 C++ 的。尽管如此,它还是为处理大型程序中的复杂性和耦合提供了许多有用的建议,而且他的大部分建议适用于任何面向对象的语言。我也发现它非常可读。
如果你能找到一份副本,我相信你会发现它值得一读。它在我的十大编程书籍列表中。
John Lakos 的“Large-Scale C++ Software Design”是一个发人深省(但通常被忽视)的宝石吗?
是的。
这是一本优秀的书,从历史的角度来看是一本重要的书。
请注意,要实施本书中描述的实践,您需要在团队中遵守纪律并达成一致。这里有几点需要注意:
Lakos 对他所谓的“组件”和“包”有精确的定义。这些是大规模设计的关键。但是,它们需要遵守有关如何命名源文件和头文件以及包含它们的顺序的约定。遗憾的是,大多数人(包括那些引用 Lakos 的人)很少遵循这些惯例。
这本书都是关于 C++ 的,但这些概念的适用范围更广。然而,由于 C++ 是如此复杂的语言,本书的很大一部分内容是教你如何有效地使用 C++。如果您能克服这一点,即使您使用其他语言,您实际上也会发现它很有用。
一些关于使用“名称空间”的规定现在可能被认为是有争议的。许多人认为名称空间应该在 C++ 中以有限的方式使用。
我很久以前读过它,但我记得从中得到了很多;尽管正如 MadKeithV 指出的那样,那可能只是我当时知道的少;)
当然,从“我如何减少构建所需的时间”的角度来看,它有很多有用的东西,尤其是在减少编译时间依赖方面,尽管考虑到使用了多少模板,其中一些可能不再相关,甚至是可能的这些日子。
不,你也不能得到我的副本 :)