UML软件工程组织

用Rational Rose和UML开发J2EE应用
(选自时代朝阳数据库)
前言

  成功地运用J2EE构建企业应用的关键和所有复杂的软件平台是一样的:有效的需求沟通、制定正确的分析和设计决定,并且识别最佳的实现选择。

  追求最佳可视化模型的公司可以更快地开发它们的软件,并且建立更高质量的系统。Unified Modeling Language (UML)就是可视模型化的软件工业标准。

  在这里,我们将向你介绍如何运用UML和Rational Rose 2001a,它是现今最流行的基于UML的软件模型化和开发工具,可用于开发基于J2EE的企业应用。

  什么是UML?

  Unified Modeling Language (UML),是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。

  使用UML作可视化模型主要是为了了解系统的重要细节,以便项目的需求可以清晰地表达、开发出解决方案体系、并且一个选择的实现可以清晰地标识和构造。为达到这个目的,需要丰富的符号来表达模型化的软件系统。UML不但为基本的构造块提供了符号表示,它还提供了方法来表达基本构造块之间的复杂关系。这些关系都以UML框图的形式表示出来。

  以下就让我们来看一下UML和Rational Rose是如何有助于理解、设计和实现J2EE应用的。

  理解需求

  项目失败的原因通常是由于需求没有很好地理解或者进行沟通。我们也可以很容易地理解,无论是口头或者书面的语言,都是不严密的。

  你可以应用UML用例模型来开发一个精确的模型来表示系统的需求,然后以这些用例为基础来推动系统开发的其它方面。用例的作用就好象是项链上的一条线,它将所有的珍珠绑定在一起。用例在最终的用户和系统需求之间建立起一座桥。它们可用来在功能需求和系统实现本身之间进行回溯。用例也可以作为一个连接点,连接到一个详细的说明需求细节的用例文档。

  图1展示了一个在线CD商店的部分用例框图,它们是从文本和口头的功能需求中提取出来,然后转为用例。在这个例子中,很明显购买者(由几条线条组成的人物,表示为UML中的角色)可以通过4种方式来使用系统(在UML中以椭圆表示一个用例)。


***********图1********
一个简单的用例图

  每个用例则通过顺序框图中的一个或者多个场景来精确描述。当然,在需求捕捉和分析的早期阶段,顺序图是相对简单,而且也可能是不完整的。顺序图的这样一个例子如图2所示。在Rational Rose中,要为某个用例创建顺序图,你可以在浏览器中选择它,然后从用例的菜单中选择New>Sequence Diagram。


***********图2************
一个解释付费用例的顺序图

设计一个方案

  随后的阶段是用例分析,对于内部元素是如何交互来满足系统的功能需求,以及它们是如何相关,这个阶段提供了一个初始的、高级别的定义。这个分析需要进行反复的试验,直到产生满意的解决方案。“Analysis classes(分析类)”的行为通常是通过自然的语言描述的,比较抽象,在这个分析阶段中,它是一个有用的工具。分析类通常都不在软件中实现,虽然我们可以做到这一点,实际上,在总体设计过程中,分析类才会转换为精确定义的设计类和子系统。

 

  我们首先要精心地制造顺序图,以便它们可以揭露出系统的内部运作,我们并不是通过展示角色和一个系统的交互来分析系统,而是将系统分解成独立的分析对象。系统的职责被分解到分析级别的对象中,以便可以得到一个更好的顺序图。在这里我们要介绍三种分析对象:

  .边界对象

  边界对象代表系统的内部工作和它所处环境之间的交互。它包括有一个用户通过图形界面的交互,与其它角色的交互(例如代表其它系统的角色),和设备的交互等。边界对象将系统的其它部分和外部的相关事物隔离和保护起来。简单地说,每一个角色-用例交互对映射到一个边界对象。

  . 实体对象

  实体对象代表系统的重要信息。在一个很长的时间内,它们都是持久和存在的。它们的主要目的是表达和管理系统中的信息。在模型中,系统中的关键概念以实体对象来表现。

  . 控制对象

  控制对象是用来模型化系统中的行为的。控制对象并不需要实现这个行为,它可能是与其它对象协作以实现用例的行为。它的想法是为了将行为和模型下层的信息隔离开来,这样在处理以后的改变时就比较容易。

  UML提供了stereotype符号,它表示为放在一个双角括号中的文本,以便和不同类型的类区别开来。在Rational Rose中,你可以很容易地创建分析类,只需将类的stereotype字段分别修改为< >, < >和< >就可以了。这些都可以作为创建分析级框图的基础。

  付款用例顺序图的一个更新版本如图3所示,这里系统被分解为分析对象。在这个图中,使用图标来代表边界、控制和实体对象(分别以一个T、带箭头的圆圈和一个带切线的圆表示)。

  当然,类通常都参与到几个用例中,因此为确保系统的一致性,理解它们的静态关系也是同样重要的。对于捕捉不同结构元素的静态模型,UML类图是很有用的。

  首先,我们标识和放置用例中所有的类到一个类框图中。我们已经将用例的行为分布到对象中,所以要分析每个类的操作就变得相对简单了。要注意的是,这些是分析的操作,这意味着随着我们不断地进行分析和设计,这些操作将会不断地需要细化。

  Rational Rose可让你很简单地在顺序图中的分析类上定义新的操作,你只要选择现有的信息,并且在菜单上选择 就可以了(如图3所示)。如果你已经定义了一个类的操作,你可以简单地由列表上选择现有的操作。


