一、概论计算机软件:计算机软件指计算机系统中的程序及其文档。软件危机指在计算机软件的开发和维护过程中遇到的一系列严重问题。表现:软件成本日益增长、开发进度难以控制、软件质量差、软件维护困难。原因:用户需求不明确、缺乏正确的理论指导、软件规模越来越大、软件复杂度越来越高软件的特点:软件是一种逻辑实体,而不是有形的系统元件,其开发成本和进度难以准确地估算。软件是被开发或被设计的,没有明显的制造过程,一旦开发成功,只需复制即可,但其维护的工作量大。软件的使用没有那样的机械磨损和老化问题。但是软件会因为维护的过程中修改程序而造成副作用从而使故障率升高。软件的开发常受到计算机的限制,对计算机硬件有着不同程度的依赖性。软件的开发至今尚未完全实现自动化。软件成本相当昂贵。相当多的软件工作涉及到社会因素。软件的分类:系统软件支持软件应用软件•按软件工作方式划分:实时处理软件分时软件交互式软件批处理软件•按软件服务对象的范围划分:项目软件产品软件•按使用的频度进行划分:一次使用频繁使用•按软件失效的影响进行划分:高可靠性软件一般可靠性软件软件语言:需求定义语言功能性语言设计性语言实现性语言(即程序设计语言)文档语言软件工程的定义:FritzBauer:软件工程是为了经济地获得可靠的和能在实际机器上高效运行的软件而建立和使用的好的工程原则IEEE:软件工程是(1)将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中;(2)(1)中所述方法的研究计算机科学技术百科全书:软件工程是应用计算机科学、数学及管理科学等原理,以工程化的原则和方法制作软件的工程软件生存周期:软件生存周期是指一个软件从立项、制造、测试、使用、维护到软件废止为止的一整个时期。计算机系统工程、需求分析、设计、编码、测试、运行和维护。软件过程模型:1.瀑布模型:waterfallmodel接受上一阶段的活动的结果作为本阶段活动的输入。依据上一阶段的活动的结果实话本阶段应该完成的活动。对本阶段的活动进行评审。将本阶段活动的结果作为输出,传递给下一阶段。2.演化模型:evolutionarymodel从构造初始的原型出发,逐步将其演化成最终软件产品的过程。适用于对软件需求缺乏准确认识的情况。典型的演化模型:增量模型、原型模型、螺旋模型3.增量模型:incrementalmodel将软件的开发过程公成若干个日程时间交错的线性序列,每个线性序列产生软件的一个可发布的“增量”版本,后一个版本是对前一个版本的修改和补充,重复增量发布的过程,真至产生最终的完善产品。融合了瀑布模型的基本成分(重复地应用)和演化模型的迭代特征,强调每一次增量都发布一个可运行的产品。适用于需求经常发生变化的软件开发。可以有计划地管理技术风险。4.原型模型:prototypingmodel从软件工程师与客户的交流开始,其目的是定义软件的总体目标,标识需求,然后快速制定原型开发的计划,确定原型的目标和范围,采用快速设计的方式对其建模,并构建原型。1.原型类型:a)探索型exploratoryprototyping原型的目的是要弄清目标系统的要求,确定所希望的特性,并探讨多种方案的可行性。b)实验型experimentalprototyping原型的目的是验证方案或算法的合理性,是在大规模开发和实现前,用于考核方案是否合适,规格说明是否可靠。c)演化型evolutionaryprototyping原型的目的是将原型作为目标系统的一部分,通过对原型的多次改进,逐步将原型演化成最终的目标系统。2.原型使用策略:a)废弃策略主要用于探索型和实验型原型的开发。b)追加策略主要用于演化型原型的开发。原型可作为单独的过程模型使用,也常被作为一种方法或实现技术应用于其他的过程模型中。5.螺旋模型:将原型实现的迭代特征与瀑布模型中控制的和系统化的方面结合起来,不仅体现了这两种模型的优点,还增加了风险分析。螺旋模型沿着螺线自内向外旋转(四个任务区域:制定计划,风险分析,工程实施,客户评估)6.喷泉模型:fountainmodel支持面向对象开发的过程模型。7.基于构件的开发模型:component-baseddevelopmentmodel利用预先包装的构件来构造应用系统。包括领域工程和应用系统工程两部分。领域工程:目的是构建领域模型、领域基准体系结构和可复用构件库。应用系统工程:目的是使用可复用构件组装应用系统。基于构件的软件开发导致软件的复用。8.形式化方法模型:formalmethods建立在严格数学甚而上的一种软件开发方法。软件设计原则:1.抽象与逐步求精a)抽象(特殊到一般的过程)主要抽象手段有:过程抽象和数据抽象。b)逐步求精(把问题的求解过程分解成若干步骤或阶段)2.模块化——把软件按照规定原则,划分为一个个较小的,相互独立的但又相互关联的部件。实际上是系统分解和抽象的过程。如果模块是相互独立的,当模块越小,每个模块的工作量越低;但当模块数增加时,模块间的联系也随之增加,把这些模块起来的工作量也随之增加。3.信息隐藏模块中所包含的信息(包括数据和过程)不允许其他不需要这些信息的模块使用。由于一个软件系统在整个软件生存期内要经过多次修改,所以在划分模块时要采取措施,使得大多数过程和数据对软件的其他部分是隐蔽的。这样,在将来修改软件时偶然引入错误所造成的影响就可以局限在一个或几个模块内部,避免影响到软件的其他部分。4.模块独立——模块完成独立的功能并且与其他模块的接口简单,符合信息隐蔽,模块间关系和依赖程度尽可能小。1.内聚cohesion一个模块内部各个元素彼此结合的紧密程度的度量。高←——————————————内聚性————————————→低功能内聚顺序内聚通信内聚过程内聚时间内聚逻辑内聚巧合内聚强←—————————————模块独立性———————————→弱2.耦合coupling模块之间的相对独立性的度量。耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型。低←——————————————耦合性————————————→高非直接耦合数据耦合标记耦合控制耦合外部耦合公共耦合内容耦合强←—————————————模块独立性———————————→弱模块独立性比较强的模块应该是高内聚低耦合的模块。耦合是直接的主导因素,内聚则是辅助耦合共同对模块独立性进行衡量。部件级设计技术:1.结构化程序设计方法通常采用自顶而下,逐步求精的设计方法。能提高程序的可读性,可维护性和可验证性,从而提高软件的生产率。2.图形表示法a)程序流程图顺序型、选择型、先判定型循环(dowhile)、后判定型循环(dountil)、多情况选择型(case)组合或嵌套而成复杂流程图。b)N-S图c)PAD(problemanalysisdiagram)问题分析图由程序流程图演化而来的,用结构化程序设计思想表现程序逻辑结构的图形工具。3.判定表优点:能够简洁,无二义地描述所胡的处理规则。缺点:判定表表示的是静态逻辑,是在某些条件组合取值情况下可能的结果,不能表达加工的顺序,也不能表达循环结构。4.设计性语言PDL(programdesignlanguage)——是一种伪码具有正文格式,很像一个高级语言。特点:有固定的关键字外语法,提供全部结构化控制结构、数据说明和部件特征。内语法使用自然语言来描述处理特性。有数据说明机制。有子程序定义与调用机制。数据流图(DFD):1.数据流图的图形表示a)数据流图的基本图形元素:i.源或宿(sourceorsink)——存在于软件系统之外的人员或组织,表示软件系统输入数据的来源和输出数据的去向。符号:ii.加工(process)——输入数据流到输出数据流的变换。符号:iii.数据流(dataflow)——由一组固定成分的数据组成。符号:iv.文件(file)——用于存放数据。符号:b)数据流图的扩充符号:i.星号(*)表示数据流之间存在“与”关系ii.加号(+)表示数据流之间存在“或”关系iii.异或(⊕)表示数据流之间存在“异或”(互斥)关系c)数据流图的层次结构i.层次结构顶层只有一张图,其中只有一个加工,代表整个软件系统,该加工描述了软件系统与外界之间的数据流,称为顶层图。0层图:将顶层图中的加工经过分解后形成的图底层图:处于分层数据流图最底层的图中间层图:分层数据流图中的其他图ii.图和加工的编号(父图,子图)顶层图只有一个加工,不必编号0层图中的加工编号分别为1、2、3…对于子图号,若父图中的加工号x分解成某一子图,刚该子图记为“图x”对于子图中加工的编号,若父图中的加工号为x的加工分解成某一子图,则该子图中的加工编号分别为x.1、x.2、x.3…2.分层数据流图的画法分层数据流图的审查:1.分层数据流图的一致性和完整性a)一致性i.父图与子图的平衡ii.数据守恒iii.局部文件b)完整性i.每个加工至少有一个输入数据流和一个输出数据流。ii.在整套分层数据流中,每个文件应至少有一个加工读该文件,有另一个加工写该文件。iii.分层数据流图中的每个数据流和文件都必须命名,并保持与数据字典一致。iv.分层DFD中的每个基本加工都应有一个加工规约。2.构造分层DFD时需要注意的问题a)适当命名b)画数据流而不是画控制流c)避免一个加工有过多的数据流d)分解尽可能均匀e)先考虑稳定状态,忽略琐碎的枝节f)随时准备重画3.分解的程度a)7加减2b)分解应该自然,概念上合理清晰c)只要不影响DFD的易理解性,可适当增加子加工数量,以减少层数d)分解要均匀结构化设计概述:1.结构图a)基本成分——模块、调用、数据b)辅助符号c)几个概念i.深度——程序结构图中控制的层数ii.宽度——程序结构图中同一层次上模块总数的最大值iii.扇出fanout——该模块直接调用的模块的数目iv.扇入fanin——能直接调用该模块的模块数目2.启发式设计策略a)改造程序结构图,降低耦合度,提高内聚度b)避免高扇出,并随着深度的增加,力求高扇入c)模块的影响范围应限制在该模块的控制范围内d)降低模块的复杂程度和冗余程度,提高一致性e)模块的功能应是可预测的,避免对模块施加过多的限制f)尽可能设计单入口和单出口的模块3.结构化设计的步骤a)建立初始结构图b)对结构图的改进c)书写设计文档d)设计评审面向对象的基本概念:1.对象object2.类class3.继承inheritance4.消息message5.多态性polymorphism和动态绑定dynamicbinding面向对象设计模式:1.模式名2.模式的环境和条件3.设计模式的特征4.应用设计模式的结果consequences几种建模:1.用况建模:用况(usecase):文本形式的情节撕碎,用以说明某参与者使用系统以实现某一特定目标的情形。用况建模用于描述一个系统应该做什么,用用况图来描述(可能有多幅)用例之间的关系。•泛化关系:同一业务目的的不同技术实现(多个用例拥有一种类似的结构和行为的时候,可以将它们的共性抽象成为父用例,其他的用例泛化为子用例)•包含关系:提取公共交互,提高复用(将包含用例的事件流拖入到基础用例的事件流中,包含用例是可以重用的)•扩展关系:“冻结”基用例以保持稳定(将扩展用例的事件流在一定的条件下按照相应的扩展点插入到基础用例中)2.静态建模:UML中以类图和对象图来建立•类图和对象图•类图中类之间的关系•CRC技术:CRC(类—责任—协作者)方法:使用一组表示类的索引卡片。主要步骤:1.标识潜在的对象类2.筛选对象类,确定最终对象类3.标识责任(类的属性和操作)4.标识协作者5.复审CRC卡•UML中可见性:3.动态建模:UML中用状态机图、活动图、顺序图、通信图和协作图来建立动态模型。a)状态机图(statemachinediagram)描述对象所有可能的状态,以及哪些事件将导致状态的改变。i.