




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档一、概述1软件工程过程有哪几个基本过程活动?试说明之。 解答:软件工程过程的基本过程活动有4步: P (Plan) : 软件规格说明。规定软件的功能及其运行的限制; D (Do) : 软件开发。产生满足规格说明的软件; C (Check) : 软件确认。确认软件能够完成客户提出的要求; A (Action) : 软件演进。为满足客户的变更要求,软件必须在使用的过程中演进。2 试说明“软件生存期”的概念。解答:软件与任何一个事物一样,有它的孕育、诞生、成长、成熟、衰亡的生存过程。这就是软件的生存期。它分为6个阶段:(1) 软件项目计划 :在这一步要确定软件工作范围,进行软件风险分析,预计软件开发所需要的资源,建立成本与进度的估算。根据有关成本与进度的限制分析项目的可行性。 (2) 软件需求分析和定义 :在这一步详细定义分配给软件的系统元素。可以用以下两种方式中的一种对需求进行分析和定义。一种是正式的信息域分析,可用于建立信息流和信息结构的模型,然后逐渐扩充这些模型成为软件的规格说明。另一种是软件原型化方法,即建立软件原型,并由用户进行评价,从而确定软件需求。 (3) 软件设计 :软件的设计过程分两步走。第一步进行概要设计,以结构设计和数据设计开始,建立程序的模块结构,定义接口并建立数据结构。第二步做详细设计,考虑设计每一个模块部件的过程描述。经过评审后,把每一个加细的过程性描述加到设计规格说明中去。 (4) 程序编码 :在设计完成之后,用一种适当的程序设计语言或CASE工具生成源程序。应当就风格及清晰性对代码进行评审,而且反过来应能直接追溯到详细设计描述。 (5) 软件测试 :单元测试检查每一单独的模块部件的功能和性能。组装测试提供了构造软件模块结构的手段,同时测试其功能和接口。确认测试检查所有的需求是否都得到满足。在每一个测试步骤之后,要进行调试,以诊断和纠正软件的故障。(6) 软件维护 :为改正错误,适应环境变化及功能增强而进行的一系列修改活动。与软件维护相关联的那些任务依赖于所要实施的维护的类型。试论述瀑布模型软件开发方法的基本过程,比较它的优点和缺点。解答:瀑布模型规定了各项软件工程活动,包括:制定软件项目计划,进行需求分析和定义,软件设计,程序编码,测试及运行维护。并且规定了它们自上而下,相互衔接的固定次序,如同瀑布流水,逐级下落。瀑布模型为软件开发和软件维护提供了一种有效的管理图式。根据这一图式制定开发计划、进行成本预算、组织开发力量,以项目的阶段评审和文档控制为手段有效地对整个开发过程进行指导,从而保证了软件产品及时交付,并达到预期的质量要求。瀑布模型的缺点是缺乏灵活性,特别无法解决软件需求本身不明确或不准确的问题。这些问题的存在对软件开发会带来严重影响,最终可能导致开发出的软件并不是用户真正需要的软件,并且这一点在开发过程完成后才有所察觉。面对这些情况,无疑需要进行返工或是不得不在维护中纠正需求的偏差。但无论上述哪一种情况都必须付出高额的代价,并将为软件开发带来不必要的损失。 试说明演化模型软件开发方法的基本过程,比较它的优点和缺点。解答:由于在项目开发的初始阶段人们对软件的需求认识常常不够清晰,因而使得开发项目难于做到一次开发成功,出现返工再开发在所难免。因此,可以先做试验开发,其目标只是在于探索可行性,弄清软件需求;然后在此基础上获得较为满意的软件产品。通常把第一次得到的试验性产品称为“原型”。 演化模型从需求分析开始。软件开发人员与用户一起定义待开发软件系统的总目标,定义需求,确定软件的工作范围。然后快速设计软件中对使用者可见部分的表示,进而建造原型,再让用户或客户评估原型,根据评估结果,修改和细化待开发软件系统的需求,使之满足用户的需求。这个过程是一个迭代的过程。演化模型的优点是: 演化模型能够得到更好的软件需求,它不仅能够处理模糊的需求,而且开发人员与用户可通过原型充分进行交流; 演化模型给用户提供了机会,以更改用户原来设想的不尽合理的最终系统; 演化模型使得开发出来的最终系统更容易维护,对用户更友好; 演化模型可以降低总的开发费用,缩短开发时间。演化模型的缺点是: 对于开发人员不熟悉的领域,演化模型可能误导开发者把系统的次要部分当作主要框架,作出不切题的原型; 原型过快地收敛于需求集合,使得某些基本方面被忽视; 长期在原型环境下开发,只注意得到令人满意的原型,容易“遗忘”用户环境与实际客户环境之间的差别。5、软件工程包括哪些基本要素?请简要说明这些要素及其作用。 答案要点: 软件工程包括过程、方法和工具三个要素。 软件工程过程定义了技术方法的采用、工程产品(包括模型、文档、数据、报告、表格等)的产生、里程碑的建立、质量的保证和变更的管理,从而将人员、技术、组织与管理有机地结合在一起,实现在规定的时间和预算内开发高质量软件的目标; .软件工程方法为软件开发提供了“如何做”的技术,通常包括某种语言或图形的模型表示方法、良好的设计实践以及质量保证标准等; . 软件工程工具为软件工程方法提供了自动的或半自动的软件支撑环境,辅助软件开发任务的完成。现有的软件工具覆盖了从需求分析、系统建模、代码生成、程序调试和软件测试等多个方面,形成了集成化的软件工程开发环境 CASE。6. 软件与其他工程学科所产生的制品有什么根本区别? 答案要点: (1) 软件是人类思维和智能所延伸的产物,其数据、状态和逻辑关系的组合以及人类思维的复杂性和不确定性导致它本身具有极高的复杂性;(2) 软件具有不可见性,它是抽象的,形式化和逻辑化的。 (3) 软件具有可变性,有用的软件需要不断地修改和扩展,但是频繁的修改可能导致软件的退化;(4) 软件的开发在很大程度上依然是手工作坊式的,难以实现工厂化的生产。7. 软件工程是以系统的、可控的、有效的方式产生高质量的软件,请说明你对“高质量软件”含义的理解。 软件质量是软件产品与明确的和隐含的需求相一致的程度,它通常由一系列的质量特性来进行描述,包括正确性、可靠性、有效性、可用性、复用性、可维护性、可移植性等。例如,除了要求软件正确运行之外,人们可能还希望软件运行的响应时间符合要求、软件使用方便快捷、程序代码易于理解等,而“程序代码易于理解”往往是一种用户没有明确提出的需求,但却是影响软件演化的重要因素。8. 某大学准备开发一个新的学生注册选课系统,以替换一个现有的系统。请设计一个适用于该系统开发的过程模型,并进一步描述该模型。 答案要点: 假设原有的学生注册课程系统是由学生手工提交书面选课单,教师手工提交成绩单,教务管理人员在客户端录入学生选课结果和课程成绩;而在新的选课系统中,所有用户在自己的计算机上通过 Internet 访问和操作该系统,该软件系统需要更新服务器和数据库等系统,并扩充一些新功能和提高系统性能。 从该系统的具体情况来看,系统的需求是比较容易明确的,整个系统的结构需要重新设计,但是原有的遗留系统中有些部分是可以重用的,因此我们可以采用组件模型实施软件开发: 系统需求分析:由于该系统是现有系统的扩展,因此首先可以经过一个简单的需求分析阶段,从而确定新系统的需求。 遗留系统分析:在需求确定的基础上,开发人员分析遗留系统并研究新系统的总体结构,选择重用原有的课程信息管理部分,重新开发选课部分,必要时适当修改系统需求,最终确定系统需求和总体结构。 设计开发阶段:开发人员进一步设计相关子系统,将原有的课程信息管理部分封装为子系统,重新开发学生选课子系统,并实现与外部付费系统的接口。 系统测试阶段:开发人员将所有子系统集成在一起,交给测试人员开始全面的功能测试和性能测试。根据所报告的测试问题,开发人员调试和修改程序。 系统交付阶段:测试通过后,开发人员将系统及其相关文档交付用户验收。四、需求分析四、问答题1、 在软件需求分析时,首先建立当前系统的物理模型,再根据物理模型建立当前系统的逻辑模型。试问:什么是当前系统?当前系统的物理模型与逻辑模型有什么差别?解答:所谓当前系统可能是需要改进的某个已在计算机上运行的数据处理系统,也可能是一个人工的数据处理过程。当前系统的物理模型客观地反映当前系统实际的工作情况。但在物理模型中有许多物理的因素,随着分析工作的深入,有些非本质的物理因素就成为不必要的负担,因而需要对物理模型进行分析,区分出本质的和非本质的因素,去掉那些非本质的因素即可获得反映系统本质的逻辑模型。所以当前系统的逻辑模型是从当前系统的物理模型抽象出来的。2、 可行性研究主要研究哪些问题?试说明之。解答:可行性研究主要做4个方面的研究:经济可行性 :进行成本效益分析。从经济角度判断系统开发是否“合算”。技术可行性 :进行技术风险评价。从开发者的技术实力、以往工作基础、问题的复杂性等出发,判断系统开发在时间、费用等限制条件下成功的可能性。法律可行性 :确定系统开发可能导致的任何侵权、妨碍和责任。方案的选择 :评价系统或产品开发的几个可能的候选方案。最后给出结论意见。3、 数据流图的作用是什么?它有哪些基本成份数据流图的基本成份有4种:4、Petri网可以描述计算机软件系统的执行。现有一个程序如下(类似于Pascal语言)L :S1;WHILE P1 DOBEGIN IF P2 THEN S2ELSE S3; COBEGINS4;S5;S6; COEND END;GOTO L;其中,P1和P2为逻辑表达式,S1,S6是单个执行语句,COBEGIN和COEND是并行执行开始和并行执行结束(即S4,S5和S6语句并行执行)。试用Petri网描述这段程序的执行过程解答:采用条件事件网(CE网,CCondition, EEvent)式Petri网。其定义如下:当事件e激发时条件c开始成立,则称c是e的后继。此关系用“ ”表示;当事件e激发时条件c消失成立,则称c是e的前驱。此关系用“ ”表示;当事件e激发时条件c不受影响,则c和e之间没有前驱、后继关系,无边。根据定义,给定程序的CE网如下:5、 软件需求分析说明书主要包括哪些内容?解答:软件需求规格说明是分析任务的最终产物,通过建立完整的信息描述、详细的功能和行为描述、性能需求和设计约束的说明、合适的验收标准,给出对目标软件的各种需求。软件需求规格说明的框架如下:6. 需求工程包括哪些基本活动?每一项活动的主要任务是什么? 答案要点: 需求工程分为需求开发和需求管理两个部分,而需求开发又可进一步分为需求获取、需求分析、规格说明和需求验证四个阶段。这些基本活动的主要任务包括: (1) 需求获取:采集、识别和提取用户的需求,对问题和需求形成文档化的描述,使各种人员达成一致的理解和认可。 (2) 需求分析:分析和综合所采集的信息,建立系统的详细逻辑模型。 (3) 需求规格说明:编写软件需求规格说明书,明确、完整和准确地描述已确定的需求。 (4) 需求验证:评审软件需求规格说明,以保证其正确性、一致性、完备性、准确性和清晰性。(5) 需求管理:定义需求基线,在整个项目过程中跟踪需求状态及其变更情况。7. 请比较本章介绍的几种主要需求获取技术,说明每一种技术的优缺点和适用场合。答案要点: (1) 用户面谈 优点:可以与项目相关人员一对一地进行交谈和讨论;具有私密性,使被访者可以直率地和无隐瞒地回答问题;便于探查一些附加信息或反馈信息;有利于与客户建立良好的关系。 缺点:面谈是一种非常费时和高成本的方式;难以解决不同的项目干系人之间的冲突和矛盾; 在地理位置相距较远的情况下很难实施。 适用场合: 适用于在初步理解整体概念的情况下讨论和交流一些细节问题。 (2) 需求专题讨论会 优点:有助于了解系统需求;有利于共享系统开发的成果;给用户一种主人的感觉; 可以与足够多的项目干系人进行讨论和交流,且节省时间; 支持头脑风暴式的讨论。 缺点: 需要占用参与人员比较长的整块时间;主持人的能力和会议的准备工作必须是非常好的,否则结果很糟。 适用场合: 适用于讨论和审查软件系统方案和模型,解决不同项目干系人之间的冲突和矛盾。 (3) 观察用户工作流程 优点: 通过直接观察的方式提取用户或系统的特性; 有助于理解难以用语言描述清楚的复杂业务。 缺点: 观察可能使用户紧张,从而表现得与往常不同。适用场合:适用于理解难以用语言描述清楚复杂业务过程。(4) 原型化方法 优点: 通过一个可以运行的软件原型直观地理解和澄清问题,便于使开发人员与用户达成共识。 缺点: 用户容易产生误解,认为软件系统可以在原型的基础上很容易地构建,但实际上该原型的内部结构和程序质量比较差。 适用场合: 适用于用户需求不明确或描述不清楚的情况。8. 哪些人应该参与需求评审?请画出一个需求评审的组织过程模型。 答案要点: 通常情况下,参与需求评审的人员应该包括需求分析员、项目经理、体系架构设计师、软件设计工程师、系统测试工程师、质量保证员、用户或市场代表、文档编写人员、领域专家和技术支持代表。 9. 在某些紧急情况下,软件可能在需求变更请求被批准之前就进行修改。请给出一个修改过程模型,确保需求文档和系统实现不会产生不一致。 答案要点: 一般来说,应该尽量避免在需求变更请求被批准之前就直接修改程序的情况,这很容易导致变更失控而且需求描述与系统实现不一致。一旦出现这种情况,必须在系统变更完成后重新执行需求跟踪控制。五、面向对象四、问答题1、什么叫面向对象?面向对象方法的特点是什么?为什么要用面向对象方法开发软件解答:关于“面向对象”,有许多不同的看法。Coad和Yourdon给出了一个定义:“面向对象 = 对象 + 类 + 继承 + 消息通信”。如果一个软件系统是使用这样4个概念设计和实现的,则认为这个软件系统是面向对象的。面向对象方法的特点是: 方法的唯一性,即方法是对软件开发过程所有阶段进行综合考虑而得到的。 从生存期的一个阶段到下一个阶段的高度连续性,即生存期后一阶段的成果只是在前一阶段成果的补充和修改。 把面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)集成到生存期的相应阶段。 使用面向对象方法开发软件的好处是: 开发方法的唯一性,开发阶段的高度连续性,表示方式的一致性; 问题空间实体的自然表示,减轻了设计者的负担,在设计系统之初不必考虑一个很完整的解决方案。 建立稳定的系统结构,可促进复用性,易于维护,易于修改,可合理利用共同性,减少复杂性。2、什么是“对象”?识别对象时将潜在对象分成7类,试给出这7类对象的名称,并举例说明 解答:对象的定义: 对象是面向对象开发模式的基本成分,是现实世界中个体或事物的抽象表示。 每个对象可由一组属性和它可以执行的一组操作来定义。 可能的潜在对象有7类: 外部实体:它们产生或接受为目标系统所使用的信息。如各种物理设备、使用人员、其它相关的子系统。 事物:问题的信息域所涉及的概念实体。如各种报告、显示、文字、信号、规格说明等。 事件:系统运行时发生的并需要系统记忆的事件。如状态转换、物理运动等。 角色:与系统有交互的各种人员所扮演的角色。如经理、工程师、销售人员等。 场所或位置:建立系统整体环境或问题上下文的场所、位置。如基于计算机的系统的安装场所等。 部门等。组织,组织机构:与应用有关的组织机构。如 结构:定义由一组成分对象组成的聚合对象,或在极端情况下,定义对象的相关类。如传感器、四轮驱动车、计算机等。3、什么是“类”? “类”与传统的数据类型有什么关系?有什么区别 解答:把具有相同特征和行为的对象归在一起就形成了类。类成为某些对象的模板,抽象地描述了属于该类的全部对象的属性和操作。属于某个类的对象叫做该类的实例。对象的状态则包含在它的实例变量,即实例的属性中。类定义了各个实例所共有的结构,类的每一个实例都可以使用类中定义的操作。实例的当前状态是由实例所执行的操作定义的。 类,就它是一个数据值的聚合的意义上来看,与Pascal中的记录或C中的结构类似,但又有差别。类扩展了通常的记录语义,可提供各种级别的可访问性。也就是说,记录的某些成份可能是不可访问的,而这些成份对于本记录型来说具有可访问性。类不同于记录,因为它们包括了操作的定义,这些操作与类中声明的数据值有相同的地位。4、基于复用的面向对象开发过程分为哪几个阶段?每一个阶段需要做哪些事情 ? 解答:基于复用的面向对象开发过程分为6个阶段,如图中虚线框所围。 论域分析 :论域分析开发问题论域的模型。论域分析应当在应用分析之前进行,我们在了解问题之前应当对问题敞开思想考虑,考察问题论域内的一个较宽的范围,分析覆盖的范围应比直接要解决的问题更多。 应用分析 :应用(或系统)分析细化在论域分析阶段所开发出来的信息,并且把注意力集中于当前要解决的问题。因为通过论域分析,分析人员具有了较宽的论域知识,因而能开发出更好的抽象。 高层设计 :在一个纯面向对象环境中,软件体系结构设计与类设计常常是同样的过程,但还是应当把体系结构设计与类的设计分开。在高层设计阶段,设计应用系统的顶层视图。这相当于开发一个代表系统的类,通过建立该类的一个实例并发送一个消息给它来完成系统的“执行”。 类的开发 :根据高层设计所标识的对各个类的要求和类的规格说明,进行类的开发。因为一个应用系统往往是一个类的继承层次。对这些类的开发是最基本的设计活动。 实例的建立:建立各个对象的实例,实现问题的解决方案。 组装测试:按照类与类之间的关系组装一个完整的应用系统的过程中进行的测试。各个类的封装和类测试的完备性可减少组装测试所需要的时间。5、 按照类生存期,类的开发有哪几种方式?每一种方式需要做哪些事情?解答:按照下图所示的类生存期,类的开发有三种方式。 (1) 既存类的复用 只要有可能就应复用既存类。为了达到此目的,开发人员必须能够找到这样一些类,它们都能选用来提供所需要的行为。有时应用要解决的问题与以前遇到的一些问题密切相关,因此那些问题中定义和实现的类可以复用。然而,多数照原样复用被限制在低层上最基本的类,像基本数据结构。对于较一般的结构,可以在实例化时,使用参数来规定它们的行为。 (2) 从既存类进行演化 多数复用情况是一个类已经存在,它提供的行为类似于要为新类定义的行为。开发人员可以使用既存类做为定义新类的起点。新类将根据既存类渐进式地演变而成。这样,在开发一个新类时,只需要花费较少的工作量就能复用许多既存类,得到所需要的新类。演化可以是横向的,也可以是纵向的。横向的演化导致既存类的一个新的版本,而纵向的演化将从既存类导出新类。我们在这里将主要讨论类的纵向渐进式开发。 渐进式设计。设计既存类的一个特殊化类。通过确定新类中打算要的所有成员,设计者可以确定哪些追加的行为可以加到类中去,哪些既存的行为应当重新实现。 渐进式实现。许多实现可以从既存类直接继承;有时可以仅使用很少的新代码就能利用既存类的实现,而这些新代码必须当做老方法的上文或下文进行编写。此外,在渐进式设计阶段增加的那些行为也必须实现。 渐进式测试。在测试中最花费时间的就是测试用例的生成。许多新类的测试用例可以从既存类的测试用例组中得到。新类的某些部分因为在测试既存类时已经测试过,因此可以不再需要测试。 (3) 从废弃型进行开发 这个分支仅在不得已的情况下使用。任何一个类,只要它的开发不涉及既存类,就可看做是一个新的继承结构的开始。因此,将建立两种类:一种是抽象类,它概括了将要表达的概念;另一种是具体类,它要实现这个概念。 设计。设计阶段需把分析阶段所产生的界面当做输入,并确定类的其它属性。设计给出类的所有细节。这个阶段的输出是有关类的属性的足够的细节,可支持它们的实现。单个类的设计包括构造数据存储,它是类定义的核心。其内部表示还包括一些私有函数,它们实现了共有操作的某些部分。单个类的低层设计还涉及一些重要联系,如继承和组装关系。 实现。通过变量的声明、操作界面的实现及支持界面操作的函数的实现,可实现一个类的预期行为和状态。在变量中存储的数据通常是其它类的实例,它们提供了为该类的开发所需的服务。 测试。单个的类为测试提供了自然的单元。如果类的定义提供的界面比较狭窄,那么穷举测试就有可能实现。类的测试在最抽象的层次开始,沿继承联系继续向下进行,新的类可以很容易地完全地被测试,而已经测试过的部分就不需要从新测试了。 (4) 求精和维护 传统的维护活动是针对应用的,而求精过程则是针对类,并把类链接在一起的结构的。因为我们利用抽象进行开发,因此,维护部分在任一时间都能修改这些抽象。随着经验的增长,我们可以够标识抽象的抽象,使得继承结构通过泛化增加新的层次,即在既存的根类之上增加新的层次。8、 建立分析和设计模型的一种重要方法是UML。试问UML是一种什么样的建模方法?它如何表示一个系统解答:UML叫做统一的建模语言,它把Booch、Rumbaugh和Jacobson等各自独立的OOA和OOD方法中最优秀的特色组合成一个统一的方法。UML允许软件工程师使用由一组语法的语义的实用的规则支配的符号来表示分析模型。 在UML中用5种不同的视图来表示一个系统,这些视图从不同的侧面描述系统。每一个视图由一组图形来定义。这些视图概述如下: 用户模型视图 :这个视图从用户(在UML中叫做参与者)角度来表示系统。它用使用实例(use case)来建立模型,并用它来描述来自终端用户方面的可用的场景。 结构模型视图 :从系统内部来看数据和功能性。即对静态结构(类、对象和关系)模型化。 行为模型视图 :这种视图表示了系统动态和行为。它还描述了在用户模型视图和结构模型视图中所描述的各种结构元素之间的交互和协作。 实现模型视图 :将系统的结构和行为表达成为易于转换为实现的方式。 环境模型视图 :表示系统实现环境的结构和行为。 通常,UML分析建模的注意力放在系统的用户模型和结构模型视图,而UML设计建模则定位在行为模型、实现模型和环境模型。10、 在类的设计中需要遵循的方针是什么?三个主要的设计准则:抽象、信息隐蔽和模块化如何才能作到解答:在设计类时需要遵循的方针是: 信息隐蔽:通过信息隐蔽可保护类的存储表示不被其它类的实例直接存取。 消息限制:该类实例的用户应当只能使用界面提供的操作。 狭窄界面:只有对其它类的实例是必要的操作才放到界面上。 强内聚:模块内部各个部分之间应有较强的关系,它们不能分别标识。 弱耦合:一个单独模块应尽量不依赖于其它模块。 显式信息传递:两个类之间的交互应当仅涉及显式信息传递。 派生类当做派生类型:每个派生类应该当做基类的特殊化来开发,而基类所具有的公共界面成为派生类的共有界面的一个子集。 抽象类:某些语言提供了一个类,用它做为继承结构的开始点,所有用户定义的类都直接或间接以这个类为基类。 为了在类的设计中做到抽象、信息隐蔽和模块化: 以类作为系统的基本模块单元,通过一般化特殊化关系和整体部分关系,搭建整个系统的类层次结构,实现数据抽象和过程抽象; 将数据和相关的操作封装在类内部,建立共有、私有和子类型等存取级别,将数据表示定义成为类的私有成员,实现信息隐蔽。 通过建立类属性(类模板),将某些有可复用要求的类设计成在数据类型上通用的可复用的软件构件,这样有助于实现模块化。11、解答:在类的通过复用的设计中,主要的继承关系有两大类: 配置:利用既存类来设计类,可能会要求由既存类的实例提供类的某些特性。通过把相应类的实例声明为新类的属性来配置新类。例如,一种仿真服务器可能要求使用一个计时器来跟踪服务时间。设计者不必开发在这个行为中所需的数据和操作,而是应当找到计时器类,并在服务器类的定义中声明它。 但如果使用既存类的内部表示来做为新类的内部表示的一部分,这是一种“针对实现”的继承方式,这种继承方式不好。例如,考虑使用继承来实现一个Circle类。Point类可支持Circle类的一部分实现。为了定义一个圆,我们只需要定义一个点和一个值,做为圆的圆心和半径。把Point当做子类,Circle类不但能得到由x和y提供的圆心,而且还能得到一个操作,让圆能够自由移动。但这样做,我们失去了抽象。 演变 :要开发的新类可能与一个既存类非常类似,但不完全相同。此时可以从一个既存类演变成一个新类,可以利用继承机制来表示一般化特殊化的关系。特殊化处理有三种可能的方式。 如果新的概念是一个既存类所表示概念的一个特殊情况,特殊化运算可以从该既存类的定义产生新类的初始构造,这是典型的类继承的使用。既存类A的数据结构和操作可以成为新类B的一部分,如图(a)所示。既存类A的公共操作成为新类B的共有界面部分。 如果新类比软件库中那些既存类更一般,则新类B不具有既存类A的全部特性,一般化运算把两个类中共同的特性移到新的更高层的类中,高一层的类是B,我们将要设计它。原来的类A成为新类B的子类。如图(b)所示。 一个既存类A与我们设计的新类B共享概念的某一个部分,则两个概念的共同部分形成新类的基础,且既存类与新类两者成为子类,如图(c)所示。12. 请解释下列术语,并举例说明之。 对象、类、属性、操作、关联、泛化、聚合、依赖 参考答案: (1) 对象(Object) 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。 举例:中国就是一个对象。 (2) 类(Class) 类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,包括属性和服务两个主要部分。举例:学生、人、树木等都是类。 (3) 属性(Attribute) 属性是用来描述对象静态特征的一个数据项。 举例:学生具有姓名、性别、年龄等属性。 (4) 操作(Operation) 操作是类的实例被要求执行的服务,具有名字和参数列表。 举例:学生具有入学注册、选课等操作。 (5) 关联(Association) 关联是一种结构关系,说明一个事物的对象与另一个事物的对象之间的联系。 举例:学生与课程之间的关系就是关联,一个学生可以选修多门课程,一门课程也可以被多个学生选修。 (6) 泛化(Generalization) 泛化是一种一般事物(父类)和特殊事物(子类)之间的关系。 举例:学生与研究生之间是泛化关系,研究生是一类特殊的学生。(7) 聚合(Aggregation) 聚合是一种特殊类型的关联,描述了整体和部分间的结构关系。 举例:学校和系之间存在聚合关系,系是学校的一个组成部分。 (8) 依赖(Dependency) 依赖是一种使用关系,描述了一个事物发生变化会影响到另一个使用它的事物。 举例:课程表使用课程,二者之间是依赖关系。13. 面向对象分析包括哪些活动?应该建立哪些类型的模型? 参考答案: 面向对象分析的主要活动包括理解用例模型、识别分析类、定义交互行为、建立分析类图以及评审分析模型等。面向对象分析应该建立功能模型、分析对象模型和动态模型等三种类型,其中功能模型由用例和场景表示,分析对象模型由类图和对象图表示,动态模型由状态图和顺序图表示。14. 什么是实体类、边界类和控制类?为什么将分析类划分成这三种类型? 参考答案: 实体类用于描述必须存贮的信息及其相关行为;边界类用于描述外部参与者与系统之间的交互;控制类用于描述一个用例所具有的事件流控制行为。将分析类划分成这三种类型的好处在于:所产生的类更小更专门化;这种划分将易变的外部界面与系统基本功能进行了屏蔽,使分析模型更易于变化。 15. 面向对象设计与面向对象分析的区别是什么?设计包括哪些活动? 答案要点: 面向对象分析是重点考虑系统“做什么”的问题,即运用面向对象方法对问题域进行分析和理解,建立系统的分析模型;面向对象设计重点考虑系统“怎样做”的问题,即在分析模型的基础上形成实现环境下的设计模型。 面向对象设计主要涉及系统设计、对象设计(或详细设计)、数据库设计和用户界面设计等活动。五、应用题1、建立窗口系统的对象模型,问题陈述如下: “窗口分为对话窗、图形窗、滚动窗三种。对话窗中有若干对话项,由唯一的项名字来确定;对话项分为按钮、选择项和正文项三种,选择项中有若干选择项入口。图形窗中有若干形状元素,形状元素分为一维形状和二维形状。一维形状又分为直线、圆弧、折线;二维形状分为圆、椭圆、矩形、多边形,其中折线与多边形由若干有序顶点组成。正文窗是滚动窗的一种,而图形滚动窗既是图形窗又是滚动窗。解答: 对象模型应由对象图和数据词典组成。根据题意,先给出对象图。 窗口类与对话窗类、图形窗类、滚动窗类是一般化?特殊化关系。 对话窗类与对话项类是限定关联,限定词是对话项名。 对话项类与按钮类、选择项类、正文项类是一般化?特殊化关系。 选择项类与选择项入口类是一对多的拥有关联。 图形窗类与形状元素类也是一对多的拥有关联。 形状元素类与一维形状、二维形状是一般化?特殊化关系。 一维形状类与直线类、圆弧类、折线类是一般化?特殊化关系。 折线类与顶点类是整体-部分关系。 二维形状类与圆类、椭圆类、矩形类、多边形类是一般化?特殊化关系。 多边形类与顶点类是整体-部分关系,一个多边形至少有3个顶点。 正文窗类与滚动窗类是一般化?特殊化关系。 图形滚动窗类的父类是图形窗类和滚动窗类,这是一个多继承关系。 对应的窗口系统的数据词典 2、 在学校教学管理系统中,学生查询成绩就是系统中的一次交互,请用状态图来描述这种交互的行为解答:首先建立事件追踪图,用于描述用户与系统的一次交互行为。在图中,按时间的先后次序以及事件的发送和接收顺序,自上而下画出。 根据事件追踪图建立的状态图如下: 五、软件设计四、问答题1、逐步求精、分层过程与抽象等概念之间的相互关系如何?解答:“自顶向下,逐步求精”是Niklaus Wirth提出的设计策略:即将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。这样的结构实际就是一个模块的分层结构,即分层的过程。在实施时,采用抽象化的方法,自顶向下,给出不同的抽象层次。在最高的抽象层次上,可以使用问题所处环境的语言概括地描述问题的解法。而在较低的抽象层次上,则采用过程化的方法。在描述问题的解法时,我们可以配合使用面向问题的术语和面向现实的术语。但最后在最低的抽象层次上,我们应使用能够直接实现的方式来描述这个解法。2、 完成良好的软件设计应遵循哪些原则?解答:软件设计既是过程又是模型。设计过程是一系列迭代的步骤,使设计人员能够描述被开发软件的方方面面。设计模型体现了自顶向下、逐步细化的思想,首先构造事物的整体,再逐步细化,引导人们构造各种细节。为了给软件设计人员提供一些指导,1995年Davis提出了一系列软件设计的原则如下,其中有些修改和补充: 设计过程不应受“隧道视野”的限制。一位好的设计者应当考虑一些替代的手段。根据问题的要求,可以用基本的设计概念,如抽象、逐步求精、模块化、软件体系结构、控制层次、结构分解、数据结构、软件过程、信息隐蔽等,来决定完成工作的资源。 设计应能追溯到分析模型。由于设计模型中每一单个成份常常可追溯到多个需求上,因此有必要对设计模型如何满足需求进行追踪。 设计不应当从头做起。系统是使用一系列设计模式构造起来的,很多模式很可能以前就遇到过。这些模式通常被称为可复用的设计构件。可以使用它们代替那些从头开始做的方法。时间短暂而资源有限!设计时间应当投入到表示真正的新思想和集成那些已有的设计模式上去。 设计应当缩短软件和现实世界中问题的“智力差距”,就是说,软件设计的结果应尽可能模拟问题领域的结构。 设计应具有一致性和集成性。如果一个设计从整体上看像是一个人完成的,那它就是一致的。在设计工作开始之前,设计小组应当定义风格和格式的规则,如果仔细定义了设计构件之间的接口,则该设计就是集成的。 使用上述的基本的设计概念,将设计构造得便于将来的修改。 应将设计构造得即使遇到异常的数据、事件或操作条件,也能平滑地、轻松地降级。设计良好的计算机程序应当永不“彻底停工”,它应能适应异常的条件,并且当它必须中止处理时也能以从容的方式结束。 设计不是编码,编码也不是设计。即使在建立程序构件的详细的过程设计时,设计模型的抽象级别也比源代码要高。在编码级别上作出的唯一设计决策是描述如何将过程性设计转换为程序代码的小的实现细节。 在开始着手设计时就应当能够评估质量,而不是在事情完成之后。利用上述的基本的设计概念和已有的设计方法,可以帮助设计者评估质量。 应当坚持设计评审以减少概念上(语义上)的错误。有时人们在设计评审时倾向于注重细节,只见树木不见森林。在关注设计模型的语法之前,设计者应能确保设计的主要概念上的成份(的遗漏、含糊、不一致)都已检查过。3、 如何理解模块独立性?用什么指标来衡量模块独立性?解答:如果两个模块互相独立,那么对其中一个模块进行编码、测试或修改时可以完全不考虑另一个模块对它的影响。因此,用模块独立性作为衡量模块结构是否容易编码、容易测试、容易修改的标准是合适的。但是,在一个系统的模块结构中没有哪两个模块可以完全独立,所以,要力争模块之间尽量独立,以得到一个质量良好的模块结构。一般采用两个准则度量模块独立性。即模块间的耦合和模块的内聚。模块间的耦合是模块之间的相对独立性(互相连接的紧密程度)的度量。模块之间的连接越紧密,联系越多,耦合性就越高,而其模块独立性就越弱。内聚是模块功能强度(一个模块内部各个成份彼此结合的紧密程度)的度量。一个模块内部各个成份之间的联系越紧密,则它的内聚性就越高,相对地,它与其它模块之间的耦合性就会减低,而模块独立性就越强。因此,模块独立性比较强的模块应是高内聚低耦合的模块。一般模块之间可能的连接方式有七种,构成耦合性的七种类型。它们之间的关系为 低耦合的情形有非直接耦合、数据耦合和标记耦合,它们都是比较好的模块间的连接。特点是模块间的接口简单、规范。中度耦合的情形有控制耦合,它通过参数表传递控制参数。相对高的耦合情形有外部耦合和公共耦合,它们都是通过全局数据传递模块间的信息,不是说它们一定“坏”,但一定要注意使用这类耦合可能产生的后果,特别要防范这种后果。一般模块的内聚性分为七种类型,它们的关系如下图所示。 在上面的关系中可以看到,位于高端的几种内聚类型最好,位于中段的几种内聚类型是可以接受的,但位于低端的内聚类型很不好,一般不能使用。因此,人们总是希望一个模块的内聚类型向高的方向靠。模块的内聚在系统的模块化设计中是一个关键的因素。内聚和耦合是相互关联的。在程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。但这也不是绝对的。我们的目标是力求增加模块的内聚,尽量减少模块间的耦合,但增加内聚比减少耦合更重要,应当把更多的注意力集中到提高模块的内聚程度上来。4、 模块独立性与信息隐蔽(反映模块化有效程度的属性)有何关系?解答:所谓“模块独立性”是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其它的模块的接口是简单的。所谓的“信息隐蔽”是指每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。如果软件系统做到了信息隐蔽,即定义和实施了对模块的过程细节和局部数据结构的存取限制,那么这些模块相互间的接口就是简单的。这组模块的独立性就比较强。事实上,衡量模块独立性的一个准则就是模块内聚,达到信息隐蔽的模块是信息内聚模块,它是高内聚情形,模块独立性当然很强了。一个对象的抽象数据类型,就是信息隐蔽的示例。例如,对于栈stack, 可以定义它的操作makenull(置空栈)、push(进栈)、pop(退栈)、gettop(取栈顶)和empty(判栈空)。这些操作所依赖的数据结构是什么样的? 它们是如何实现的? 都被封装在其实现模块中。软件的其它部分可以直接使用这些操作,不必关心它的实现细节。一旦实现栈stack的模块里内部过程或局部数据结构发生改变,只要它相关操作的调用形式不变, 则软件中其它所有使用这个栈stack的部分都可以不修改。 这样的模块结构具有很强的模块独立性。5、 模块的内聚性程度与该模块在分层结构中的位置有关系吗?说明你的论据解答:模块的内聚性与该模块在分层模块结构中的位置无关。事实上,一个好的模块化的程序系统,它所有的模块可以都是功能内聚的,即每一个模块就只干了一件事。用结构化设计方法建立起来的模块结构中的每一个模块都符合这个要求。把讨论范围再拓宽点,在纯面向对象范型的软件系统中,整个系统看作是一个类,它的子类可以看作是系统的子系统或高层模块,它们还可以有子类,这就形成一个类的层次结构。类的构造可以看成是一个抽象数据类型,实际上是信息内聚的。所以整个系统中从上到下,所有模块(对象类)都是信息内聚的模块。6、 耦合性的概念和软件的可移植性有什么关系?请举例说明你的论述解答:所谓“耦合性”是指模块之间联系的紧密程度的一种度量,而软件的“可移植性”是指将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行时所需工作量的大小。可移植性是用一组子特性,包括简明性、模块独立性、通用性、可扩充性、硬件独立性和软件系统独立性等,来衡量的。如果一个软件具有可移植性,它必然耦合性低,这样模块独立性要强。例如,有一个图形处理软件,它应具有二维几何图形处理、三维几何图形处理、图形显示、外设控制、数据库管理、用户界面控制、设计分析等模块。如果这些模块之间都是通过参数表来传递信息,那么它们之间的的耦合就是数据耦合或标记耦合等,都是低耦合。将来如果想要把它们移植到另一个外部环境中,这些模块容易修改(功能内聚),且接口清晰,修改可局部化。反言之,如果这些模块都是功能内聚或信息内聚的模块,模块之间的耦合都是低耦合,也对可移植性有促进。但不能讲具有低耦合性模块结构的软件一定具有可移植性,因为是否具有可移植性还有其它因素的影响。7、 递归模块(即自己调用自己的模块)的概念如何能够与本章所介绍的设计原理与方法相适应解答:递归过程在求解复杂的大型问题时非常有效。常用的求解问题的方法,一种叫做“分而治之”的策略和“回溯”的策略,都可以用递归方法来解决。所谓“分而治之”的方法即是把大而复杂的问题化为规模稍小的子问题,用同样方法求解。如果分解后的子问题能够直接解决,就直接解出,然后再回推得到原来问题的解。所谓“回溯”方法就是如果一个大的问题在求解过程中从某一步出发有可选的多种解决方案,先选择一种解决方案,试探求解。如果求解失败,撤消原来的选择,再选一种解决方案,试探求解,。如果用某一方案求解成功,则退回上一步并报告这一步求解成功;如果所有可选方案都试过,都求解失败,则退回上一步并报告求解失败。 软件设计过程中的“自顶向下,逐层分解”的做法与上述求解问题的策略是一致的。如果分解出来的子问题(子功能、子模块)相互独立性比较强,这种分解可以降低模块的复杂性,做到模块化。所以,只要分解出来的子问题与原来问题满足递归的情况,用递归方法建立模块结构也是可行的。8、 举例说明你对概要设计与详细设计的理解。有不需要概要设计的情况吗?解答:软件设计是一个把软件需求变换成软件表示的过程。最初这种表示只是描绘出软件的总的框架,然后进一步细化,在此框架中填入细节,把它加工成在程序细节上非常接近于源程序的软件表示。正因为如此,所以从工程管理的角度来看,软件设计分两步完成。首先做概要设计,将软件需求转化为数据结构和软件的系统结构。然后是详细设计,即过程设计。通过对结构表示进行细化,得到软件的详细的数据结构和算法。 由于概要设计建立起整个系统的体系结构框架,并给出了系统中的全局数据结构和数据库接口,人机接口,与其它硬、软件的接口。此外还从系统全局的角度,考虑处理方式、运行方式、容错方式、以及系统维护等方面的问题,并给出了度量和评价软件质量的方法,所以它奠定了整个系统实现的基础。没有概要设计,直接考虑程序设计,就不能从全局把握软件系统的结构和质量,实现活动处于一种无序状态,程序结构划分不合理,导致系统处于一种不稳定的状态,稍一做改动就会失败。所以,不能没有概要设计。9. 良好的软件体系结构设计有什么好处? 答案要点: 软件体系结构设计过程的核心在于建立系统的一个基本框架,即识别出系统的主要组件以及这些组件之间的通信。 良好的体系结构设计具有以下主要好处: 项目相关人员之间的沟通:软件体系结构是系统的一种高层表示,它可以成为不同项目相关人员之间沟通的使能器; 系统分析:在系统分析过程中确定系统的初步体系结构,将对系统是否满足关键性需求(如性能、可靠性和可维护性等)产生很大的影响; 大规模复用:体系结构可以在具有相似需求的系统之间互用,从而支持大规模的复用。10. 给下面的系统设计一个适当的体系结构: (1)火车站自
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学生心理健康教育 课件 第四章大学生学习心理
- 应急安全和防汛培训课件
- 2025石油石化职业技能鉴定考试练习题附参考答案详解【模拟题】
- 秋季腹泻病程发展规律与预后评估
- 新生儿苯丙酮尿症筛查与饮食管理
- 共建房屋合同(标准版)
- 儿童常见传染病预防与护理
- 2025辽宁省灯塔市中考数学复习提分资料及参考答案详解【完整版】
- 执业药师之《药事管理与法规》题库检测试题打印及答案详解【基础+提升】
- 2025自考公共课能力检测试卷【重点】附答案详解
- 青少年无人机课程大纲
- 2025-2030中国耳鼻喉外科手术导航系统行业市场发展趋势与前景展望战略研究报告
- 剪彩仪式方案超详细流程
- 2024年二级建造师考试《矿业工程管理与实物》真题及答案
- 人教版初中九年级化学上册第七单元课题1燃料的燃烧第2课时易燃物和易爆物的安全知识合理调控化学反应课件
- 发电厂继电保护培训课件
- 校企“双元”合作探索开发轨道交通新型活页式、工作手册式教材
- 肺癌全程管理
- 2024年考研英语核心词汇
- 信息系统定期安全检查检查表和安全检查报告
- 颅脑外伤患者的麻醉管理专家共识(2021版)
评论
0/150
提交评论