****图3:带有分析对象的精确顺序图****

  这是Rational Rose中的一个典型方法,它可以提高用户的生产力,并且确保整个模型的一致性和质量,另一个类似的有用特性包括有查询模型哪个类和消息是没有解释的(例如在模型中没有映射到真正的类或者操作)。

  还有一个方面是需要标识每个类的属性。属性代表的信息,可能是其它类需要的,也可能是类自身为履行自己的职责需要的。在这个分析阶段,应将属性标识为普通的类型,例如数字、字符串等。

  要完成用例的类图,你还需要标识类间的关系。在这个阶段中我们特别感兴趣的关系是关联、依赖和继承。

  在分析完所有的用例和为每个用例创建类框图后,我们就需要接合各种不同的分析类来得到一个统一的分析模型。这是一个重要的活动,因为我们需要得到一个最小集合的类,并且为了避免在最后的分析模型中出现不必要的冗余。

  这个阶段的主要任务是标识在用例间重复出现的类或者只有很小改变的类。例如,对于跨用例间拥有类似行为或者表示同样概念的控制类,我们应该将它们合并。拥有同样属性的实体类也应该被合并,它们的行为也合并为一个类。

  图4展示了一个初步分析级的类框图(这是根据图1的用例得到的)。由于我们现今只是关系类间的关系,所以我们使用Rational Rose的显示过滤能力来过滤掉每个类的细节(通过不勾选Format>Show all attributes和Format>Show all operations就可以了)。


**********图4************
初步分析级的类框图

 

实现软件

  虽然分析模型可以帮助你解决问题提供了一个基础,不过离实现还是很远。在设计期间,你必须考虑到所采用的技术带来的额外限制和需求,并且尝试映射解决方案到最优化的实现。

  在我们的例子中,假设我们正在建立一个基于Web的应用。实现这样一个应用需要一个深思熟虑的方法。分析模型的作用是作为一个出发点,用来决定将不同的J2EE技术映射到方案。例如,<<control>> 类可很好地映射到Java Servlets或者Enterprise JavaBean (EJB) Session Beans。这个方法可以将J2EE层的实现模型和Sun的"Model 2"参考体系对应起来。

  Rational Rose提供了一个简化的接口来开发servlets和EJB Session Beans。图5显示了创建一个servlet的对话框。


****图5 Servlet定义窗口*****

  虽然EJB包含有多个接口和类,Rational Rose还是提供了创建EJB的便利接口。创建EJB的对话框如图6所示。在这里,对话框显示了需要创建一个无状态Session Bean的设置。


  ****图6****
创建一个无状态Session Bean

  得到的Session EJB如图7所示。这是基于为EJB开发的UML模型,它是以Sun Java Community Process在JSR-26开发的。它显示了构成EJB的各种元素之间的关系,特别是home和remote接口和EJB实现类。由于EJB并不真正实现home和remote接口(它们是通过配置工具自动产生的对象实现的),因此关系并不是实现home和remote接口而是分别产生<<EJBRealizeHome>>和<<EJBRealizeRemote>>。home和remote接口的依赖关系表明home接口实例化remote接口。


************图7**********
一个无状态Session Bean

  <<boundary>>类粗略地映射到JSP、HTML和form,如果你正在开发一个传统的基于客户的应用,它映射到一个客户应用的对话框。我们使用JSP作为呈现实体和系统交互的的一个手段。JSP实际上由两个方面,也就是客户端的表现和服务器端的行为,所以它的模型包含有一个客户端页面和服务器端的页面,它们之间的关系是<<build>> 。一个例子如图8所示。


***********图8***********
JSP作为服务器端和客户端页面

  创建一个JSP比EJB还简单,你只需要在browser的菜单中选择Web Modeler>New>Server Page就可以了,如图9所示。


*************图9***********
在Rational Rose中创建一个JavaServer Page

  诸如Catalog, Order和Customer的<<entity>> 类可映射为Entity Bean。它们的创建如上面图6所示。

  J2EE应用中常利用的一个技术是使用JavaBean在servlets和JSPs之间传送信息。在Rational Rose中要做到这一点是很简单的,通过在一个Java类上创建attributes,并且通过如图10中的attribute规范对话框来将attribute设置为属性。


