代码大全非扫描版.pdf
《代码大全非扫描版.pdf》由会员分享,可在线阅读,更多相关《代码大全非扫描版.pdf(530页珍藏版)》请在文库网上搜索。
1、第一章 欢迎进入软件创建世界 1 第一章第一章第一章第一章 欢迎进入软件创建世界欢迎进入软件创建世界欢迎进入软件创建世界欢迎进入软件创建世界 目录目录目录目录 1.1 什么是软件创建(Software Construction)1.2 软件创建的重要性 1.3 小结 相关章节相关章节相关章节相关章节 本书适合什么人阅读:见前言 阅读本书的益处:见前言 为什么要写这本书:见前言 大家都知道“Construction”这个词在一般情况下的意思是“建筑”。建筑工人盖房子、建学校、造摩天大楼等时所进行的工作都是建筑。当你小的时候,你用积木进行“建筑工作”。因此“Construction”指的是建造某个
2、东西的过程。这个过程可能包括:计划、设计、检验等方面的某些工作,但是,它主要是指在这其中的创造性工作。1 1 1 1.1 1 1 1 什么是软件创建什么是软件创建什么是软件创建什么是软件创建 开发计算机软件是一项非常复杂的工作,在过去的十五年中,研究者们指出了这项工作所包括的主要方面,包括:问题定义 需求分析 实现计划 总体设计 详细设计 创建即实现 系统综合 单元测试 系统测试 校正性的维护 功能强化 如果你以前从事过一些不太正规的研制工作,你可能以为列出的这个表有些太详细了。而如果你从事过一些正式的项目,你就会认为这个表非常准确。在正规性与随意性之间达到平衡是非常困难的这会在以后章节中讨论
3、。如果你是自学编程员或是主要从事非正规研制工作,你很可能还没有意识到这些在生产软件中所需要的工作步骤。在潜意识中,你把这些工作统统称为编程。在非正式项目中,当你在考虑设计软件时,你所想到的主要活动可能就是研究者们所指的“创建”工作。关于“创建”的直觉概念是非常准确的,但它往往缺乏正确观点。把创建活动放到与其相第一章 欢迎进入软件创建世界 2 关活动的背景中,有助于我们在适当重视其它非创建工作的同时,把主要精力放在正确的任务上。图 1-1 中给出了创建活动在典型软件生存周期循环中的地位和包括的范围。正如图中所指出的,创建活动主要指编码和调试过程,但也包括详细设计和测试中的某些工作。假如这是本关于
4、软件开发所有方面的书,它应该涉及到开发过程所有方面并给予同等重视。但因为这是一本关于创建技术的手册,所以我们只重点论述创建活动及相关主题。如果把这本书比喻成一只狗,那么它将用鼻子轻擦创建活动,尾巴扫过设计与测试,而同时向其它开发活动汪汪叫。创建活动有时被称作“实现”,它有时被叫作“编码和调试”,有时也称之为“编程”。“编码”实在不是一个很好的叫法,因为它隐含着把已经设计好的程序机械地翻译成机器语言的过程;创建则无此含义,它指的是在上述过程中的创造性和决策性活动,在本书中,将交替使用“实现”、“编程”和“创建”。图 ll 软件生存周期中软件开发过程的平面图 在图 11 中,给出了软件开发过程的平
5、面图示,而在图 12 中,则给了它的立体图示。图 11 和图 l2 是创建活动的总体图示,但是,什么是它的细节呢?下面是创建活动中所包含的一些特定任务。验证基础工作已经完成,可以进行创建工作 设计和编写子程序与模块 第一章 欢迎进入软件创建世界 3 创立数据类型并命名变量 选择控制结构并组织语句块 找出并修正错误 评审其它小组的细节设计和代码,同时接受其它小组评审 通过仔细地格式化和征集意见改进编码 对分别完成的软件单元进行综合 调整编码使其更小、更快 图 12 本书主要详细论述详细设计、编码、调试和单元测试(所占比例如图示)要想更详尽地了解创建活动,请参阅目录中每一章的标题。创建活动包括如此
6、众多的工作,人们可能会禁不住要问:“哪些是创建活动呢?”。一般认为,非创建活动包括:管理活动、需求分析、软件总体设计、用户交互界面设计、系统测试、维护工作等。这其中每项工作都与创建工作一样,会直接影响到项目的最终成败(那些需要两个人以上合作至少一星期项目的成败)。关于这其中每一项活动都有很不错的论著,在本书每一章后都列出这些书的书名。1 1 1 1.2 2 2 2 软件创建的重要性软件创建的重要性软件创建的重要性软件创建的重要性 正如我们所知,改进软件质量、提高软件生产率是非常重要的。当今世界许多激动人心的工程计划中,软件都被广泛地应用:太空飞行、航空、医学与生命保障科学、电影特技、金融信息的
7、快速处理、科学研究等,这仅是其中的几个例子。如果读者您也认为软件开发是重要的,那么您就会问,为什么创建活动是重要的?原因如下:创建活动是开发软件的重要组成部分。创建活动是开发软件的重要组成部分。创建活动是开发软件的重要组成部分。创建活动是开发软件的重要组成部分。随项目规模不同,创建活动在整个开发活动中所占时间为 3080之间,在任何计划中占有如此大时间比例的活动必然会影响计划的成败,这是不言而喻的。创建活动在软件开发中处于枢纽地位。创建活动在软件开发中处于枢纽地位。创建活动在软件开发中处于枢纽地位。创建活动在软件开发中处于枢纽地位。分析和设计是创建活动的基础工作,对系统进行测试以证实创建活动是
8、正确的则是其后续工作,因而创建活动是软件开发的核心工作。把主要精力集中于创建活动,可以极大地提高程序员的生产效享。把主要精力集中于创建活动,可以极大地提高程序员的生产效享。把主要精力集中于创建活动,可以极大地提高程序员的生产效享。把主要精力集中于创建活动,可以极大地提高程序员的生产效享。由 Sackman、Erikson 和 第一章 欢迎进入软件创建世界 4 Grant 在 1968 年进行的实验表明,每个程序员的效率系数的变化范围为 1020,这一结果随后又被其它几个实验所证实。最优秀程序员与普通程序员的巨大差异表明,普通程序员提高效率的潜力是非常大的。创建活动的产品,源代码,往往是软件的唯
9、一精确描述。创建活动的产品,源代码,往往是软件的唯一精确描述。创建活动的产品,源代码,往往是软件的唯一精确描述。创建活动的产品,源代码,往往是软件的唯一精确描述。在许多项目中,程序员可得到的唯一文件便是代码本身。需求说明和设计文档可能会过时,但源代码却总是最新的。因此,源代码必须具有最好的质量。一个软件成功与否的关键,就在于是否不断运用技术来改进源代码。而这些技术恰恰是在创建阶段,才能得以最有效的应用。创建活动是唯创建活动是唯创建活动是唯创建活动是唯一项必不可少的工作。一项必不可少的工作。一项必不可少的工作。一项必不可少的工作。理论上一个软件项目要经过精心的需求分析和总体设计,然后再进行创建,
10、接着对其进行彻底的、严格的系统测试。然而,实际工作中的软件项目,往往越过前两个阶段而直接进行创建活动,最后,由于有太多的错误要修改,系统测试又被弃之路旁。但是,不管一个项目的计划多么疏漏而又如何匆忙,创建活动都是必不可少的。无论怎样精简,改进创建活动都是改进软件开发工作的方法。l.3 l.3 l.3 l.3 小小小小 结结结结 创建活动是总体设计和系统测试之间承上启下的工作。创建活动主要包括:详细设计、编码、调试和单元测试。关于创建活动的其它称谓有:实现、编程等。创建活动质量对软件质量有潜在影响。在最后的分析中,对创建活动理解的好坏,决定了一个程序员素质的高低,这将在本书其余部分论述。第二章
11、利用隐喻对编程进行更深刻的理解 5 第二章第二章第二章第二章 利用隐喻对编程进行更深刻的理解利用隐喻对编程进行更深刻的理解利用隐喻对编程进行更深刻的理解利用隐喻对编程进行更深刻的理解 目录目录目录目录 2.1 隐喻的重要性 2.2 如何使用软件隐喻(Software MetaPhors)2.3 通常的软件隐喻 2.4 小结 相关章节相关章节相关章节相关章节 设计中的启发:“设计是一个启发过程”见 7.5 节 计算机科学的语言可能是所有科学领域中最丰富的。想象一下。你走进一间干净整洁、温度严格控制在 68的房间,在这里,你将会找到病毒、蠕虫、臭虫、炸弹、崩溃、火焰、扭曲的变形者、特洛伊木马和致命
12、错误,在其它领域中,你会遇到这种情况吗?这些形象的隐喻描述了特定的软件现象。同样形象的隐喻描述了更为广泛的现象,你可以利用它们来加深你对软件开发的理解。本书其余部分与本章关于隐喻的论述无关,如果你想了解实质问题可以跳过这一章。但你要想对软件开发有更清楚的理解,请阅读这一章。2.1 2.1 2.1 2.1 隐喻的重要性隐喻的重要性隐喻的重要性隐喻的重要性 重大发现往往是从类比中产生的。通过把一个你所陌生的事物与你所熟知的事物比较,你会对它有进一步的认识,从而形成你对它的独到的深刻理解,这种隐喻方法被称之为“模型化”。在科学发展史上,充满了利用类比而产生的发现。化学家 Kekle 梦见一条蛇咬住了
13、自己的尾巴,醒来后,他由此联想到苯的结构,提出了苯是环形分子的假说,这一假说在 1966 年被 Barbour用实验所证实。分子运动论是在“保龄球”模型上建立起来的。在这里,分子被假想为具有质量并且与保龄球一样相互之间进行完全弹性碰撞的小球,并且在此基础上,又产生了许多有用的模型。光的波动理论是在与声音类比的基础上产生的。光与声都具有振幅(亮度与音量),频率(颜色与音调)和其它类似性质。这种类比是如此有效,以致于科学家们花费了大量时间来寻找像空气传播声音一样传播光的物质“以太”,但他们从来也没能找到。有时如此有效的类比这次却导出了错误结果。通常,模型的力量在于它能提供生动形象的概念而易被人整个
14、接受。并提供特性、联系和附加的疑问,有时模型会提出令人困惑的问题,这时往往是由于模型被误解了,那些建筑“以太”的科学家们,就是因为误解了模型。正如你所预料的,有些模型比其它的要好。好的模型要简单、与其它模型关联密切、能解释 第二章 利用隐喻对编程进行更深刻的理解 6 大部分实验事实和观测现象。比如一个悬在铁链上来回晃动的大石头。在 Galileo 之前,Aristotelian 看到它时想到的是重物必然要从高处落下来停在低处,他认为石头是在克服阻力下落,而当 Galileo 看到同一现象时,他认为自己看到了一个单摆,他认为石头是在不断地重复同一运动。这两个模型所提供的信息是截然不同的。Aris
15、totelian 认为石头是在下落,因而他关心的是石头的重量、升起的高度及停下所需的时间。而 Galileo 从单摆模型出发,他关心的是石头的重量、铁链的半径、石头的角位移及石头每摆一次所需要的时间。Galileo 之所以能发现单摆定律,就是因为他的模型与 Aristotelian 不同,从而导致他们提出了不同的问题。隐喻对加深软件理解所做出的贡献,与它对其它领域所做出的贡献一样大。1973 年,在图灵奖颁奖演说中,Charles Bachman 叙述了从地心说向日心说转移的过程。Ptolemy 的地心说统治了近 1400 年。直到 1543 年,Copernicus 提出了日心说,这一思想模
16、型的转变导致了一系列新星的发现,把月亮定义为卫星而不是行星,也改变了人类对自身在宇宙中地位的理解。Bachman 把天文学中从地心说向日心说的转变,与 70 年代前期在计算机编程中的变化作了个对比。在当时,数据处理正从以计算机为中心向以数据库为中心进行转变。Bachman 指出,在旧的处理模式中,数据被当成是一个连续流过计算机的卡片流(以计算机为中心);而在新的模式中,数据好比是一个水池,而计算机则偶尔涉足其中(以数据库为中心)。今天,很难想象谁会认为太阳绕着地球转;也同样难以想象推会把数据当成流过计算机的卡片流。在这两个例子中,旧的理论一旦被抛弃,很难想象有谁会再把它捡起来。具有讽刺意味的是
17、,旧理论的相信者认为新理论荒唐可笑,就像我们今天看旧理论一样。当日心说出现之后,地心说便成了那些相信它的天文学家的阻碍。同样,计算机中心模式也已经成了那些相信它的计算机科学家的阻碍,因为我们现在已经有了数据库中心模式。如果一旦看了新的模型,我们便说:“哦,当然正确的模型更有用,其余的都是错误的”,那只会降低模型的作用。因为这太偏激了。科学史并不是由一系列从“错误”模型到“正确”模型开关组成的,而是逐渐由“坏的”模型变为“较好”的模型,从包含面较窄到包含面较宽,从覆盖领域较少到覆盖领域较多。事实上,很多被较好模型替代的旧模型仍然在发挥作用。例如,工程师们仍然在用牛顿力学进行工程计算,虽然它已经被
18、相对论力学所取代。软件科学是一门比其它学科年轻得多的学科,还很不成熟,远未形成一套标准的模型。所以,现在拥有的是大量相互矛盾的模型。这其中有些很好,有些则很差。因此,对这些模型理解得好坏,便决定了你对软件开发理解的好坏。2.22.22.22.2 如何使用软件隐喻如何使用软件隐喻如何使用软件隐喻如何使用软件隐喻 软件隐喻更像是一束搜索灯光,而不是一张地图,它并不会告诉你到哪里去寻找答案;它 只给你以启发,教你如何寻找答案,而不是像数学算法一样硬性规定出到哪里找出答案。一个公式是一套完整建立的、进行某一些任务的规则。它的结果是可以预测的、确定的,并不取决于运气。公式会告诉你直接从 A 点走到 B
19、点,中间不准绕路,不准随意顺便访问 C、D、E 或 F 点,也不准停下来闻一下玫瑰花香或者喝杯咖啡什么的,一切必须按规定来。启发是一种帮助你寻求答案的技术。它的结果往往和运气有关,因为它只告诉你如何去 第二章 利用隐喻对编程进行更深刻的理解 7 找,而并未告诉你应该找到些什么。它不会告诉你怎样直接从点 A 到点 B甚至很可能它根本就不知道点 A 和点 B 在哪里。事实上,可以认为启发是一个穿着小丑儿外套的公式。它往往不可预测,更富有趣味,不会保证一定会发生或不会发生什么。比如,开车去某人家的公式是这样的:沿 167 号公路向南到 Sumner,从 Bonney 湖出口向山上开 2.4 英里,借
20、助加油站的灯光向左拐,在第一个右转弯处向右转,再拐入通向褐色房子的公路,寻找的门牌号是北大街 714 号。以下则是一个如何找到我们房屋的启发:找到我们寄给你的最后一封信,开车到回信地址所说的小镇,到了镇上后随便问哪个人我们住哪儿,别担心,镇上的人都认识我们。如果你谁也遇不到的话,就打电话找我们。公式和启发之间的区别是微妙的,这两个例子或许会说明一些问题。从本书的角度来看,它们之间的主要区别是:它们与答案之间的直接程度。公式给予直接指令;而启发则告诉你该怎样找到这些指令,或者至少告诉你到哪里寻找它们。如果有一套指令告诉你该如何解决程序中的问题,这当然会使编程变得很容易,而且结果也可以预测了。但是
21、编程科学目前还没有那样发达,也许永远也不会。编程中最富于挑战性的问题便是将问题概念化,编程中许多错误往往都是概念性错误,因为每个程序在概念上都是独特的,所以创立一套可以指导每一个问题的规则是非常困难,甚至是不可能的。这样,从总体上知道该如何解决问题,便几乎和知道某一特定问题的答案一样重要了。你是怎样使用软件隐喻的呢?应该用它来帮助你获得关于编程过程的内在理解,利用它们来帮助你考虑编程活动,想象解决问题的更好办法。你不要一看到某一行代码就说这与这一章所使用的某个隐喻相矛盾。随着时间推移,在编程过程当中使用隐喻的程序员肯定比不使用这一方法的人编写代码更快更好。2 2 2 2.3 3 3 3 通常的
22、软件隐喻通常的软件隐喻通常的软件隐喻通常的软件隐喻 随着软件的发展,隐喻越来越多,已经到了使人迷惑的地步,Fred Brooks 说写软件就像耕种、猎狼或者在一个沥青矿坑中淹死一只恐龙。Paul Heekel 说这就像电影白雪公主与七个小矮人。David Gries 说这是科学,Donald Knuth 则说这是门艺术,Watts HamPhrey 则说这是一个过程,Peter Freeman 说这是个系统,Harlan Mills 认为这就像解数学题、做外科手术、或者是宰一条狗,Mark Spinrad 和 Curt Abraham 说这更像是开发西部、在冰水中洗澡或者围着营火吃豆子。2 2
23、 2 2.3 3 3 3.l l l l 软件书写:写代码(软件书写:写代码(软件书写:写代码(软件书写:写代码(Writing Code)开发软件最原始的隐喻出自“写代码”一词。这个写的隐喻说明开发一个程序就像随便写封信,你准备好纸、笔和墨水,坐下从头写到尾就算完成了。这不需要任何正式计划,你只是把你要说的都写出来。许多想法都源于写隐喻。Jon Beitle 说,你应该准备好一杯白兰地,一支上等雪茄,与你喜欢的猎狗一同坐在火边,像一个优秀小说家一样享受一次“自由编程”。Brian 和 Kernighan 把写隐喻风格的书称为 风格要素(The Elements of Style)之后,把他们
24、编程风格的书称作 编程风格要素(The Elements of Programming Style),程序员们则经常谈论程序的“可读性”。第二章 利用隐喻对编程进行更深刻的理解 8 在一些小问题中,写代码隐喻可以充分描述它们。但是对于其余的问题,它就力不从心了,它不可能全面彻底地描述软件开发过程。写往往是一种个人活动,而软件开发往往需要许多人分担各种不同的责任。当你写完一封信时,你把它装进信封并把它寄出去后,你就再也不能改变它的内容了,无论从哪个角度说,这项工作都已经完成了。软件的内容是很容易改变的却很难彻底完成。几乎有50的软件开发工作量是在软件最初发行之后才进行的(Lientz和Swans
25、on,1980)。编写软件,主要工作量集中在初始阶段。在软件创建中,把精力集中于初始阶段往往不如在初始工作完成后,再集中精力进行代码的重新调整工作。简而言之,写隐喻往往把软件工作表示成是一项过于简单而刻板的工作。不幸的是,写隐喻已经通过我们这个星球上最流行的软件书Fred Brooks 的The Mythical Man Month而变得永存了。Brooks 说,“扔掉一个计划,又有什么呢?”这使得我们联想到一大堆被扔进废纸篓的手稿。当你写封家常信问候你叔叔时,准备扔掉一封信是可能的,这也可能是 Brooks1975 年写那本书时,当时软件工程的水平。但是,到了九十年代,再把写隐喻解释为准备扔
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代码 大全 扫描