技术开发 频道

软件开发新思维

    ----在图3中,应用工程的实施依赖于领域工程的输出,即产品空间、构件、构架和生产计划,以及特定产品的需求,应用工程的结果是符合上述需求的产品。领域工程和应用工程之间也没有固定的顺序关系,它们是一个迭代的过程,可以采取自顶向下的开发策略,即从一组构件和构架出发,生产符合用户需求的特定产品;也可以采取自底而上的开发策略,即从一组产品出发,提炼可复用的构件和构架。

    项目实施过程

    ----建立商业领域软件开发平台的过程就是在实施领域工程,为商业领域应用工程的实施建立基本能力和必备基础。现在比较流行的软件开发方法是面向对象方法,但随着对软件复用认识的不断深入,基于构件的软件开发逐渐成为学术界和产业界关注的焦点。构件是对象概念的延伸和发展,通常可以认为,构件的粒度比对象的粒度更大,它们是独立的功能单元,在实现上可以是一组协作的对象集合,典型的构件如 CORBA构件、DCOM构件、JavaBeans 构件等。在由对象构成的系统中,对象具有小粒度、大数量的特点。相对而言,构件系统中的构件具有大粒度和小数量的特点。鉴于目前基于构件的开发方法还处于研究阶段,缺乏完整的方法学的支持,因此在该项目的实施过程中,我们结合了面向对象方法和基于构件的开发方法,但由于其间过渡的不平滑,因此引入了“构件关系建模”活动,基本实施过程如图4所示。
 


    ----商业领域软件开发平台实施过程中主要活动如下: 

    ----(1) 领域建模

    ----模型是对现实世界的一种抽象,因此,任何一个模型都不可能事无巨细地刻画现实世界的各个方面。我们采用了ARIS模型,从过程、数据、功能和数据等四个方面对不同的商业业态进行了比较完整的刻画,标识出系统的共性和变化性。从ARIS模型可以直接转换为系统的Use Case模型。

    ----(2) Use Case建模

    ----Use Cases目前被认为是一种较好地获取软件系统需求的手段,特别是在基于构件的系统开发中。通常,一个系统有许多不同类型的用户,每种类型的用户作为系统的一类活动者(actors),通过和Use Cases的交互使用系统。一个Use Case 表示了系统向活动者提供一些有价值的结果而执行的动作序列。所有活动者Use Cases和它们之间的关联构成了系统的Use-Case模型,反映了用户同系统的交互,刻画了系统的功能和行为。

    ----在商业领域业务模型的基础上,将注意力集中于捕获系统为每个用户(即活动者)所提供的服务上,根据用户的实际需要确定系统的功能。所有用户不需要的功能是系统中不应包含的,而任何用户的每种需要又是系统中必须包含的,这样就在用户的真正需求和分析人员获取的需求之间建立了一一对应的关系。
   
    ----(3) 面向对象分析

    ----需求规约阶段的主要任务是以准确、无二义的方式刻画用户需求,使开发人员能更准确地理解在需求获取阶段得到的Use-Case模型,把Use Cases 细化为对象和对象之间的交互。这个阶段以Use-Case模型作为输入,产生的结果主要包括表达系统静态特征的类图和动态特征的顺序图。

    ----标识系统的类和对象是建立上述静态和动态模型的基础。通过Use Cases,识别参与实现Use Cases的对象,并把Use Cases中定义的责任分配给不同的对象类。以这种方式,可以确定系统真正需要的、并实现Use Cases的一组对象类,然后建立对象类之间的关系,包括关联、依赖和继承。

    ----顺序图在某种意义上是Use Cases的一种实现,Use Cases在黑盒层面上表达了用户和系统的交互,顺序图则通过参与一个Use Case的对象实例之间的交互,详细地表达了如何实现该Use Case。

    ----(4) 构件关系模型

    ----前面提到过,为了弥合面向对象分析和基于构件的设计之间过渡的不平滑,我们引入了构件关系模型。在这里,构件的接口定义了一组对外提供和要求的功能,构件在实现上对应一组协作的对象。

    ----构件之间的关系包括功能连接和聚集两种,功能连接表达了一个构件对外提供功能和另一个构件对外要求功能之间的匹配。值得注意的是,我们这里并没有引入泛化(generalization)关系,在面向对象中是通过继承机制体现的,可以很好地支持源代码级的复用,但也存在着一定的局限性,其中最突出的是被称为“脆弱的基类(fragile base classes)”问题。继承机制在支持复用时,子类可以直接使用父类提供的属性和服务,并根据需要做适应性修改,一旦继承树中的某个非叶节点的接口发生变化时,这种影响就会波及到以该节点为根的整个子树,有时这种波及并不是所希望的;继承机制还会带来复用的效率问题,复用一个子类会引入该子类的所有父类,如果整个继承树很大(实际情况往往是这样的,如Microsoft Visual C++的MFC库,Java中类库等),会导致巨大的开销,这也是面向对象在一些对性能要求很高的领域难以广泛使用的原因之一。在构件关系模型中,我们通过使用聚集来实现构件之间的复用。

0
相关文章