Unit1软件危机包含两方面的问题:一是如何开发软件,怎样满足人们对软件日益增长的需求?二是如何维护软件,使它们持久地满足人们的要求。软件工程学定义:把软件当作一种工业产品,采用工程学的原理来管理和组织软件的开发和维护,称为软件工程。软件是指程序、数据和文档三者共同构成的配置。包含与数据处理系统操作有关的程序、规程、规则以及相关文档的智力创作称为软件。文档是描述程序开发过程的,是智力创作的真实记录,是创作活动的历史档案和结晶。软件的描述性定义:软件由计算机程序,数据结构和文档组成。软件质量定义为“与软件产品满足规定的和隐含的需求能力有关的特征和特性的全体”具体来说:1)软件产品中能满足给定需求的性质和特性的总体;2)软件具有所期望的各种属性的组合程度。将软件质量属性划分为六个特性(功能性、可靠性、易用性、效率、维护性和可移植性),这六个属性是面向用户的观点——面向管理的观点,且是定性描述的。软件质量度量体系:内部度量可用于开发阶段的非执行软件产品,外部度量只能在生存周期过程中的测试阶段和任何运行阶段使用。软件工程项目的基本目标:(1)低成本;(2)满足功能要求;(3)高性能;(4)易移植;(5)易维护。软件工程方法学就是要从技术和管理上提供如何去设计和维护软件。软件开发方法:面向数据流(约旦)方法、面向数据结构方法、面向对象方法。结构程序设计是进行以模块功能和处理过程设计为主的详细设计的基本原则。它的主要观点是采用自顶向下、逐步求精的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、循环三种基本控制结构构造。用来辅助软件开发、运行、维护、管理、支持等过程中活动的软件称为软件工具(CASE)。软件生存周期定义:软件产品从形成概念开始,经过开发、使用和维护,直到最后不再使用的整个过程。各阶段的任务彼此间尽可能的相对独立,同一阶段内各项任务的性质尽可能的相同。软件的开发就是“按软件顺时间发展的过程分阶段进行”的。软件生存周期模型:瀑布模型(阶段间具有顺序型和依赖性,清楚地区分逻辑设计与物理设计、尽可能推迟程序的物理实现,是文档驱动模型,遵循结构化设计);原型模型(软件产品的开发是线性顺序进行的,本质是快速,用途是获知用户的真正需求,一旦需求确定,原型将被抛弃)。其核心都是将软件开发划分为:分析、设计、编码、测试和维护。软件生存周期划分为以下几个阶段:可行性研究与计划、需求分析、总体设计、详细设计、实现、组装测试、确认测试、使用和维护。软件过程:是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤软件工程方法学:通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称范型软件工程过程是软件生存周期中各个可能的过程,这些过程可进一步划分成为了提供或获得软件产品或服务,或是为了完成软件工程项目需要完成的有关软件工程活动,每一项活动又可分解为一些软件工程任务。标准定义了21个过程分属三类:基本过程(include获取、供应、开发、运作、维护过程)、支持过程和组织过程。软件工程三要素:方法、工具和过程。软件工程管理目的:为了按照进度及预算完成软件计划,实现预期的经济和社会效益。内容:成本估算、进度安排、人员组织、质量保证、配置管理等等。怎么强调软件工程管理的极其重要性都不会过分Unit2可行性研究任务和目的:用最小的代价在尽可能短的时间内确定问题是否能够在一定规模之内解决。(确定这一问题是否存在值得去做的解)过程和步骤:实质:进行一次大大压缩简化了的系统分析和设计过程,也就是在较高层次上以抽象方式进行的系统分析和设计过程。技术和工具:DFD+DD主要内容(1)澄清问题定义——规模、约束和限制(2)导出新系统的逻辑模型(3)导出若干个供选择的物理解法(物理模型),并分别研究它们的可能行:数据流图符号Example:数据流图的基本目的是利用它作为交流信息的工具,另一个主要目的是作为分析和设计的工具。数据字典是关于数据信息的集合,也就是对数据流图中包含的所有元素的定义的集合,它是通过对数据元素和数据结构的定义,来描述数据流和数据存储的逻辑内容的。数据流和数据字典共同构成系统的逻辑模型。数据字典的内容:数据流、数据元素、数据存储、处理数据字典最重要的用途是作为分析阶段的工具。Unit3需求分析:目的:精确地定义系统必须做什么,也就是对目标系统提出完整、准确、清晰、具体的要求。——为目标系统提出精确的逻辑模型。任务:确定对系统的综合要求,包括功能需求、性能需求、可靠性和可用性需求、运行要求、将来可能提出的要求。过程:处理逻辑的分解:自顶向下逐步分解直到每个处理逻辑已是不可再分的“功能单元”为止。书写文档:软件需求规格说明工具:状态图、IPO图、层次方框图、Warnier图结构化分析设计技术是70年代中期由E.Yourdon等人提出来的一种面向数据流的方法;要求系统的开发工作在结构化和模块化的基础上进行,它系统的运用了描述模型的概念,按照软件内部数据传递和变换的关系,自顶向下逐层分解,直到找出满足要求的可实现的软件。在这个方法里,“抽象”,“分解”,“模块化”,“结构化”是它的主要手段;面向数据传递、变换所形成的数据流(Dataflow)和数据流程图(DFD)是它的主要依据。这个方法的关键工作是:画分层的DFD和确定数据定义与加工策略。Yourdon方法(对应的瀑布模型)的缺陷:其实Yourdon方法是建立在三个假设之上的:假设1:所有的需求都是可以预先定义的;假设2:需求在较长一段时间内是不变的(相对稳定的);假设3:运用所提供的工具可以做到项目参与者之间清晰、准确、有效的沟通。这三个假设往往是很难成立的:“逻辑模型”的精确描述依赖于“自顶向下的求精过程”,而“自顶向下的求精过程”的顺利进行又依赖于精确的“逻辑模型”,这二个问题互相缠绕依赖而构成方法学上的“死锁”。原型法(原型模型):原型就是模型的意思(原型=模型),它指的是模拟某种产品的原始模型。运用原型的策略:抛弃策略&附加策略对原型的逐步求精过程是一个迭代过程相对于Yourdon方法来说原型法是一个非线性的系统开发方法。不再强调高质量的阶段性文档。螺旋模型:沿螺线自内向外每旋转一圈便开发出一个更为完善的软件版本Yourdon方法适合于“预先指定的系统”;原型法适合于“用户驱动的系统”。通常用“范式”定义消除数据冗余程度。第一范式数据冗余程度最大,第五范式数据冗余程度最小。状态转换图:状态是可以被观察到的系统行为模式,一个状态代表系统的一种行为模式,它规定了系统对事件的响应方式。一张状态图有一个初态和0至多个终态。事件:在某个特定时刻引起系统做动作和(或)状态转换的控制信息。验证软件需求的正确性:一致性、完整性、现实性、有效性Unit4总体设计:目的:确定系统的具体物理实现方案(系统结构设计),确定组成每一个程序的模块,以及模块间的关系(软件结构设计)。任务:软件结构设计(过程设计是详细设计阶段的任务)过程:设想供选择的方案选取合理方案(每份方案有系统流程图、组成系统的物理元素清单、成本/效益分析、实现这个系统的进度计划4份资料)等9步(P92)在软件开发早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。总体设计阶段书写的文档:系统说明、用户手册、测试计划、详细的实现计划、数据库设计结果。总体设计过程中,推荐最佳方案后进入“软件结构”设计:设计出组成这个系统的所有程序、文件和数据库,以及它们之间的联系。软件结构:由模块组成的层次系统。模块:数据说明、可执行语句等程序。C/S(Client/Server)结构是软件系统体系结构“结构化设计”概括地说就是:用一组标准的工具和准则来确定系统应该由哪些模块、用什么方式联结在一起,才能构成一个最好的软件结构。模块化就是把程序划分成若干个模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。模块:具有四种属性的一组程序语句称为一个模块,这四种属性分别是:输入和输出、逻辑功能、运行程序、内部数据。(前两个是模块外部属性,后两个是内部属性,总体设计完成外部属性设计、详细设计完成内部属性设计)软件结构图中,模块用一矩形表示。模块间调用:用→连接开发具有独立功能而且和其它模块之间没有过多相互作用的模块,可以做到模块独立。影响模块独立的因素:耦合(不同模块间互联程度)内聚(同一模块内各元素紧密程度)力争高内聚、低耦合。5种耦合形式:数据耦合、控制耦合、特征耦合、公共耦合、内容耦合(从左到右耦合程度递增)最弱的耦合是非直接耦合7种内聚形式:功能内聚、顺序内聚、通信内聚、过程内聚、时间内聚、逻辑内聚、偶然内聚(从左到右程度依次递减)模块的扇出与扇入:模块的扇出是指一个模块拥有的直接下级模块的个数。模块的扇入是指一个模块的直接上级模块的个数。模块的扇出系数应控制在7以内,尽可能的加大模块的扇入系数。作用域应该是控制域的子集;模块的控制域和作用域:模块的控制域(控制范围):是指这个模块本身以及所有直接或间接从属于它的模块的集合。模块的作用域(判断作用范围):是指受该模块内一个判断影响的所有模块的集合。(也就是该模块内存在着判断调用语句,而所有受到该判断逻辑影响的模块,就是该模块的作用域。)作用域应该是控制域的子集;理想的是作用域都是直接下属模块。数据流类型——数据在DFD中流径特征变换流:进入系统中的数据所流经的路径几乎是一样的。事务流:进入系统中的数据所流经的路径不完全是一样的。事务中心往往包含多个处理逻辑。“事务”是指一组输入数据。Unit5详细设计:目的:完成模块的过程设计(为SC中每个模块确定采用的算法和块内数据结构,用某种选定的表达工具给出详细清晰的描述。)模块的逻辑设计(模块的过程描述)主要内容:1)为每个模块确定采用的算法2)确定每个模块使用的内部数据结构3)确定模块的接口细节4)制定模块的测试计划精化DFD事务分析变换分析DF类型?分析DFD中数据流的全局特征建立第一张SC分解和优化确定变换中心及I/O完成模块的“内部属性”设计,即给出系统中各个模块的“运行程序”和“内部数据”;由此可见详细设计的结果基本上决定了最终软件的质量。详细设计的目标更重要的是便于维护。工具:1.程序流程图(流程图)2.N-S图(盒图)3.PAD图(问题分析图)4.伪代码和PDL语言逻辑设计应遵循的理念:1.从效率第一到清晰第一2.结构化的控制结构:结构化程序设计=仅使用单入口单出口的三种基本控制结构3.逐步细化的实现方法[例]在一组数中找出其中的最大数分别用程序流程图、N-S图和PAD图描述用“结构化”保证程序的清晰易读,用“逐步细化”实现程序的正确可靠,它们导致了一条自然的结论:模块的逻辑设计必须用结构化程序设计的原理来指导。(结构化设计在详细设计阶段)Yourdon方法的技术途径:DFD→DFD+DD→SC→PDLYourdon方法在分析阶段,我们用DFD来表示软件的逻辑模型;在设计阶段,又按照数据流类型,分别用变换分析或事务分析将它们转换成相应的软件结构。面向数据结构设计方法的根据和基本思想:算法和数据结构是程序设计中不可分割的侧面,算法的结构依赖于它要处理的数据结构。只要事先知道一个问题的数据结构,就可以由此导出它的程序结构。基于数据流还是基于数据结构的出发点不同,最终目标也不同。SADT(结构化分析设计工具)方法的目标是得出软件的最终SC图,它把注意力集中在模块的合理划分上;面向数据结构的设计则要求得出程序的过程性描述,并不明确也提出软件应该先分成模块等概念。SADT方法:DFD-SC(软件结构图)-模块的过程性描述(PDL等)|-------总体设计-------||--------详细设计-------|Jackson方法(面向数据结构):数据结构-程序结构-程序的