第七讲概要设计了解软件设计工程及其研究内容理解概要设计的主要内容理解概要设计的过程掌握概要设计主要原则理解体系结构设计掌握模块划分特征掌握层次图软件生命周期需求分析问题定义可性行研究计划时期概要设计详细设计编码测试开发时期运行与维护运行时期设计人员把分析的结果设计图纸程序员拿着设计图纸编写代码需求规格说明书概要设计模块1模块2模块3模块4模块5模块6设计图纸-软件结构图模块4设计详细设计需求分析成果在原记录上填写还书日期发现记录?图书信息中的在库册数+1提示没有借书记录开始还书处理模块输入:读者号,图书号按读者号和图书号检索借书记录表结束无有阅卷者维护课程基本信息助教教师在线考试系统系统维护人员学生查询成绩考试维护教师基本信息维护学生基本信息维护系统参数用户管理系统权限管理维护题库查看统计报表生成统计报表批量计算学生成绩查询学生卷面配置考试生成学生成绩清单维护课程基本信息批阅考卷(按学生)维护试卷生成规则批阅考卷(按考题)批量导入成绩维护成绩借书窗口借书处理检查读者检查图书借书单击确认借书确认检查读者检查图书借书读者号图书号学生课程考试考卷考题考题规格说明选课考卷生成规则考卷生成规则项老师1..*1..*1..*0..**11..*10..*1..*监考1..30..*授课1..*0..*课程规格说明0..*1选择题填空题简答题程序设计题单选题多选题0..*1软件设计工程设计工程就是把需求分析过程中确定下来的用户需求定义书(What=做什么)变为能够进行实际操作的设计说明书(How=怎样做)的工程。设计工程是一个将系统的需求规格转换成软件系统的说明过程。从多个可能的思路中找到最佳的解决方案。其任务包括构建系统框架,设计系统功能,描述系统流程,建立系统的数据模型、接口模型及界面模型,形成系统的逻辑结构,告诉程序员软件系统应该“怎样做”。从工程管理角度来看,软件设计分两步完成:概要设计和详细设计。概要设计将软件需求转化为软件体系结构确定系统级接口全局数据结构或数据库模式。详细设计确立每个模块的实现算法和局部数据结构用适当方法表示算法和数据结构的细节软件设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构。设计编码测试维护测试编码维护有软件设计没有软件设计WindowsNT的一位系统设计师拥有8辆法拉利跑车,让Microsoft公司的一些程序员十分眼红。但你只能羡慕而不能愤恨,因为并不是每个程序员都有本事成为复杂软件系统的设计师。系统设计要比纯粹的编程困难得多。即便你清楚客户的需求,却未必知道应该设计什么样的软件系统——既能挣最多的钱又能让客户满意研究内容主要内容:体系结构设计、模块设计、数据结构与算法设计、用户界面设计体系结构就如同人的骨架。如果某个家伙的骨架是猴子,那么无论怎样喂养和美容,这家伙始终都是猴子,不会成为人。模块就如同人的器官,具有特定的功能。人体中最出色的模块设计之一是手,手只有几种动作,却能做无限多的事情。研究内容数据结构与算法就如同人的血脉和神经,它让器官具有生命并能发挥功能。数据结构与算法分布在体系结构和模块中,它将协调系统的各个功能。人的耳朵和嘴巴虽然是相对独立的器官,但如果耳朵失聪了,嘴巴就只能发出“啊”“呜”的声音,等于丧失了说话的功能(所以聋子天生就是哑巴),可人们却又能用手势代替说话。用户界面就如同人的外表,最容易让人一见钟情或一见恶心。象人类追求心灵美和外表美那样,软件系统也追求(内在的)功能强大和(外表的)界面友好。研究内容在进行系统设计时,我们要深情地关注软件的质量因素,如正确性与精确性、性能与效率、易用性、可理解性与简法性、可复用性与可扩充性等等。即使把系统设计做好了,也并不意味着就能产生好的软件系统。在程序设计、测试、维护等环节还要做大量的工作,无论哪个环节出了差错,都会把好事搞砸了。据说上帝把所有的女士都设计成天使,可是天使们在下凡时有些双脚先着地,有些脸先着地。上帝的这一疏忽让很多女孩伤透了心。我们在开发软件时,一定要吸取这个教训。概要设计概要设计的主要任务是把需求分析得到的模型转换为软件结构和数据结构。设计软件结构的具体任务是:将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。数据结构设计包括数据特征的描述、确定数据的结构特性、以及数据库的设计。概要设计建立的是目标系统的逻辑模型,与计算机无关。1.主要内容1)软件的总体结构和模块外部设计。2)软件处理流程设计。3)确定软件的功能并分配。4)数据结构设计。5)网络及接口设计。6)运行设计。7)出错处理设计。8)性能可靠性及安全保密设计。9)维护设计。2.设计过程编码测试设计信息描述功能描述行为描述其他需求数据设计过程设计程序模块集成并确认的软件3.设计原则总体设计的总原则是:由宏观到微观、逐步求精的原则,定性定量分析相结合、分解与协调相结合和模型化方法,并要兼顾系统的一般性、关联性、整体性和层次性。根据系统的总体结构、功能、任务和目标的要求分解系统,使各子系统之间互相协调配合,实现系统的整体优化。具体原则如下:3.1模块化把整个系统划分成若干个模块,每个模块完成一个子功能,将多个模块组织起来实现整个系统的功能。模块的三个属性:功能---即指该模块实现什么样的功能。逻辑----即描述模块内部怎么做。状态-----是指该模块使用时的环境和条件。模块化设计方法强调清楚地定义每个模块的功能和它的输入/输出参数,而模块的实现细节隐藏在各自的模块之中,与其它模块之间的关系可以是调用关系,因此模块化程序易于调试和修改。随着模块规模的减小,模块的开发成本减少,但是模块之间的接口变得复杂起来,使得模块的集成成本增加。最小成本区M模块成本接口成本总成本软件开发工作量模块数3.2抽象和逐步求精抽象是指抓住事物的本质特性而暂时不考虑其细节的方法。逐步求精是指为了集中精力解决主要问题而尽量推迟并逐步考虑细节问题的方法,是人类解决复杂问题时采用的一种基本策略,也是软件工程技术的基础。3.3信息隐藏每个模块的实现细节对于其他模块来说是隐藏的。模块中所包含的信息是不允许其他不需要这些信息的模块使用的。3.4内聚和耦合在软件设计中应该保持模块的独立性原则。反映模块独立性的有两个标准:内聚和耦合。内聚:标志一个模块内各个元素彼此结合的紧密程度,是信息隐蔽和局部化概念的自然扩展。设计时应该力求做到高内聚。耦合:是对软件结构内不同模块之间互连程度的度量,是影响软件复杂程度的一个重要因素。模块间的耦合程度将影响系统的可理解性、可测试性、可靠性和可维护性。设计时应该力求做到低耦合。练习一:确定内聚类型计算每个班学生的平均成绩初始化变量sum并打开文件创建新的成绩记录存储成绩记录关闭文件并打印平均成绩读取科目和成绩计算某个科目的平均成绩内聚类型功能内聚:一个模块中各个部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。顺序内聚——如果一个模块中的处理元素和同一个功能密切相关,并且这些处理必须是顺序执行的,那么这个模块具有顺序内聚。通信内聚:一个模块内各功能部分都针对相同输入/输出数据进行处理。过程内聚:模块执行的若干动作,相互关联并且有顺序关系。例如,从录入界面读取数据,然后更新数据库记录。它仍然是将多个相关的功能放在一个模块中实现。时间内聚:模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。逻辑内聚:一个模块完成的任务在逻辑上相同/相似巧合内聚又称为偶然内聚。当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散。练习二:确定耦合类型pqrtsu135246说明:模块p、t和u更新同一个数据库编号输入输出1班级名称班级编号2班级学生清单3功能代码4班级学生清单5班级编号班主任6班级编号班长模块接口描述耦合类型内容耦合公共耦合外部耦合控制耦合数据结构耦合数据耦合非直接耦合模块独立性模块耦合性低高弱强如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,坚决避免使用内容耦合。内容耦合:如果一个模块直接引用另一个模块的内容。公共耦合——多个模块都访问同一个公共数据环境,则称它们是公共耦合。控制耦合——模块A向模块B传递一个控制信息,称这两个模块是控制耦合的。数据耦合——如果两个模块传递的是数据项,则这两个模块是数据耦合。特征耦合:传递整个数据结构,但是只需要使用一部分数据元素非直接耦合:两个模块之间没有直接关系,它们之间的联系是通过主模块的控制和调用4体系结构设计体系结构是软件系统中最本质的东西。(1)体系结构是对复杂事物的一种抽象。良好的体系结构是普遍适用的,它可以高效地处理多种多样的个体需求。一提起“房子”,我们的脑中马上就会出现房子的印象(而不是地洞的印象)。“房子”是人们对住宿或办公环境的一种抽象。(2)体系结构在一定的时间内保持稳定。软件开发最怕的就是需求变化,但“需求会发生变化”是个无法逃避的现实。人们希望在需求发生变化时,最好只对软件做些皮皮毛毛的修改,可千万别改动软件的体系结构。就如人们对住宿的需求也会变动,你可以经常改变房间的装璜和摆设,但不会在每次变动时都要去折墙、拆柱、挖地基。良好的体系结构意味着普适、高效和稳定。本节将论述两种非常通用的软件体系结构:层次结构客户机/服务器(Client/Server)结构4.1层次结构层次结构表达了这么一种常识:有些事情比较复杂,我们没法一口气干完,就把事情分为好几层,一层一层地去做。高层的工作总是建立在低层的工作之上。层次关系主要有两种:上下级关系和顺序相邻关系。一、上下级关系的层次结构我们从小学一直读到博士研究生毕业,要读20多年,可以分为五个层次。而范进的知识结构只有两层:“私塾”和“秀才”,但读了五十多年。一般地处于较高层次的学生应该懂得所有低层次的知识,而处于低层次学生无法懂得所有高层次的知识。上层子系统可以使用下层子系统的功能,而下层子系统不能够使用上层子系统的功能。二、顺序相邻关系的层次结构顺序相邻关系的层次结构表明通讯只能在相邻两层之间发生,信息只能被一层一层地顺序传递。这种层次结构的经典之作是计算机网络的OSI参考模型。为了减少设计的复杂性,大多数网络都按层(Layer)或级(Level)的方式组织。每一层的目的都是向它的上一层提供一定的服务,而把如何实现这一服务的细节对上一层加以屏蔽。一台机器上的第n层与另一台机器上的第n层进行对话。通话的规则就是第n层的协议。数据不是从一台机器的第n层直接传送到另一台机器的第n层。发送方把数据和控制信息逐层向下传递。最低层是物理介质,它进行实际的通讯。接收方则将数据和控制信息逐层向上传递。4.2客户机/服务器结构让我们先回顾一下早期的电话系统。贝尔(AlexanderGrahamBell)于1876年申请了电话专利。那时期的电话必须一对一对地卖,用户自己在两个电话之间拉一根线。如果一个电话用户想和其它几个电话用户通话,他必须拉n根单独的线到每个人的房子里。于是在很短的时间内,城市里到处都是穿过房屋和树木的混乱的电话线。很明显,企图把所有的电话完全互联(如图所示a)是行不通的。ab贝尔电话公司在1878年开办了第一个交换局。公司为每个客户架设一条线。打电话时,客户摇动电话的曲柄使电话公司办公室的铃响起来,操作员听到铃声以后根据要求将呼叫方和被呼叫方用跳线手工连接起来。这种集中交换式的模型如图b所示。很快地,贝尔系统的交换局就出现在各地。人们又要求能打城市间的长途电话,就出现了二级交换局,以后进一步发展为多个二级交换局。[Tanenbaum1998]如果将图b中的电话看成是客户程序,将中心的交换局看成是服务程序,那么图b就是典型的客户机/