1.软件体系结构设计的原则有哪些?答:1)抽象的原则抽象是人们认识复杂事物的基本方法。它的实质是集中表现事物的主要特征和属性,隐藏和忽略细节部分,并用于概括普遍的、具有相同特征和属性的事物。2)分而治之的原则将大的问题分成几个小的问题,软件设计中的分解包括:横向分解:按照从底层基础到上层问题的方式,将问题分解成相互独立的层次。每层完成局部问题并对上层提供支持。纵向分解:在每个层次上,将问题分解成多项,相互配合实现完整的解。3)封装和信息隐藏原则采用封装的方式,隐藏各部分处理的复杂性,只留出简单的、统一形式的访问方式。这样可以减少各部分的依赖程度,增强可维护性。4)模块化原则模块是软件被划分成独立命名的,并可被独立访问的成分。模块划分,粒度可大可小。划分的依据是对应用逻辑结构的理解。5)高内聚和低耦合内聚性是指软件成分的内部特性。成分中各处理元素的关联越紧密越好。耦合性是指软件成分间关系的特性。软件成分间的关联越松散越好。6)关注点分离原则软件成分被用于不同的场景时,会有对于不同场景的适应性问题。但是,所必须适应的内容并非全部,只是一部分,即所谓的关注点。软件设计要将关注点和非关注点分离,关注点的部分可以设定,而非关注点的部分用来复用,非关注点应选择与条件、场景独立的软件成分。7)策略和实现的分离原则策略指的是软件中用于处理上下文相关的决策、信息语义和解释转换、参数选择等成分。实现指的是软件中规范且完整的执行算法。8)接口和实现分离原则软件设计要将接口和实现分离,这样可以保障成分的信息隐蔽性,以及提高可维护性。2.简要描述一种常见的软件体系结构,并举例说明。答:C/S技术是20世纪90年代管理信息系统中较为先进的技术。典型的C/S结构由三部分组成:客户端组件、服务器组件和中间层组件。客户端组件是用户前端部分,一般表示为图形用户界面;中间层组件是体系结构的连接器,一般由一些API和协议组成;服务器组件是C/S结构的核心,用于执行客户端请求。C/S结构应用系统基本运行关系为“请求/响应”模式。当需要服务时客户端发出“请求”,服务器接受“请求”并“响应”,然后执行相应的服务,把执行结果送回给客户端,由它进一步处理后再提交给用户。C/S结构最鲜明的特征是共享资源,它可以分配处理任务和集中的数据给客户端和服务器,使系统可以共享从数据到处理能力的每一种资源。C/S结构的缺点是客户端很庞大,应用程序升级和维护十分困难,对应用程序的一点小改动就必须对每台客户端更新,并且系统移植复杂,对于不同的操作系统要求有不同的客户端软件。3.某系统需要进行身份认证,其需求描述如下:系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。身份认证一般与授权控制是相互联系的,授权控制是指一旦用户的身份通过认证以后,确定哪些资源该用户可以访问、可以进行何种方式的访问操作等问题。本系统用户的合法性检查,包括基础信息检查、账户检查、账号可用性检查。请画出MVC三层结构的数据传递示意图并作简要文字说明。答:4.与C/S风格相比较,B/S风格的体系结构有哪些的优缺点?答:与C/S风格相比,B/S风格的优点主要包括:(1)操作使用简单。用户在使用系统时,仅仅需要一个浏览器即可运行全部的模块。(2)维护和升级方式简单。系统安装、修改、和维护全在服务器端解决,可以在系统运行时自动升级。(3)成本降低,选择更多。系统开发成本降低,而且对于服务器的选择大大增多。目前的B/S体系结构也存在许多不足之处,主要表现在:(1)缺乏对动态页面的支持能力,也没有集成有效的数据库处理能力(2)B/S体系结构的系统扩展能力差,安全性难以控制。(3)系统在数据查询等响应速度上,远远低于C/S体系结构。(4)数据动态交互性不强,不利于在线事务处理应用。5.为什么软件设计中要应用架构样式?答:应用软件架构样式主要有如下几个优势:(1)可以促进设计的复用,使得一些经过实践证实的已经被透彻理解了的解决方案能够被重新应用到新问题中并解决它们。(2)能够带来显著的复用,使得软件架构中的不变部分可共享同一个解决方案。(3)便于设计者之间的交流与理解,也使得系统组成让非设计者更易于理解。(4)通过对标准样式的使用支持了系统的互操作性,以便于相关工具的集成。(5)在限定了设计空间的情况下,能够对相关样式作出对应的体系结构分析。(6)能够对特定的样式提供可视化支持,为体系结构设计师提供了图形和文本的描述工具来表达他们的想法。6.现在要求你建造一个产品来确定银行结单是否正确。需要得数据包括月初的余额,每张支票的号码、日期和数额,每笔储蓄的日期和数额及月末的余额。用数据流分析设计这个产品,确定一个银行存款支付处理报告书是否正确。答:(1)编写规格说明确认一个银行结单是否正确,画数据流图。先做如下假设:没有服务费、ATM提款项目,仅有的交易只允许支票和储蓄,所有支票产生一个数据。按支票号码处理。对每张支票,在银行清单中找到一个与支票号码一致的记录(条目)。如果没有找到,报告书报错。根据储蓄日期整理到期的存款。对每一个到期存款,在银行清单中找到一个与存款日期和数额一致的记录(条目)。如果没有找到,报告书报错。在处理所有支票和储蓄后,确认银行结单上所有的项目都已标记过。如果没有,报告书报错。在月初余额中加上所有储蓄金额,并从总额中扣去所有支票的金额。如果扣除后得到的结果不等于月末余额,报告书报错,否则该银行存款支付处理报告书正确。图1数据流图(2)用数据流分析结构设计如图2,模块化设计如图3。(可以告诉学生这是否需要详细设计,如果不需要,必须要设计模块数)银行清单支票储蓄核对银行清单支票明细银行清单明细储蓄明细图图2银行存款支付处理报告书是否正确的结构图模块名支票总额模块类型函数,不返回值返回类型void输入参数银行清单:清单类型输出参数银行清单:清单类型支票总额:货币型Ok:布尔型差错信息/文件存取/文件改变/模块调用核对支票参数:银行清单:清单类型支票总额:货币型Ok:布尔型描述这个模块是对核对支票的响应,返回ok(布尔型)和一系列处理过的支票,若ok返回值为真,模块接受处理过的支票并返回支票的总额。否则,该模块不做任何处理,并返回ok的值。图3银行存款支付处理报告书是否正确的其中一个模块的细节设计核对银行清单输入银行清单月初余额银行清单支票总额银行清单支票总额Ok储蓄总额银行清单储蓄总额Ok核对余额储蓄、支票总额,银行清单Ok输出银行报告书Ok支票总额支票处理输入支票支票处理后的支票银行清单Ok储蓄总额储蓄处理输入储蓄储蓄处理后的支票处理后的储蓄处理后的储蓄银行清单Ok7.考虑一个自动柜员机(ATM),用户将信用卡放入一个槽中,并输入4位数字的个人识别号(PIN)。如果PIN不正确,将弹出该信用卡;如果PIN正确,用户可以对最多四个银行帐号进行下面的操作:1)存钱,数额任意。将打印出一个收据,显示日期、存入金额和账号。2)以20美元为单位,最多提取200美元(不能超过该数额)。除了现金,还将给用户打印出收据,显示日期、提取现金、账号、和提取后账号余额。3)确定账户余额。这将在屏幕上显示出来。4)在两个账户之间传递资金。被提取的账户中导出的金额还是不能超过最高限额。用户得到一个收据,显示日期、传递的金额和两个账号。5)退出。弹出信用卡。试用事务分析设计一个控制ATM的软件,在这个阶段省略错误处理能力。答:在存款时,仅当存款确认后客户账户才更新。下图为使用事务分析ATM机的结构图。8.选择你熟悉的编程语言,考虑本讲中给出的模块化的两个定义,确定这两个定义中的哪一个包含了你能直观理解的东西,使你能在你所选择的语言中建造一个模块。答:最早试图描述模块的是Stevens、Myers和Constantine,他们把模块定义为“一个或多个邻接的程序语句的集合,它有一个名称以便系统的其他部分调用它,并且最好具有自己的专用的变量名集。”Yourdon和Constantine给出了一个更广泛的定义:“模块是一个词汇上邻接的程序语句序列,由边界元素限制范围,有一个集合标识符”。例:C语言中函数的调用符合了第一个定义,一个较大的程序应分为若干个处理事务输入PIN确定事务类型确定账户调度程序处理退出事务处理存款事务处理传递事务处理余额事务编辑退出事务编译存款事务编辑传递事务编辑余额事务更新账户更新账户更新账户写入审查索引写入审查索引写入审查索引程序模块,每个模块用于实现一个特定的功能,同一个函数可以被一个或多个函数任意调用多次。在C语言中,将一个独立功能的代码段写在一个函数里作为一个模块,然后当其它函数中需要用到该功能时可直接利用调用函数,这样不仅做到功能独立,简洁易懂,还有效的避免了数据冗余。Java中的方法和C/C++中的头文件。9.维护时内聚的影响是什么,耦合的影响是什么?答:模块的设计需要遵循高内聚、低耦合heels一些启发式规则。维护时仍需要高内聚,高内聚使得各模块功能相互独立,模块的内部交互程度高,具有较好的理解性、可维护性,维护工作量大大减少。耦合也要求低耦合,软件结构不同的模块之间的相互关联程度尽可能弱,这样在维护的时候很容易,因为由于模块间的关联简单,发生在一处的错误传播到整个系统的可能性很小。10.请对抽象和信息隐藏两个概念进行分析比较。答:(英)抽象是需要考虑实现什么而不是它如何实现的。信息隐藏是对用户故意隐藏更多的细节。抽象是信息隐藏的实例。把一些相似的地方集中和概括起来,暂时忽略他们之间的差异,这就是抽象。或者说抽象是抽出事物的本质特性而暂时不考虑他们的细节。信息隐藏是在设计和确定模块时,要使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说是不能访问的,信息隐藏更准确的描述应是“细节隐藏”。抽象就是抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象的办法可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。信息隐藏是与模块的独立性有关,将模块的软件设计决策封装起来的技术。模块接口应尽量简洁,不要罗列可有可无的内部操作和对象。按照信息隐藏的原则,系统中的模块应设计成“黑箱”,模块外部只能使用模块接口说明中给出的信息,如操作、数据类型等等。由于对象或操作的实现细节被隐藏,软件开发人员便能够将注意力集中于更高层次的抽象上。6.假设你是一个负责产品开发的工程师,管理者要求你研究一下确保你所在小组设计出的模块能够尽可能复用的途径,你将如何回答他?答:(英)保证模块内部具有高内聚和模块间的低耦合,同样信息隐藏技术对可复用性非常重要,使用面向对象编程也能促进可复用性。抽象、信息隐藏、模块化、局部化、一致性、完整性和可验证性。抽象就是抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象的办法可以控制软件开发过程的复杂性,有利于软件的可理解性和开发过程的管理。.信息隐藏是与模块的独立性有关,将模块的软件设计决策封装起来的技术。模块接口应尽量简洁,不要罗列可有可无的内部操作和对象。按照信息隐藏的原则,系统中的模块应设计成“黑箱”,模块外部只能使用模块接口说明中给出的信息,如操作、数据类型等等。由于对象或操作的实现细节被隐藏,软件开发人员便能够将注意力集中于更高层次的抽象上。模块是程序逻辑上相对独立的成份,它是一个独立的编程单位,应有良好的接口定义。如,FORTRAN语言中的函数、子程序、Ada语言中的程序包、子程序、任务等。模块化有助于信息隐藏和抽象,有助于表示复杂的软件系统。模块的大小要适中,模块过大会导致模块内部复杂性的增加,不利于模块的调式和重用,也不利用模块的理解和修改。模块太小会导致整个系统的表示过于复杂,不利于控制解的复杂性。模块之间的关联程度用耦合度度量。局部化要求在一个物理模块内集中逻辑上相互关联的计算资源。从物理和逻辑两个方面保证系统中模块之间具有松散的耦合关系,而在模块内部有较强的内聚性。这样有利于控制解的复杂性。抽象和信息隐藏、模块化和局部化的原则支持软件工程的可理解性、可修改性和可靠性,有助于提高软件产