*************图10***********
将一个attribute设置为属性

  在整体实现模型中,创建JSPs, servlets, JavaBeans和EJBs是非常有用的。Rational Rose可让你很容易地模型化关系和告诉工程师其中的基本细节,不仅包括JSPs, servlets, EJBs和JavaBeans,还包括实现中涉及到的HTML页面和Form。这些可以送给表现层开发者作进一步的处理,同时可与你的应用逻辑保持兼容性。

  图11是某个类框图的一部分,它显示了实现在线CD商店中涉及到的不同技术。该框图展示了各个类以及它们如何与表现、商业逻辑和数据层排列在一起。这样,客户端的页面在左边,控制的servlet在中间,Entity Beans在右边。


 *************图11**************
 在线CD商店的部分实现模型

  该框图只显示了付费和浏览CD细节用例中需要用到一些类。我们可以通过一个简单的付费情景来尝试“阅读”该框图。假定你已经浏览完毕,并且选择了一些准备购买的CD,你在主页(左边的顶部)上选择“checkout”的选项。这样将会调用经由相关stereotyped <<link>>显示的MainSerlet控制器。MainServlet由Order EJB中得到订单的细节,构造一个Order JavaBean,并且将它设置为session的一个属性,并且将请求向前送,如<<forward>>标识的一样,直到一个Checkout JSP。Checkout JSP使用Order JavaBean,如JSP和Order JavaBean之间所示的<<Use Bean>>关系一样,它会构造Checkout_Client页面并且呈现给用户。

  很明显,我们忽视了其中的一些细节。例如,在实际的项目中,你可能将使用购物车来跟踪项目;控制的责任或许会更分散,而不只是用唯一一个MainServlet等。这里的主要观点是告诉你,对于设计和开发复杂的J2EE应用,UML是一个强大的工具,通过上面的例子,你将会认识到这一点。

实现工作

  Rational Rose可让你直接从框图中产生, JavaBean, HTML, Servlet和EJB代码。例如,两个JSP间的<<include>>关系将会在导致在相应的JSP中产生<%@ include file="header.jsp" %> 。同样,<<Use Bean>>将会在JSP中产生<jsp:useBean id="cd" class="com.rational.cdshop.util.CD" scope="session">,这样就可使用CD JavaBean。

  在EJB方面,除了可为EJB2.0中的全部三种EJB产生代码外(以及符合EJB1.1的EJB),Rational Rose还提供了一些特性以简化EJB的开发。例如,在开发EJB时,其中一个较麻烦的是需要在接口和实现类中写方法的代码。Rational Rose提供了一个菜单的选项,你只需要按一下按钮就解决了。它还提供了一个"check and repair"菜单选项,可以验证定义的EJB的合法性(例如,remote接口中的remote方法和EJB实现类中的是对应的),如果不是,可以为你修复它们。

  Rational Rose中另一个和EJB相关的特性是Rational Quality Architect (RQA),可用作设计测试EJB。例如,可以使用RQA为EJB作单元测试。还可以使用在Rose中定义的顺序图来作多个EJB的测试。当依赖某个软件组件,但是它还未设计好,那么可以使用RQA来产生框架。

  为了确保可以用自己的条件来实现,而无需担心UML模型的改变,反之亦然,Rational Rose提供了一个内置的代码编辑器,用户可以设置同步的选项。例如,你可以选择一直保持同步。在这种情况下,每当你更新源代码并且保存时,Rose中的UML模型就会自动被更新。有些时候,你可以只是想看一下它们是如何处理的,并不想影响你的模型。在这种情况下,你可以在全局或者基于每个类的设置将同步关掉。

  当然,当谈到实现和编码时,你将需要一个好的IDE,例如Sun's Forte for Java或者Borland JBuilder。Rational Rose 2001a提供的主流IDE的深度集成和自动同步,所以可以在享受Rational Rose在UML模型和开发J2EE应用好处的同时,继续使用自己最喜爱的IDE。

  关于UML和J2EE的更多方面

  我们只是很简略地谈了一下使用UML作模型及开发J2EE应用。例如,通过session中涉及到的各种实体,你可以使用UML活动图来模型化session管理。

  另一个挑战是传达session EJB需要的正确操作调用顺序。一个顺序图可以标识某个情景,但是你需要大量的顺序图来表示组件支持的各种情景(有些人尝试使用带有控制和分支语句的顺序图,但是这样只会得到一个复杂和费解的顺序图)。另一方面,UML状态图提供了一个强大的功能,可以模型化和传达这些信息。通过状态图,你可以查看顺序图的每个情景,这样你就可以验证每个顺序图,并且看组件是否支持你需要用的操作。

  总结

  通过使用UML,你可以理解需求,作正确的分析和设计,并且在一个经过验证的规则上开发一个方案和作最佳的实现,从而可以明显的提升开发可扩展、易维护和可长时间使用的软件的机会。

  Rational Rose是仅有的可以支持全程建模及J2EE应用设计的UML模型工具。

 

版权所有:UML软件工程组织