第一章 面向对象泛型 复习题
简答题
1. 叙述功能分解中使用的基本方法?
先定出要实现该功能,所需要的几个主要步骤,再对于每个步骤进行细分,将功能实现分解。
2. 导致需求变更的三个原因是什么?
a.用户开始对于需求的不明确,而随着项目的成型,有了进一步的需求。
b.开发者按照自己所认为的方式去开发,与用户所预期的不同。
c.一开始定义的需求不完善,后续需要添加其他需求。
3. 我提倡用责任而不是功能来思考。这意味着什么呢?请举出一个例
子。
一个对象可能能够提供多种功能,但并非所有的功能都是他的责任。用责任来思考能够让一个对象做到:只关心他自己要做的事情,而不关心其他对象的行为方式。
电脑有许多功能:接受键盘输入、处理数据、显示输出等。但电脑无需独自承担所有责任。他可以把输出的责任交给显示器,处理数据的责任交给CPU,这样,他就只需要告诉其他对象要“做什么”,而让他们自己处理要“怎么做”。
4. 给出耦合和内聚的定义。什么是紧耦合?
内聚:一个类或组件之间关联的紧密程度。
耦合:不同类或组件之间的紧密程度。
紧耦合:不同的类或组件之间,又过于紧密的关联,导致一旦一个地方改变,会导致许多相关联的变化。
5. 对象接口的目的是什么?
为类提供规约而不提供实现。定义了一系列的动作,但不具体定义其实现方式,留给实现类进行。
6. 给出类实例的定义。
类的一个特例,包含了特定数据(状态)的类对象。
7. 类是一个对象行为的完整定义。这句话说明了对象的哪三个方面?
对象是类的一个特例。对象中包含了操作该对象的行为方法。对象中包含了特定的状态。
8. 抽象类的作用是什么?
用一个通用的形式,为一组相关的类提供了一个通用的类名,并定义了能够共用的方法。
9. 对象可能具有的三种主要可访问性是什么?
Private,protect,public
10. 给出封装的定义,并举出一个行为封装的例子。
封装:各种隐藏,包括了行为、实现、设计等隐藏。
11. 给出多态的定义,并举出一个多态的例子。
使用基类的形式来引用其不同派生类的对象,并能够表现出派生类的行为。
12. 观察对象的三种视角是什么?
实现、规约、概念
阐述题
1. 有时候,程序员使用“模块”来隔离不同区域的代码。这是应对需求变更的有效方式吗?为什么?
答:使用“模块”,将不同功能块的代码进行分离。能够一降低系统的复杂度,如果设计得当,在模块内高内聚,模块间低耦合,这样,减少不同模块间的相互关联,使得系统更好维护,而必然能够在一定程度上的应对需求变更。但仅仅使用“模块”化,而没有对模块内的类进行好的设计,并不能很好的应对需求变更。
2. 将抽象类定义为不能实例化的类局限性很大,为什么呢?抽象类更好的(或者至少,另一种)理解方式是什么?
答:抽象类的这种定义仅仅是在实现视角来看待的。如果这么理解,仅仅了解抽象类在编码时的使用规约。而不能够了解他应该在合适用,会有何种作用,因此,在设计的时候,必然会导致使用方式的混淆。
抽象类,是一组相关类的占位符。
3. 行为的封装是怎样帮助限制需求变更带来的影响的?它又怎样挽救程序员免于无意导致的副作用?
将行为进行封装,这样,外界的调用者只需要通知对象执行某个行为,而无需知道该对象对于该行为的具体实现。这样,当该行为的实现方式变化时,则不会影响到调用者。
4. 接口怎样有助于保护对象不受其他对象变化的影响?
接口,定义了成员的规约,而不提供具体的实现,其实现由具体的类提供。这样,外界只能调用暴露的接口,而对于具体的实现一无所知。这样,当对象变化的时候,只要接口仍然存在,就不会影响到其他对象。
5. 在一个系统中要使用教室作为描述对象。请从概念视角描述教室。
教室所承担的责任有:提供桌椅,日光灯,黑板,讲台,并暴露给外界进出教室门的方式。
观点与应用题
1. 需求变更是系统开发人员所面临的最大挑战之一。请从你自己的亲身经历中找出一个支持这一说法的例子。
2. 功能分解方法在遇到需求变更时存在本质上的弱点。你同意这种说法吗?为什么?
由于主程序负责控制子程序,承受的责任太多了,必然导致职责混乱,负担太重。而当遇到需求变更时,一个细节的改动都可能导致整个项目的较大的变动。特别是某个步骤变化时,需要对这个函数或者模块进行修改。
3. 你认为应对需求变更的最佳方法是什么?
与其抱怨总是变化的需求变更,不如做一些实质性的行为来应对需求变更,以不变应万变。我们很难知道具体变化的需求,但要多思考系统的有可能变化的部分,将变化的部分封装起来,进行可变的设计。