9.2 面向对象的软件工程


  • 面向对象的软件工程是面向对象方法在软件工程领域的全面应用, 从软件工程过程的角度讲,包括了管理过程技术 3 个方面。
    ![[Pasted image 20230627103531.png]]
  • 从生存周期角度讲,包括 OOA,OOD,OOP,OOT,OOSM。
  • 面向对象基本概念
    1. 对象
      • 对象是对问题域中客观存在的事物的抽象,是一组属性和在这些属性上的操作的封装体。
      • 对象包括两大要素:属性(用来描述对象的静态特征)和操作(用来描述对象的动态特征)。
      • 类是具有相同属性和操作的一组相似对象(实体)的集合。同类的对象具有相同的属性和方法。
      • UML 中类图的描述通常表示为长方形,其中,长方形又分 3 个部分,分别用来表示类的名字、属性(静态)和操作(动态)。
      • 例如, “小汽车”类的 UML 类图描述可以参见图9.3。
        ![[Pasted image 20230627111037.png]]
    2. 消息
      • 消息是面向对象系统中对象之间交互的途径,是向另外一个对象发出的服务请求,请求对象参与某一处理或回答某一要求的信息,是对象之间建立的一种通信机制;
      • 通常一个消息的关键要素包括消息的发送者、消息的接收者、消息所要求的具体服务及其参数、消息的应答等;
      • 例如,若有已定义的类 Circle,定义 MyCircle 是 Circle 类的一个对象,则语句 MyCircle.Show(GREEN)用来表示该对象向系统发送一个要以绿颜色显示自己的消息,其中 MyCircle 是发送消息的对象名字,Show 是消息名, GREEN 是消息的参数。
    3. 封装
      • 封装指把对象的属性和操作结合成一个独立的系统单位,并尽可能隐藏对象的内部细节;
      • 封装的作用有 3 个方面:
        1. 一是使对象形成接口和实现;
        2. 二是封装的信息隐藏将所声明的功能(行为)与内部实现 (细节)分离;
        3. 三是封装可以保护对象,避免用户误用。
  • 对象、类及类之间关系的分析
    1. 类与对象的关系
      • 类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。因此,对象又称为是类的一个“实例( Instance) ”,类又称为是对象的“模板(Template);

      • 类是静态的,类的语义和类之间的关系在程序执行之前已经定义,但对象是动态的,在程序执行过程中可以动态地创建和删除对象;
      • 类代表一类抽象的概念或事物,对象是在客观世界中实际存在的类的实例。
    2. 类与类之间的关系
      • 继承(Inheritance)
        1. 继承是子类自动地共享父类中定义的数据和方法的机制;
        2. 反过来,从子类抽取共同通用的特征形成父类的过程也叫做泛化(Generalization);
        3. 继承可以表示类与类、接口与接口之间的继承关系,或类与接口之间的实现关系;
        4. 具有继承关系的类之间,既具有共享特性又具有差别或新增部分,并且类之间具有层次结构;
        5. 继承具有传递性。
      • 多态性(Polymorphi)
        1. 指子类对象可以像父类对象那样使用,它们可以共享一个操作名,然而却有不同的实现方法,换句话说,指在父类中定义的属性或操作被子类继承后可以具有不同的数据类型或表现出不同的行为。
        2. 多态性的实现有两种形式:
          • 编译时的多态性
          • 运行时的多态性
          • ![[Pasted image 20230627112304.png]]
      • 关联(Association)
        1. 关联体现的是两个类之间语义级别的一种强依赖关系,一般是长期性的,而且双方的关系一般是平等的;
        2. 关联可以是单向的、双向的;
        3. 表现在代码层面,被关联类 B 以类的属性形式出现在关联类 A 中,也可能是关联类 A 引用了一个类型为被关联类 B 的全局变量。
      • 依赖(Dependancy)
        1. 依赖就是一个类 A 使用到了另一个类 B ,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类 B 的变化会影响到类 A ;
        2. 表现在代码层面,假如类 A 的某个方法中使用了类 B ,那么就说类 A 依赖于类 B ,它们是依赖关系。类 B 在类 A 中都是以局部变量的形式存在的;
        3. 在 UML 类图设计中,依赖关系用由类 A 指向类 B 的带箭头虚线表示,虚线箭头表示依赖,箭头指向被依赖的类,参见图9.10。
          • ![[Pasted image 20230627113214.png]]
        4. 关于关联关系和依赖关系有一个简单的判断原则:某个类以成员变量的形式出现在另一个类中,二者是关联关系;某个类以局部变量的形式出现在另一个类中,二者是依赖关系
      • 实现( Realization )
        1. 实现是用来规定接口和实现接口的类之间的关系,接口是操作的集合,而这些操作就用于规定类或者构件的一种服务;
        2. 实现是类和接口之间最常见的一种关系,一个类实现接口(可以是多个)的功能;
        3. 在 UML 中,类与接口之间的实现关系用带空心三角形的虚线来表示,参见图9.11。
          • ![[Pasted image 20230627113504.png]]
      • 聚集(Aggregation)与组合(Composition)
        1. 表示组成关系的整体和部分类之间的关联又可以细分为聚集组合。需求描述中的“包含” 、“组成” 、“分成……部分”等词常常意味着存在组成关系;
        2. 整体拥有各部分,部分与整体不是相同的生存期,如整体不存在了,部分还存在,称为聚集
        3. 部分与整体具有同样的生存期,如整体不存在了,部分也会随之消失,称为组合
        4. 关联和聚合(聚集和组合)的区别如下:
          • 关联和聚合在代码层面的表现是一致的,只能从语义级别来区分。关联的两个对象之间一般是平等的,如你是我的朋友,聚集则一般不是平等的,表示一个对象是另一个对象的组成部分。
          • 关联是一种结构化的关系,指一种对象和另一种对象有联系。
      • 类与类之间的关系(小结)
        1. 继承与实现体现的是一种类与类或类与接口之间的纵向关系
        2. 其他 4 种(组合、聚集、关联、依赖)表示的是类与类或者类与接口之间的引用、横向关系,是比较难区分的,因这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,四者之间的强弱关系依次为:组合>聚集>关联>依赖。
  • 典型的面向对象开发方法
    1. 自20 世纪80 年代后期以来,相继出现了多种面向对 象开发方法,每种方法都有自己的一套系统分析过程 和方法,都有一组可描述过程演进的图形标识,以及 能使得软件工程师以一致的方式建立模型的符号体系
    2. 本节选择其中几种典型的OO 方法进行简介和比较
    3. Booch 方法
    4. Coad/Yourdon方法(简称 Coad 方法或 OOAD 方法)
    5. OMT/Rumbaugh 方法
    6. OOSE 方法
    7. Wirfs-Brock 方法
    8. 统一建模语言 UML(Unified Modeling Language)1995 年10 月,Grady Booch 和Jim Rumbaugh 联合推出了 Unified Method 0.8 版本,该方法力图实现OMT 方法和 Booch 方法的统一。同年秋天,Ivar Jacobson 加入了Booch 和Rumbaugh 所在的Rational 软件公司,于是OOSE 方法也 加入了统一的过程中。1997 年9月1 日产生了UML 1.1,并被 提交到了OMG(Object Management Group 对象管理组织) ,同年11 月被OMG 采纳。随着OMG 将UML 定为标准建模语 言,面向对象领域的方法学大战也宣告结束,各种方法的提出 者也开始转向UML 方面的研究

  目录