大规模C++程序设计Large-Scale.C.._Software.Design.chs.pdf
大规模C++程序设计Large-Scale.C.._Software.Design.chs.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!http://showmecode.cn/inks/book深入C++系列深圳大学出版基金资助Arge-Scale 0++ Software Design大拟模c+程序设计美] John lakos著李师贤明仲曾新红刘显明等译忄图力当照姓http://showmecode.cn/inks/bookLarge-Scale C++ Software Design(ISBN 0-201-63362-0)John lakos.Authorized translation from the English language edition, entitled large-Scale C++Software Design, published by Addison-Wesley Longman, CapyrightoI996All rights reserved.No part of this book may be reproduced or transmitted in any form or by any means,electronic or mechanical, including photocopying, recording or by any infornationstorage retrieval system, without permission from the Publisher.CHINESE SIMPLIFIED language edition published by China Electric Power PressCopyright@2003本书由美国培生集团授权出版北京市版权局著作权合同登记号图字:0120024856号图书在版编目(c|P)数据大规模C艹+程序设计(关)勒科著;李师贤等译.一北京;中国电力出版社,2003〈深入C++系列〕IsBN7-5083-1504-9Ⅰ人..I.勒.2李..ⅢC語言一程序设计再TP312屮囚版本图书馆CI数核字(2003)第033472号贲任编辑:闫宏丛书名:深入C++系列书名:大规模¢+程序设计编著:(美) John lakes翻译:李师贤等出版发行:中国电力出版社地且:北京市三里河路6号邮政编码:100044电话:(010)8851598传真:(010)88423191印刷:北京地矿印刷厂开本:787×1092116印张:40字数:750「字版次:2003午9月北京第版印次;2003年9月第一次印刷定价:7200瓜http://showmecode.cn/inks/book作为 Mentor Graphics公司I分部的成员,我有幸与许多宫有才智的软件工程帅…起工作,共同开父了些非常大型的系统早在1985年, Mentor Graphics公司就是最早用C++开发实际的大型项日的公司之。邡时,无人畑道如何徹,也没有人预料到项目会山现这样的題——费用失控、偏离计划、可执行代码庞大、性能低劣以及令人难以置信的呂贵的开发周期,这是不成熟的开发方法不可避免的结果。许多有价值的红验都是经过痛芒的历程获得的。没有什么书可以帮助指导这种设计过稈,也从末有人在这样的规模上尝试使用面向对象设计。十年后,由于积累了大量有价值的经验, Mentor〔 Graphics公司用C++开发了数个大型钦件系统,同时也为其他人在做同样的工作时不用付出高昂代价开牌了道路。在我13年的C语言(后来转为C++)计算机辅助没计(CAD)软件开发生涯中,我多次看到了这样的情况:提前计划好总能生产出高质最、易维护的软件产品。在 Mentor Graphics公可,我一直强调要从一开始就确保质量,要把质量作为设计过程中一个必不可少的部分。1990年我在 Columbia大学开设了一门」名为“面向对象设计与编程”的研究生课程。从1991年起,作为这门课程的老师,我有机会将我们在 Mentor graphics公司获得的许多经验传授给学生,这些经验是我们在从事工业化软件的开发过程中取得的。来自数百个研究生和专业程序员的提问和反馈信息,帮助我明确了很多重要的機念。本书是这些经验的总结。据我所知,这是第一本指导开发大型C艹项目的书,也是第一本针对大型C+项月中出现的质量问题的书。我希望这些信息在读者的作中有用,就像在我的工作中所起的作用一样读者对象本书是专为有纶验的C++软件开发者、系统设计师、前振的软件质量保证人员等编写的。內书尤其适合于那些从事大型软件开发1作(如数据库、操作系统、编译程序和框架冫的人员阅读用C艹丌发一个大型的软件系统,需要精通逻辑设计问题,在大多数有关C+程序设计http://showmecode.cn/inks/book的书中都包括了这些问题。若要进行有效然设计,还要求掌握物理设计概念,这些概念虽然与开发的技术方面紧密联系,但是其中有些方面即便是软件开发专家也可能经验很少或者没有经验本书提出的多数建议也适用于小型项目。我们开发项冂吋通常是先从小型项目开始,然后才开发更大更县挑件的项目。一个特定项的范围经常会扩展,因而始时是小项目,后来就变成大项目了。佀是,在大型项日中忽略好的策略所造成的直接后果,比在较小型颂日中要严重得名。本书将扃层设计概念与特定C+编程细节结合起来,以满足下面两个需求(1)一本面向对象设计的书,尤其侧重于C+编程语言的实践方面2〕·本C+程序改计的书,描述如何使用C++编程藷言来发非常大型的系统请别弄锖,这是一本高级别的书。本书既不适用于从头开始学习C+语法,也不适合于用来学未曾掌握的C+语言细节,这是一本教你如何使用C++的全部功能去开发超大型系统的书。简言之,如果读者认为自己C+掌握得很好,但想更多地学习如何使用C++语言去有效地开发大型项臼,那么这本书就是为你所写的。正文中的例子多数人通过例子来学习。通常,我们提供说明现实世界设计的例了,避免那些只说明某点问越而住设计的其他方面暴露出错误的例子:也避免那些只说明语言的细节但没有其他意义的例子。除非特别指出,本书正文的所有例子都表示“好的设计”。因此,前儿章的例子与整木书所介绍的所自策略一致。这种方法的不足之处是:读者春到示例代码与自亡以往所见的代码不一致,但不能准确地知道为什么会这样。作者认为,若能利用书中所有的例子作为参考,就能弥补这个不足对于这种策路有两个显著的例外:注释和包前缀( package prefix)。本书正文中的许多例子的释,为节省篇幅简单地省略了。有些地方虽然有注释,但也是少而精的。但是,这是处要求读者“按我说的做,而不是按我做的那样做”的地方—至少在本书中如此。笔者在实践中编写接口时会当即非常仔细地添加注释,而不是事后再加注释,这点读者可以放心。第二个例外是,书中前面几个例子中的包前缀的使用不致。在大型项目环境中需要包前缀,但是开始时,包前缀不便使用,需要一段时间适应。笔者选择先不使用注册的包前缀,住第7章正式提出之后手使用,以便能专注于介绍其它重要的基础内容。当举例说明设计中的功能时,为了文字的简洁,在例子中使用了内联函数。在止文中多次说明了这种情况。由于本书的大部分内容与如何组织的问题(如,什么时候内联)有关,http://showmecode.cn/inks/book所以笔者的倾向是在例子中避免使用内联函数。如果一个函数被声明为“ inline”,肯定有其止当的理由,而不以是为了表小方便用C++开发大型系统是系列的T程方法的折衷,几乎没有绝对。用“从不”或“总是”这样的词语来陈述是很吸引人的,但这样的训语只能用来对内容进行简单的描述。对于那些我希望将来阅读本书的C++程序员来说,这样总括性的陈述会引起异议一一事实确实如此为了避免陷入这种局面,我会在中明什么是(几乎是)肯定正确的同时,为例外的情况提供脚释或线索日前,有多种流行文件扩展名,用于区别C+头文件和C+实现文件。例如头文件扩展名: h. hh++hhpp实现文件扩展名: c Cxx C.++ccpp在所有的例子,我们都使用h扩展名来标识C++头文件,使用c扩展名来标识C++实现文件。在本书中,我们会频繁地称头文件为h文件,称实现文件为c文件。最后需要说明的是,本书正文中的所有示例都在 SUN SPARC工作站的 CFRONT30(SUN版忄)上编译过并校验过语法;同时也在HP00系列机的自备C++编译器卜进行过上述测试。当然,出现的仟何错误都能由作者负全责。阅读导航本书包含很多内容。不是所有的读者都有着相同的知识背景。所以我在第1章中提供了些其本的(但却是必备约)知识以铺平学习道路。专业的C+程序员可以略过这部分或者需要的话简单地参考一下。第2章包含了些某本的软件设计规则,我希望每一位有经验的开发人员都能够很快地认可第0草:引言概述大型C+软件的开发人员所面临的问题。第I部分:基础知识第1章:预备知识回顾了基本语言信息、般设计模式以及本书的文体惯例。第2章:基本规则介绍了在任何C+-项目屮都应该遵循的重要设计经验。后面的内容分为两大部分。前一部分题为“物理设计概念”,介绍了…系列与大型系统物理结构相关的重要论题。这些章节中的内容(第3-7章)集中在编程方面,对许多读者来说将是全新的,并且只精选了适合于大型程序设计的内容。这部分的论述是“白底向上”的,每章的叙述都承接了前一章的内容。第2部分:物理设计概念第3章:组件http://showmecode.cn/inks/book介绍个系统的基础物理构筑模块第物理层次结构阐述建立组件层次结构的重要性,这些组件在物理上没有循坏依赖,便于测试、维护和重用。第5章:层次化减少连接时依赖的特殊技术。第6章:绝缘减少编详吋依赖的特殊技术。第7章;包将上述技术扩展到更大型的系统。后一部分题为“逻辑设计问题”,研究逻辑设计行物理设计相结合的传统课题。这些章节第8-10章)叙述了如何将一个组件作为一个整体来设计,总结了大量有关合理接凵设计的问题,并研究了在大型项目环境中的实现问题第3部分:逻辑设计问题第8章:构建一个组件仝面设计组件需要考虑的重要问题的总括第9章:设计一个函数详细探讨生成一个组件的功能接凵的问题。第10章:实现个对象针对在大型项目环端中实现对象的若干组织问题。附录中的主题是整本书的参考。正文页下注中给出的书目的有关信息可参阅书后的参考文献感谢如果没有我在 Mentor〔 raphics公司的许多同事的共同努力,这本书是不可能出现的。他们对于公司的划时代建设和发展作出了贡献。首先,我要感谢我的朋友、同事和大学同学 Franklin Klein对本书所作出的贡献。他实际上审读了本书每一灾手稿。 Franklin对许多概念提供了解释——对大多数软件开发人员来说,这些都是新的概念。 Franklin的智慧、学识、社交能力、领会有效交流的细微差的能力都远远超过我。他对容修订、叙述顺序和表达风格等方面进行了详细的评审。在排版期间,数位有天分和献身精神的专业软件人员检查了本书的大部分内容。他们愿意花费宝贵的时间审阅本书,对此我感到很幸运。我要感谢 Brad Appleton、 Rick Cohen、 MindyGarber、 Matt Greenwood、 Amy Katriel、 Tom o Rourke、 Ann sera、 Charles thayer和 Chris≌amwyk。他们花费大量的精力帮助我尽可能提高本书的价值。我要特别感谢 Rick Besley,因为http://showmecode.cn/inks/book他提供了丰富的评论和实际的建议—尤其是他建议在每章的结尾作一个小结许多专业软件开发人员和质量保证工程师审阅了个别的章节。我要感谢 Samir agarwalJim anderson、 Dave arnone、 Robert brazile、 Tom Cargill, Joe Cicchiello、 Brad cox、 Brian dalio、Shawn edwards、 Gad Gruenstein、 William Hopkins、 Curl Horkey、 Ajay Kamdar、 Rcid madsen、Jason ng、 Pete Papamichael、 Mahesh ragavan、 Vojislav stojkovic、 Clovis tondo、 Glenn wikile、Stere unger以及 John vlissides,他们在技木上作出了贡献。我也要感谢 Mentor Graphics公引的 Lisa Cavaliere-Kaytes和 Tom matheson,他们为书中的些图表提出!宝贵的建议。另外我还要感谢现 ugene lakos和 Laura mangel所作的贡。自从本书首次印以来,我要感谢以卜读者帮助我排除了一些我要负全责的不可避免的馈: Jama han、 Dat Nguyen、 Scott Meyers、 David schwartz, Markus bannert、 Sumit KumarDavid Thomas、 Wayne barlow、 Brian althaus、 John szakmeister以及 Donovan Brown如果不是在哥伦比亚大学收到了一封推销信,提供给我一份免费的有关 Rob murray的著作的评论拷贝,这本书也许永远也不会出现。因为我只在春季学期才教课,所以在我寄画所附表格的时候,要求将那本书青到 Mentor Graphics而不是哥伦比亚。之后不久,我接到了Pradeep Siva(她是 Addison-Wesley Corporate& Professional Publishing Group I来的电话,要确定我这个不寻常要求的原因。在使她相信了这个要求的合理性(也许有些是没有理由的夸大)之后,她说:“我想我的老板可能会和你谈谈。”几天之后,我见到了她的老板出版商。我一直很欣赏该出版社制作的“专业计算机丛书”的卓越品质,正是这种声誉最终使我答应为那套从书撰写本书我非常感谢 Addison-Wesley Corporate& Professional Publishing Group的成员出版商Joinwait,耐心地教给我许多关于人和交流的见识,这些东西将使我终生受益。从阅读大量书籍、与很多专业软件技术人员进行讨论、到站在书店观察潜在读者的赂买习惯等方面, John wait直尽力把握行业的脉搏。以 Marty Rabinowitz为首的产品人员在各方面都是优秀的。尽管与其他出版商联系的学术界的作者们对我表示担心,但是我仍然高兴地对待 Marty所提出的在表达作者思想时应做到技术上准确、容易使用以及美学上有魅力的提炼与加工。我特别要感谢 Frances scanlon,为了拌印这木书,她付出了艰苦不懈的努力。Brian Kenighan,本系列的技术编辑,在风格和实质上都提供了有价值的疚献,并发现了些卬刷错误和没有被其他人发现的不一致性。他的知识的广度和深度,与简洁的写作风格结合起来,对本系列热书的成功作出了很大的贡献。最后,因为对其他书中基础逻转概念和设计原则的引证,我还想感谢木系列中的其他作者,http://showmecode.cn/inks/book译者序C++是当前的主流技术之·ε随着我闼社会与绎济信总化T作的发展和深入,计算机应用水平和层次止在逐步提高,应用铁件系统日益复杂化和大型化,我国软件业将面对越来越多的大型软件开发问题。然而,∏前国内这“方面的书籍极少,而直接基于C++大型软件开发的资料尤其缺乏。针对这一情况,我们翻译了《人规模C++软件设计》-·书,以满足读者的需求在实施大型和超大型C++软件订程时,会出现许多意想不到的严币问题。若方法不当轻则费川失控、进度延迟、执行代码臃肿、低效,重则可能导致开发项日完仝失败。作者在总结多来从事C+人型工程的丝验基础上,提出了物理设计和逻辑设计的一些新概念和新理论,阐明了在从事大型利超人型C++软件工程时应遵循的一系列物理设计利逻辑没计原则讨论了设计具有易测试、易维护和可重用等恃性的高质量大规模C++软件产品的方法。在说明这些概念、理论、方法和原则时,既有定性揸述又有定垦分析,还有许多生动的实例,并且刈如何设计复杂系统进行了示范。书中的概念、理论、方法和原则对于大型软件工程的开发具有极强的现实指导意义,有利于提高软件的质量,保证大型项日的成功。作者 John lak曾在 Mentor Graphic公司(最早用C+成功开发大型软件的公司之一)长期承担用C+开发CAD软件的工作,书中积聚了他十余年的实践功力。作者从1990年起在美国哥伦比亚大学开设名为“面向对象设计与缩程”的研究生课程,使本书中提及的方法和实例经受了课堂实践檢验,并得到了进一步的总结提炼和理论升华。本书虽然上要面向有纶验的C++程序员、系统设计帅、软件质量保证人员等中、高级程度的读者,但书中对于C+画向对象程序设计的重要概念、设计模式与良好的编程风格的精彩再现,以及对丁在任何C++项月中都应该遵循的重要设计原则和指导方针的深刻揭示,无凝亦可以使初级程度的读者大受裨益。即使是针对大规模软件设计的一些理念和方法,亦无妨为中、小型软件开发所参考或借用。也许正是由丁上述缘故,本书尽管定位于大规模轶件设计这-高端问,但并未因此而曲高和寡,其英文版问世至今,读者甚众,短短数年,重印已达九次之多。参加本书翻译的有李师贤、明仲、曾新红、刘显明、王志刚、李皓、李智、梅晓勇、李
用户评论