系统对象和类分析(II)
   
1.  分析阶段的逻辑关系
答:1) 在一个系统中必须存在一些关系以便进行适当地操作;
   2) 逻辑关系表达了一个类和另一个类如何关联、一个对象怎样得到或使用另一个对象;
   3) 问下列问题:
      . 一个类依赖于另一个类的某些功能吗?
      . 是否存在一种非常强的关系以致一个对象缺少了另一个便不能存在?
   4) 在这个模块讨论的逻辑关系如下:
      . 继承(Inheritance):
        a. 一般;
        b. 特殊
      . 多态(Polymorphism)
      . 关联(Association)
        a. 聚合(Aggregation)
        b. 组合(Composition)
   
2.  继承(Inheritance)
答:1) 继承的概念描述了你如何在一组类似或相同目的类间共享或得到属性以及功能;
   2) 单继承和多重继承;
   3) 使用继承,我们能够 :
      . 降低全部系统的尺寸;
      . 改善设计和维护的功能;
   4) Car、Bus、Train、Airplane、Ship, 他们都是交通工具。他们可以移动以及驾驶,它们可以将人从A地运往B地。
   
3.  子类和超类
答:1) 当一个类继承自其它类,它被称为“子类”;
   2) 当一个类被继承自其它类,它被称为“超类”;

4.  继承的分析
答:继承的二种类型:
   . 一般继承:

      |ˉˉˉˉˉ|    |ˉˉˉˉˉ|                |ˉˉˉˉˉ|
      |   Dog    |    |   Cat    |                |  Mammal  |
      |__________|    |__________|                |__________|
      |-numLegs  |    |-numLegs  |  ——>         |-numLegs  |
      |ˉˉˉˉˉ|    |ˉˉˉˉˉ|                |ˉˉˉˉˉ|
      |+eat()    |    |+eat()    |                |+eat()    |
      |+bark()   |    |+meow()   |                |__________|
      |__________|    |__________|                     △
                                                       │
                                             |ˉˉˉˉˉˉˉˉˉˉ|
                                             |                    |
                                        |ˉˉˉˉˉ|        |ˉˉˉˉˉ|
                                        |   Dog    |        |   Cat    |
                                        |__________|        |__________|
                                        |ˉˉˉˉˉ|        |ˉˉˉˉˉ|
                                        |+bark()   |        |+meow()   |
                                        |__________|        |__________|

   . 特殊继承:

                  |ˉˉˉˉˉ|                                 |ˉˉˉˉˉ|
                  |  Mammal  |                                 |  Mammal  |
                  |__________|                                 |__________|
                  |-numLegs  |                                 |-numLegs  |
                  |ˉˉˉˉˉ|                                 |ˉˉˉˉˉ|
                  |+eat()    |                                 |+eat()    |
                  |__________|                                 |__________|
                       △                ——>                      △
                       │                                           │
             |ˉˉˉˉˉˉˉˉˉˉ|                   |ˉˉˉˉˉˉˉ|ˉˉˉˉˉˉ|
             |                    |                   |              |            |
        |ˉˉˉˉˉ|        |ˉˉˉˉˉ|         |ˉˉˉˉˉ|  |ˉˉˉˉˉ|  |ˉˉˉˉˉ|
        |   Dog    |        |   Cat    |         |   Dog    |  |   Cat    |  |  Sheep   |
        |__________|        |__________|         |__________|  |__________|  |__________|
        |ˉˉˉˉˉ|        |ˉˉˉˉˉ|         |ˉˉˉˉˉ|  |ˉˉˉˉˉ|  |ˉˉˉˉˉ|
        |+bark()   |        |+meow()   |         |+bark()   |  |+meow()   |  |+baa()    |
        |__________|        |__________|         |__________|  |__________|  |__________|

5.  多态
答:1) 是一个和继承关系密切的OO术语;
   2) 多态这个名字来源于希腊,意思是“多种形态”;
   3) 从分析透视图看来,多态意味着不同类型和多种属性可分配于类;
   4) Java和C++支持多态;
 
6.  抽象类
答:1) 是一些包含未实现功能的类,这些类不能实例化。一个类继承了一个抽象类继承了所有方法(包括抽象方法);
   2) 任何类继承了抽象类后除非实现了所有的抽象方法,否则也是抽象的;
 
7.  UML中关于抽象类的符号
答:1) 抽象类的类名为斜体;
   2) 抽象方法名也是斜体;

8.  反身关联
答:1) 对象图中,相同类的二个实体间的联系;
   2) 但是在类图中只有一个类代表这些对象;
   3) 因此,这种关联回转到相同的类。这样的关联称为反身关联;
   4) 反身关联在关联线的末端必须存在角色名字。这明确地说明你是如何关联这个类的二个对象。

             wife
             |ˉˉˉˉˉˉ|
        |ˉˉˉˉˉ|      |
        |  Person  |      |
        |__________|      |married
        |ˉˉˉˉˉ|      |
        |__________|      |
            ↑____________|
             husband

9.  关联(Association)
答:1) 关联用于描述类图中二个类间的关系;
   2) 包括一些更紧密关系诸如:聚合(Aggregation)和组合(Composition)
      . 联系:厨师使用刀;
      . 聚合:一辆车有一个车载电台;
      . 组合:一辆车一般只包括一个发动机;

        |ˉˉˉˉˉ|             |ˉˉˉˉˉ|
        |   Chef   |  chops with |   Knife  |
        |__________|------------>|__________|
        |ˉˉˉˉˉ|             |ˉˉˉˉˉ|
        |__________|             |__________|

