《设计模式解析》 第8章 开拓视野 复习题
1、 封装不仅仅意味着数据封装。而是包含了各种封装:数据封装、方法封装(实现封装)、类封装、对象封装。总之要遵循调用者无需关注实现方式,因为被封装了。
2、 概念视角:软件要负责什么?
规约视角:怎么使用软件?
实现视角:软件怎样旅行自己的责任?
1、a. “具有责任的实体”,从概念视角出发,能够使我们关注对象的意图行为,而非对象如何实现。
b. 对象是能够为其他对象提供服务的实体。
其他对象需要某个对象的服务时,只需要向它发送消息,而无需理会它如何实现。
2、可以。
对象与数据成员的差别是对象有方法和值,是用对象的行为包含变化;而数据成员仅是一个变量,只存储值,用对象的属性包含变化。
一个数据成员是既定的类型,它不具有任何的自我负责的能力,一切的变化都依赖于他所属的对象,他完全依赖于对象。
对象包含的对象,能够为包含他的对象提供服务,并对自己的情况进行处理,包含他的对象仅需向它发送消息。它可以应对未来的变化。
3、“发现变化并对其封装”,将变化的部分进行隐藏(数据、方法、类型等),而仅仅对外界暴露不变化的那部分。这样,即使内部今后会不断变化,也不会对外部的使用者造成影响。
4、共性分析,要获得相似事物的共性,需从概念视角来看。
可变性分析,看到事物的变化的部分,即不同的部分,相似事物的不同部分是从实现视角来看,即是由于各自实现的不同。
规约描述了如何与这一类相似的对象进行通信,而各个对象都代表了一个公共概念的一种变化。
5、抽象类代表了将所有的派生类联系起来的核心概念。正是这个概念定义了派生类的共性。
6、a. 首先要用概念视角来找出共性,找出了他们的共同点之后,继而识别出导致他们不同的方面。一堆杂乱无章,毫无联系的事物,找出他们的不同点/可变性,是没有意义的。要分析的是一类事物的共性与可变性,而非任何事物。
b.用具有一类对象共同职责对象去表示共通的概念。这个对象具有这类对象的共性。
c.用在共性中辨别出可变性的派生类的对象来表示。这个对象既有这类对象的共性(相同规约),又有可变性(实现方式的不同)。
1、 把注意力放在目的上
a) 能够使得开发人员不会过分关注程序的实现,这样,使得内部的实现对外部的调用者隐藏,这样,更容易写出低耦合的代码。
b) 使得开发者会将一些代码封装成相应的方法(先写出空的方法名,再去实现方法),增加程序的可读性。
2、 由于“预先设计”,往往对于一些需求点考虑的不够全面。因此,你不得不在实现的时候,发现了这个需求时,再将其加入到设计当中。
3、 特化类、???
a) 不懂。。。
4、 在创建对象时,先使用共性分析,得到一类对象间的联系,具有哪些共性。继而再分化出各个特化类的各自的性质。
5、 当然。
a) 尽早的探究变化,可以让我们设计出更灵活、可修改性强的程序。
b) 有助于避免实现代码时,或者修改代码时,导致的本可以避免的冗余、代码可读性下降、内聚性变弱,耦合度变高。
c) 早期的研究变化,做出能够适应变化的设计。可以避免在修改代码时候,需要修改许多地方,由于没有原先的继承结构,可能会导致冗余代码。在修改的时候,为了适应变化,只能牺牲程序的可读性,去添加相应的变化。而这样,又导致了一个模块可能实现了本不应该自己实现的功能,导致内聚性变弱。为了实现功能,又可能调用到了其他模块,进而增加了耦合度。
6、 同意。
a) 使用“寻找名词和动词”的方法,使我们过早的去关注具体的动作实现,这样可能会导致一个庞大的集成结构。使用共性分析,能够将对象的相应的动作进行共性分析,抽出共性,抽象程度更高,因此,更能够适应未来的变化。
7、 看待对象
a) 将对象看作是“具有责任的实体”,而非仅仅是“方法和数据的实体”,以更高层次的视角来看待可以让我们更容易抽取出各个实体间的关系。
b) 用共性/可变性对对象进行分析,更深层次的揭示抽象类和泛化类间的联系。