1
面向对象软件工程实践指南
1.2.8.5 8.5 从设计模型生成代码
8.5 从设计模型生成代码

从设计模型生成代码的映射规则如下。

1)类的映射

在设计类图中定义的每一个类都是将被映射到代码中的类。

2)属性的映射

设计类中定义的属性将直接映射为代码中的属性。不同编程语言中数据类型有所差异,在映射时需要考虑这种差异。比如说Java中的Date类型包含了通常所指的日期和时间。

3)方法的映射

方法一般进行直接映射,有两种方法需要特殊处理:

(1)创建方法映射成相应语言中的构造函数。

(2)集合对象的方法需要转换成所采用的集合类所具有的方法。

4)类的关系的映射

类的关系有依赖、关联、聚合、组合和继承。从耦合强度的角度看,依次增强。它们在实现为代码时,也都有相应的体现。

(1)依赖关系。依赖关系有如下三种情况:

a.A类是B类中的(某种方法的)局部变量。

b.A类是B类方法当中的一个参数。

c.A类是一个全局对象,B类的对象访问该全局对象的参数。

图8-2为一个依赖关系的例子,其在代码中的体现为Facility作为一个Meeting方法的一个输入参数。

图8-2 依赖关系

public class Meeting

public void bookfacility(Facility facility)

facility.book(self)

……

pubic class Facility

public boolean book(Meeting meeting)

……

(2)关联关系。关联一般映射为引用属性。类的引用属性是依据类图中的关联和方向性来确定的,一般将关联中的角色名字作为引用属性的名字。关联有不同的类型。

a.双向关联,默认情况下,关联是双向的。在图8-3所示的例子中,两个类内部都有属性来保存对对方的引用。

图8-3 关联关系

Public class Teacher{

public Array List courses;

public Teacher(){}

……

Public class Course{

public Arraylist teachers;

public Course(){}

……

b.单向关联。在关联有方向的情形下,从某一对象出发可以找到箭头所指的类的对象。图8-4所示的例子中Course内部具有属性来保存相关的Teacher对象的引用。

图8-4 单向关联

Public class Teacher{

public Teacher(){}

……

Public class Course{

public Arraylist teachers;

public Course(){}

……

c.自关联。一个类的某些对象可以与另外一些对象有关联关系,如图8-5所示的例子,一门课程存在一些前序课程,那么在它的代码内部定义有该类型的对象(数组)作为属性。

图8-5 自关联

Public class Course{

public Arraylist〈course〉precourses;

public Course(){}

……

d.关联的多重性。关联两端的角色具有数量上的对应关系,这称为关联的多重性。其在代码中一般通过将保存对象引用的属性定义为集合类、数组等得到体现。上述多个例子中均有体现。

(3)组合和聚合。组合和聚合是一种更强的关联关系。前面已经讨论过它们的区别。图8-6为一个案例。它们在实现为代码时,有以下一些区别:

图8-6 类的组合与聚合关系

Public Rectangle{

public Arraylist Points;

public Format format;

public Rectangle(floatx1,floaty1,floatx2,floaty2,floatx3,floaty3,

floatx4,floaty4){

Points.add(new point(x1,y1));

Points.add(new point(x2,y2));

Points.add(new point(x3,y3));

Points.add(new point(x4,y4));

Public Set Format(Format format){

this.format=format;

a.构造函数不同。聚合类的构造函数中包含了另一个类作为参数。Rectangle的构造函数中要用到Format对象作为参数传递进来。Format可以脱离Rectangle而独立存在。

组合类的构造函数中包含了另一个类的实例化。表明Rectangle在实例化之前,一定要先实例化Point类,这两个类紧密的耦合在一起,同生共灭。一个Rectangle对象内部的Point对象是不可以脱离该Rectangle对象而独立存在的。

b.信息的封装性不同。在聚合关系中,客户端可以同时了解Rectangle和Format对象,因为它们都是独立的。在组合关系中,客户端只认识Rectangle对象,根本就不知道它所包含的Point对象的存在。

(4)继承关系。继承关系是面向对象的基本机制,因而任何面向对象语言都会给予直接支持,在此略过讨论。

有一种特殊的继承关系——实现关系,是用来规定接口和实现接口的类的关系,接口是操作的集合,而这些操作就用于规定类或者构建的一种服务(见图8-7)。各种语言也会有机制来支持,例如Java中就用implement来支持。

图8-7 接口实现

public interface Facility

public boolean book(Meeting meeting);

public class Projector implements Facility

public boolean book(Meeting meeting)

……

public class Printer implements Facility

public void boolean book(Meeting meeting)

……

5)方法体

方法体内的代码可以通过观察消息的顺序,从而生成方法定义中的一系列声明。