10. 聚合(Aggregation)
答:1) 是关联中的一种;
   2) 更紧密的关联方式;
   3) 聚合是一种整体/部分关系,但“部分”可能被其它对象共享,因而有可能在“整体”外存活。
   4) 表现为“Has A”关系;

        |ˉˉˉˉˉ|                |ˉˉˉˉˉ|
        |   Car    |     has a      | CarRadio |
        |__________| ◇-------------|__________|
        |ˉˉˉˉˉ|                |ˉˉˉˉˉ|
        |__________|                |__________|

11. 组合(Composition)
答: 1) 最紧密的关联方式;
   2) 表现为“always contains”关系, 例如:车不能没有引擎
   3) 在UML图上表现为一黑色的菱形

        |ˉˉˉˉˉ|                |ˉˉˉˉˉ|
        |   Car    |     driven by  | Enginee  |
        |__________| ◆-------------|__________|
        |ˉˉˉˉˉ|                |ˉˉˉˉˉ|
        |__________|                |__________|

动态模型分析

1.  在分析阶段创建动态模型
答:1) 一旦在分析阶段完成对象模型建模,你可以开始对系统和对象在整个时间段内运作方式进行建模,这称为动态建模。
   2) 动态建模发生二次:
      . 在逻辑分析阶段(确信每个操作都是可能的)
        a. 时序图(Sequence diagrams)/协作图(Collaboration diagram);
        b. 状态转换图(State transition diagram);
        c. 活动图(Activity diagram);
      . 在物理设计阶段(分配方法描述给对应的类)
2.  责任
答:在OOA&D中,“责任”指:
   . 一个类知道什么(状态);
   . 一个类做什么(行为);
   . 一个类型知道什么(状态);
   . 一个类型做什么(行为);

3.  分配责任
答:在分配责任时,很重要去确定以及实现以下内容:
   . 专家(指你所分配责任的类完全可实现其责任,这减小了额外对象的依赖以及支持低耦合);
   . 创建者(谁应该创建一个实例);
   . 高聚合(一个类的属性一起完成得很好);
   . 低耦合(减少对象间的依赖性);

4.  改变的必要
答:1) 一个系统中的对象存在是因为它们完成一些作务帮助系统完成它们的目标;
   2) 每个任务需要一定时间完成以及需要在对象间传递一些信息;
   3) 系统中的每个对象代表一组特定的活动;
   4) 你也应该考虑一个操作中所调用的对象以及它们是如何交互去完成这个操作的, 一个对象所完成的每个操作或子操作是如何改变对象的内在状态的;


5.  时序图
答:1) 模仿一定时间内一个系统的单个操作;
   2) 每个时序图:
      . 和一个用例或一个用例中的一个情景直接联系;
      . 确定每个过程中所调用的对象;
      . 确定在一个过程中发现的行业或事件;
      . 确定在每个过程中必须传输什么信息;
      . 确定每个行为后需要什么响应;
      . 对于每个用例至少产生一个时序图
   3) 在分析阶段,他们仅影响交互。在设计阶段,每个交互将会转为一个方法调用。
   4) 一个用例至少一个时序图, 时序图可以制作得很复杂以显示一个用例的多个情景,但最好还是每个情景对应一个时序图。

6.  协作图
答:1) 可以作为时序图的可选对象;
   2) 对象通过标有序号的箭头连接,这些箭头显示了信息的流程;
   3) 箭头从动作源指向目标对象;
   4) 箭头标有序号显示了在一个情景中它们使用的顺序;
   5) 协作图看上去像对象图的子集。操作中被调用的对象在图中表现为装有对象名称的盒子。

7.  状态转换图
答:1) 时序图和协作图显示了在一定时间段内系统中对象是如何传递信息的;
   2) 状态转换图显示了在一定时间段内一个对象是如何改变的,它的方法是如何被其它对象所调用;
   3) 组成:状态和事件;
   4) 箭头用于显示对象各种状态间的路径;
   5) 每个箭头显示了该对象是如何完成特定事件;

8.  状态
答:1) 所有对象均有状态,任何对象的当前状态由存储于其属性中的值指示;
   2) 设想一台打印机,它要么闲置、要么忙碌,打印机只有二种状态:闲置和忙碌;

9.  事件
答:1) 事件是一个对象从一种状态转换到另一种状态的促进因素;
   2) 事件表现为方法调用。方法是一个对象的某些或一系列改变状态的任务;
   3) 当一些对象调用打印机的print()方法,状态由闲置改变为忙碌,print()方法的调用就是导致状态改变的事件;
   4) 一个对象通常处于它状态中的一种,这意味着他们是稳定的。同时也意味着状态的改变应该越快越好。

             |ˉˉˉˉˉ|      print     |ˉˉˉˉˉ|
             |   idle   |--------------->|   busy   |
     ●----->|          |                |          |
             |          |<---------------|          |
             |__________|      eof       |__________|
                  |
                  | delete
                  ↓
                  ◎

10. 活动图
答:1) 显示一个对象和工作流的关系以及描述了相应的处理方法;
   2) 每个用例只有一个活动图;
   3) 每个活动表现为一个圆,该圆上有连接线连到下一个活动。这个连接线被称为板机(trigger);
   4) 一个活动能产生多个板机,这依赖于活动的结果;