软工题第六章.docx
《软工题第六章.docx》由会员分享,可在线阅读,更多相关《软工题第六章.docx(14页珍藏版)》请在冰豆网上搜索。
![软工题第六章.docx](https://file1.bdocx.com/fileroot1/2023-6/9/3b320778-0d53-48a0-b3cb-f085b3bb938d/3b320778-0d53-48a0-b3cb-f085b3bb938d1.gif)
软工题第六章
第六章习题
一、选择题
1.对象是面向对象范型的( A )。
每个对象可用它自己的一组( B )和它可以执行的一组( C )来表征。
应用执行对象的( C )可以改变该对象的( B )。
它的应用必须通过( D )的传递。
可以认为,这种( D )的传递大致等价于过程性范型中的函数调用。
某些语言提供了特殊功能,允许对象引用自己。
若一个对象没有显式地被引用,则可让该对象( E )。
供选择的答案:
A.①基本单位 ②最小单位③最大单位 ④语法单位
B~C.①行为 ②功能 ③操作 ④数据 ⑤属性
D.①接口 ②消息 ③信息 ④操作 ⑤过程
E.①撤消 ②歇着 ③缺省 ④隐式引用 ⑤引用自己
2.在面向对象软件开发过程中特别重视复用。
软件构件应独立于当初开发它们的应用而存在。
在以后的应用开发中,可以调整这些独立构件以适应新问题的需要。
因此,应使得类成为一个( A )的单元。
这样就有一个( B )生存期问题。
( B )生存期有自己的步骤,与任一特定应用的开发( C )。
按照这些步骤,可以完整地描述一个基本( D )。
而不仅仅考虑当前正在开发的系统。
系统开发的各个阶段都可能会标识新的类。
随着各个新类的标识,( B )生存期引导开发工作逐个阶段循序渐进。
在设计与实现类时,应尽可能利用既存类提供为当前应用所需要的功能,利用既存类的三个可能途径是:
( E )复用既存类;对既存类进行( F )以得到满足要求的类;重新开始进行开发。
供选择的答案:
A.①可复用 ②可测试 ③可适用 ④可靠
B.①应用 ②寿命 ③类 ④软件
C.①相关 ②密切相关 ③负相关 ④无关
D.①概念 ②实体 ③事件 ④事情
E,F.①修改 ②更新 ③照原样 ④演化
3从分析到设计的过程流如图所示。
一旦已经开发完成一个合理完整的( A )模型后,就要着手( B )的设计。
这需要描述( B )的特征,以准确表达待实现的用户需求,以及实现需求所必须的支持环境。
一旦定义了各个( B ),就开始( C )设计,这时,可利用CRC卡片,将属性转换为( D ),将关系转换为( E )。
供选择的答案:
A~C.①分析 ②系统设计 ③模块设计 ④子系统设计
⑤对象设计 ⑥数据设计 ⑦操作设计 ⑧行为设计 D~E.①对象 ②数据结构 ③算法 ④消息传递
⑤控制 ⑥并发处理 ⑦进程 ⑧过程
二、简答题
1.用面向对象范型开发软件时与用结构化范型开发软件时相比较,软件的生命周期有何不同?
这种差异带来了什么后果?
2.为什么在开发大型软件时,采用面向对象范型比采用结构化范型较易取得成功?
3.为什么说夏利牌汽车是小汽车类的特化,而发动机不是小汽车类的特化?
4.对象和属性之间有何区别?
5.什么是对象?
它与传统的数据有何异同?
6.什么是模型?
开发软件时为什么要建立模型?
7.试用面向对象方法分析设计下述程序:
在显示器屏幕上圆心坐标为(100,100)的位置有一个半径为40的圆,在圆心坐标为(200,300)的位置画一个半径为20的圆,在圆心坐标为(400,150)的位置画一条弧,弧的起始角度为30度,结束角度为120度,半径为50.
8.用面向对象方法解决下述问题时需要哪些对象类?
类与类之间有何关系?
在显示器屏幕上圆心坐标为(250,100)的位置,画一个半径为25的小圆,圆内显示字符串“you”;在圆心坐标为(250,150)的位置,画一个半径为100的中圆,圆内显示字符串“world”;再在圆心坐标为(250,250)的位置,画一个半径为225的大圆,圆内显示字符串“Universe”。
9.试建立下述订货系统的用例模型。
假设一家工厂的采购部每天需要一张订货报表,报表按零件编号排序,表中列出所有需要再次订货的零件。
对于每个需要再次订货的零件应该列出下列数据:
零件编号,零件名称,订货数量,目前价格,主要供应者,次要供应者。
零件入库或出库称为事务,通过放在仓库中的终端把事务报告给订货系统。
当某种零件的库存数量少于库存量临界值时就应该再次订货。
10.为什么说面向对象方法与人类习惯的思维解题方法比较一致?
第六章习题习题
一、选择题
1.答案:
A.①, B.⑤, C.③,D.② E.③
分析:
对象是面向对象范型的基本单位。
每个对象可用它自己的一组属性和它可以执行的一组操作来表征。
应用执行对象的操作可以改变该对象的属性,属性一般只能通过操作来改变。
它的应用必须通过消息的传递。
发送给一个对象的消息定义了一个方法名和一个参数表(可能是空的),并指定某一个对象。
而由一个对象接收的消息则引用消息中指定的方法的代码,并将实际参数与参数表中相应的形式参数结合起来。
接收对象对消息的处理可能会改变对象中的状态,即改变接收对象的属性,并发送一个消息给自己或另一个对象。
可以认为,这种消息的传递大致等价于过程性范型中的函数调用。
然而,执行方法得到消息结果的目的是想修改相关对象的内部状态,而不只是修改变元并返回它们。
某些语言提供了特殊功能,像smalltalk提供了self,允许对象引用自己。
若一个对象没有显式地被引用,则可让该对象缺省。
2.答案:
A.①, B.③, C.④, D.②, E.③, F.④
分析:
在面向对象软件开发过程中特别重视复用。
软件构件应独立于当初开发它们的应用而存在。
构件的开发瞄准某些局部的设计和实现,它们可用于当前问题的解决,但为了在以后的项目中使用,它们还应当足够通用。
在以后的应用开发中,可以调整这些独立构件以适应新问题的需要。
为使得类成为一个可复用的单元,有一个类生存期的问题。
类生存期与应用生存期交叉。
在应用生存期的每一个阶段都可做类的标识。
类生存期有自己的步骤,与任一特定应用的开发无关。
按照这些步骤,可以完整地描述一个基本实体。
而不仅仅考虑当前正在开发的系统。
系统开发的各个阶段都可能会标识新的类。
随着各个新类的标识,类生存期引导开发工作逐个阶段循序渐进。
在设计与实现类的时候,有三种利用既存类的途径:
§原封不动地复用既存类。
§对既存类进行演化以得到满足要求的类。
§重新开始进行开发。
3.答案:
A.①, B.④, C.⑤, D.②, E.④
分析:
从分析到设计的过程流如图所示。
一旦已经开发完成一个合理完整的分析模型后,就要着手子系统的设计。
这需要描述子系统的特征,以准确表达待实现的用户需求,以及实现需求所必须的支持环境。
在定义子系统时,需要在用户需求的整个上下文环境中互相协调:
各个用户需求分配给哪个子系统?
在OOA中定义的对象驻留在哪个子系统内?
哪些子系统并发运行?
负责协调和控制它们的系统构件是谁?
全局资源在子系统中如何管理?
等。
在设计子系统的过程中,需要定义4种重要的设计构件:
§问题论域:
负责实现用户需求的子系统。
§人机交互:
实现用户界面的子系统(包括可复用的GUI子系统)。
§任务管理:
负责控制和协调各种事件驱动、时钟驱动、并发执行任务的子系统。
§数据管理:
负责对象存储和检索的子系统。
每一个构件都可以用一些类、必须的关系和行为来定义。
构件之间的关系可以通过建立每个构件的消息模型来建立。
一旦定义了各个子系统,包括上述的各个设计构件,就开始对象(类)设计,这时,可利用CRC卡片,将类转换为设计实现,转换工作如图所示。
二、简答题
1.答:
用结构化范型开发软件时,软件的生命周期如下:
(1)陈述需求阶段;
(2)规格说明(分析)阶段;
(3)设计阶段;
(4)实现阶段;
(5)维护阶段。
用面向对象范型开发软件时,软件的生命周期为:
(1)陈述需求阶段;
(2)面向对象分析阶段;
(3)面向对象设计阶段;
(4)面向对象实现阶段;
(5)维护阶段。
粗看起来,用这两种不同的范型开发软件时软件生命周期基本相同。
但是,仔细分析起来就会发现两者之间有本质差别。
用结构化范型开发软件时,规格说明(分析)阶段的主要任务是,确定软件产品应该“做什么”;而设计阶段通常划分成结构设计(即概要设计)和详细设计这样两个子阶段。
在结构设计子阶段,软件工程师把产品分解成若干个模块,在详细设计子阶段再依此设计每个模块的数据结构和实现算法。
如果使用面向对象范型开发软件,则面向对象分析阶段的主要工作是确定对象。
因为对象就是面向对象软件的模块,因此,在面向对象分析阶段就开始了结构设计的工作。
由此可见,面向对象分析阶段比它在结构化范型中的对应阶段----规格说明(分析)阶段-----走得更远,工作更深入。
这两种范型的上述差异带来了重要的结果。
使用结构化范型开发软件时,在分析阶段和设计阶段之间有一个很大的转变:
分析阶段的目的是确定产品应该“做什么”,而设计阶段的目的是确定“怎么做”,这两个阶段的工作性质明显不同。
相反,使用面向对象范型开发软件时,“对象”从一开始就进入了软件生命周期,软件工程师在分析阶段把对象提取出来,在设计阶段对其进行设计,在实现阶段对其进行编码和测试。
由此可见,使用面向对象范型开发软件时,在整个开发过程中都使用统一的概念“对象”,围绕对象进行工作,因此,阶段与阶段之间的转变比较平缓,从而减少了在开发软件过程中所犯的错误。
2.答:
结构化技术要么面向怎么处理(例如,面向数据流的设计方法),要么面向数据(例如,面向数据结构的设计方法),但却没有既面向处理又面向数据的结构化技术。
用结构化技术开发出的软件产品的基本成分,是产品的行为(即处理)和这些行为所操作的数据。
由于数据和对数据的处理是分离的,尽管开发者把程序划分成了许多模块,但是这些模块之间的联系却是比较紧密的,因此,使用结构化范型开发出的软件产品本质上是一个完整的单元。
由此带来的后果是,软件规模越大,用结构化范型开发软件的技术难度和管理难度就越大。
与结构化技术相反,面向对象技术是一种以数据为主线,把数据和处理相结合的方法。
面向对象范型把对象作为由数据及可以施加在这些数据上的操作所构成的统一体。
用面向对象范型开发软件时,构成软件系统的每个对象就好像一个微型程序,有自己的数据、操作、功能和用途,因此,可以把一个大型软件产品分解成本质上相互独立的小产品来处理,这就不仅降低了软件开发的技术难度,而且也使得对软件开发工作的管理变得相对容易了。
3.答:
夏利牌汽车具有小汽车的全部属性和行为,它只不过是一种特定品牌的小汽车,因此,夏利牌汽车可以从基类“小汽车”派生出来,也就是说,夏利牌汽车是小汽车类的特化。
发动机是组成小汽车的一种零件,小汽车还有车身、车灯、轮子等许多种其他零件,小汽车所具有的许多属性和行为发动机都不具有,因此,发动机不能从小汽车类派生出来,它不是小汽车类的特化。
4.答:
对象是对客观世界实体的抽象,它是描述实体静态属性的数据和代表实体动态行为的操作结合在一起所构成的统一体。
属性只不过是对象的一种特性,它是组成对象的一种成分。
5.答:
对象是用面向对象方法学开发软件时对客观世界实体的抽象,它是由描述实体属性的数据及可以对这些数据施加的所有操作封装在一起构成的统一体。
传统的数据是用传统方法学开发软件时对客观世界实体的抽象,但是,这种抽象是不全面的:
数据只能描述实体的静态属性,不能描述实体的动态行为。
必须从外界对数据施加操作,才能改变数据实现实体应有的行为。
对象与传统数据有本质区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体。
必须发消息请求对象主动地执行它的某些操作,处理它的私有数据,而不能直接从外界对它的私有数据进行操作。
6.所谓模型,就是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。
通常,模型由一组图示符号和这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。
更进一步讲,模型是一种思维工具,利用这种工具可以把知识规范地表示出来。
众所周知,在解决问题之前必须理解所要解决的问题。
对问题理解得越透彻,就越容易解决它。
在开发软件的过程中,为了更好地理解客户要求解决的问题,往往需要建立问题域的模型。
为了开发复杂的软件系统,系统分析员应该从不同角度抽象出目标系统的特性,使用精确的表示方法构造系统的模型,验证模型是否满足客户对目标系统的需求,并在设计过程中逐渐把和实现有关的细节加进模型中,直至最终用程序实现这个模型。
对于那些因过分复杂而不能直接理解的系统,特别需要建立模型,建模的目的主要是为了降低复杂性。
人的头脑每次只能出来少量信息,模型通过把系统的重要部分分解成人的头脑一次能处理的若干个子部分,从而减少了系统的复杂程度。
7.答:
面向对象方法模拟人类习惯的思维解题方法,用对象分解取代了功能分解,也就是把程序分解成一系列对象,每个对象都既要有自己的数据,又有处理这些数据的方法。
不同对象之间通过发送消息向对方提出服务要求,接收消息的对象主动完成指定功能提供所需要的服务。
程序中所有对象分工协作,共同完成整个程序的功能。
从本题中给出的对这个简单图形程序的需求可以看出,这个程序中只涉及两类实体(即对象),它们分别是圆和弧。
从需求陈述中不难看出,圆的基本属性是圆心坐标和半径,弧的基本属性是圆心坐标、半径、起始角度和结束角度。
但是,通常不可能在需求陈述中找到所有属性,还必须借助于领域知识和常识,才能分析得出所需要的全部属性。
众所周知,一个图形既可以在屏幕上显示出来,也可以不显示出来。
也就是说,一个图形可以处于两种可能的状态之一(可见或不可见)。
因此,本问题中的圆和弧都应该再增加一个属性----可见性。
分析需求得知,圆和弧都应该提供在屏幕上“画自己”的服务。
所谓画自己,就是用当前的前景颜色在屏幕上显示自己的形状。
这个程序很简单,在需求陈述中只提出了这一项最基本的功能需求。
但是,根据常识一个图形既可以在屏幕上显示出来,也可以隐藏起来(实际上是用背景颜色显示)。
既然已经设置了“可见性”这个属性来表明图形当前是否处于可见状态,自然也应该再提供“隐藏自己”这样一个服务。
此外,为了便于使用,通常对象的每个属性都是可以访问的。
当然,可以访问并不是可以从对象外面随意读/写对象的属性,那样做将违反信息隐藏原理,也违背由对象主动提供服务而不是被动地接受处理的面向对象设计准则。
所谓可以访问是指提供了读/写对象属性的服务。
综合上面的分析结果,可以用图6.2所示的类图形形象地描绘程序中的两类对象。
图6.2 圆类和弧类
图6.3简单图形程序的类等价
从图6.2可以看出,圆和弧的许多属性是和服务都是公共的。
如果分别定义圆类和弧类,则这些公共的属性和服务需要在每个类中重复定义,这样做势必形成许多冗余信息。
反之,如果让圆作为父类,弧作为从圆派生出来的子类,则在圆类中定义了圆心坐标、半径和可见性等属性之后,弧类就可以直接继承这些属性而无需再次重复定义它们,因此,在弧类中仅需定义本类特有的属性(起始角度和结束角度)。
类似地,在圆类中定义了读/写圆心坐标、读/写半径和读/写可见性等服务之后,在弧类中只需定义读/写起始角度和读/写结束角度等弧类特有的服务。
需要注意的是,虽然在图6.2中圆类和弧类都有名字相同的服务“显示”和“隐藏”,但是它们的具体功能是不同的(显示或隐藏的图形形状不同)。
因此,在把弧类作为圆类的子类之后,仍然需要在这两个类中分别定义“显示”和“隐藏”服务。
在这个简单程序中仅涉及圆和弧两类图形,当开发更复杂的图形程序时,将涉及更多的图形种类。
但是,任何一种图形都有“坐标”和“可见性”等基本属性。
当然,针对不同的图形,坐标的物理含义可能不同,例如,对圆来说指圆心坐标,对矩形来说指某个顶点的坐标。
坐标和可见性实质上是屏幕上“点”的属性,如果把这两个基本属性抽取出来,放在点类中定义,并把点类作为各种图形类的公共父类,则不仅可进一步减少冗余信息,还能提高程序的可扩充性。
相应地,读/写坐标和读/写可见性等服务也应该放在点类中定义。
当然,点类中还应该定义它专用的显示和隐藏服务。
进一步分析“点”的属性可以看出,它们属于两类不同的基本信息:
一类信息描述了点在哪里(坐标),另一类信息描述了点的状态(可见性)。
在上述两类信息中,坐标是更基本的信息。
因此,可以定义一个更基本的基类“位置”,它仅仅拥有坐标信息,代表一个几何意义上的点。
从位置类派生出屏幕上的点类,它继承了位置类中定义的每样东西(属性和服务),并且加进了该类特有的新内容。
图6.3所示类图描绘了通过上述分析、设计过程得出的类等级。
为简单起见,图中没有列出读/写属性值的常规服务。
实际上,位置类提供读/写坐标服务,点类提供读/写可见性服务,圆类提供读/写半径服务,弧类提供读/写起始角度和读/写结束角度服务
8.答:
解决这个问题的一个可能的方案是,在“圆”类中增加一个字符串类型的属性,并给“圆”类的服务“显示”加一段代码,使它不仅能在屏幕上显示圆,而且能在圆内显示字符串。
虽然用面向对象的程序设计语言实现这个方案并不困难,但它却不是一个理想的方案:
字符串和圆是截然不同的两类实体,当我们考虑字符串时,想到的是字符串内容、字体、字号(字符大小)、对齐方式及其他一些可能的属性,它们中没有哪一个是与圆有关的。
把两类不同实体的属性放在同一个类中,这样定义出的“综合”模块的独立性显然比较差。
当处理性质完全不同的功能时,更理想的方案是,首先建立一些“基础类”的基类,然后把若干个基础性基类的适当特征组合起来,利用多重继承机制派生出一个特定的派生类,使这个派生类具有所需要的综合功能。
在解答上一题时已经定义了圆类,它定义了圆的属性,并能提供在屏幕上显示圆的服务,可以认为圆类是关于图形圆的一个基础性的类。
现在还需要再定义一个关于字符串的基础性的类,这个类的基本功能是,在图形模式下从指定的坐标开始,在屏幕上以指定的字体显示一个给定内容的字符串,字符的大小由字符串在屏幕上占用的长度决定。
分析上述需求可知,“图形模式字符串”类的基本属性如下:
位置(即坐标),字符串内容,显示字符串时的字体,显示字符串时占用的屏幕长度。
在解答上一题时曾经定义了位置类,图形模式字符串的基本属性中又包含位置属性,显然应该从位置类派生出图形模式字符串类。
该类对外提供的服务为,在屏幕的指定位置以指定字体显示给定的字符串。
有了“圆”和“图形模式字符串”这样两个基础性的类之后,就可以利用多重继承机制从这两个类派生出一个新类,我们给这个派生类起名字为“圆内字符串”,它既继承了圆类在屏幕上显示圆的功能,又继承了图形模式字符串类在图形模式下显示字符串的功能,从而具有在屏幕上显示圆且在圆内显示字符串的综合功能。
综上所述,解决本问题所用到的对象类及类之间的层次关系如下:
从“位置”类分别派生出“点”类和“图形模式字符串”类,然后由“点”类派生出“圆”类,最后由“圆”类和“图形模式字符串”类共同派生出“圆内字符串”类。
9.答:
从对这个订货系统的需求可以知道,仓库管理员通过放在仓库中的终端把零件入库/出库事务报告给订货系统,系统接收到事务信息之后应该处理事务;采购员需要使用订货系统提供的产生报表功能,以获取订货报表。
综上所述,可以画出图6.4所示的用例图。
图6.4 订货系统用例图
10.答:
人类认识客观世界解决现实问题的过程,是一个渐进的过程。
人的认识需要在继承以前的有关知识的基础上,经过多次反复才能逐步深化。
在人的认识深化的过程中,既包括从一般到特殊的演绎思维过程,也包括从特殊到一般的归纳思维过程。
人在认识和解决复杂问题时使用的最强有力的思维工具是抽象,也就是在处理复杂对象时,为了达到某个分析目的而集中研究对象的与此目的有关的实质特性,暂时忽略对象的那些与此目的无关的特性。
面向对象方法学的出发点和基本原则,就是分析、设计和实现一个软件系统的方法和过程,尽可能接近人们认识世界解决问题的方法和过程,也就是使描述问题的问题空间和描述解法的解空间在结构上尽可能一致。
也可以说,面向对象方法学的基本原则,是按照人们习惯的思维方式建立问题域的模型,开发出尽可能直观、自然地表现求解方法的软件系统。
面向对象的软件系统中广泛使用的对象,是对客观世界中实体的抽象,对象实际上是抽象数据类型的实例,提供了理想的数据抽象机制,同时又具有良好的过程抽象机制(通过发消息使用公有成员函数)。
对象类是对一组相似对象的抽象,类等级中上层的类是对下层类的抽象。
因此,面向对象的环境提供了强有力的抽象机制,便于人在利用计算机软件系统解决复杂问题时使用习惯的抽象思维工具。
此外,面向对象方法学中普遍进行的对象分类过程,支持从特殊到一般的归纳思维过程;面向对象方法学中通过建立类等级而获得的继承特性,支持从一般到特殊的演绎思维过程。
面向对象的软件技术为开发者提供了随着对某个应用系统的认识逐步深入和具体化的过程,而逐步设计和实现该系统的可能性,因为可以先设计出由抽象类构成的系统框架,随着认识深入和具体化再逐步派生出更具体的派生类。
这样的开发过程符合人们认识客观世界解决复杂问题时逐步深化的渐进过程。