65.9K
CodeProject 正在变化。 阅读更多。
Home

统一建模语言(UML)面试题第二部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.61/5 (27投票s)

2008年8月9日

CPOL

12分钟阅读

viewsIcon

244117

协作图、活动图、状态图、包图和组件图

统一建模语言(UML)面试题第二部分

(I)您能解释一下协作图吗?

(I)您能解释一下活动图吗?

(I)什么是状态图?

(I)您能解释一下UML中的构造型(stereotypes)吗?

(I)您能解释一下包图吗?

(B)您能解释一下组件图吗?

(B)您能解释一下部署图吗?

(I)您能解释一下UML在实际项目中是如何应用的吗?

 

引言

在上一部分,我们重点介绍了设计模式,这是架构师面试中最基本的核心知识之一。如果您错过了,可以通过以下链接查看。除了设计模式之外,架构师还需要在将UML图恰当地放入设计文档方面具备更强的能力。

第一部分 - SoftArchInter1.aspx

第二部分 - SoftArch2.aspx

第三部分 - SoftArch3.aspx

第四部分 - SoftArch4.aspx

查看设计模式视频: http://www.questpond.com/FreeDesign1.htm

UML 面试问题第一部分 SoftArch5.aspx

我再说一遍,不要认为仅仅阅读面试题就能获得架构师职位。但确实应该有一些参考资料,可以帮助您快速回顾定义。仅仅阅读这些答案,您就能了解一些基本概念。但如果您没有实际工作经验,肯定会在情景题上失败。因此,请将此作为快速复习,而不是捷径。

祝您求职愉快......

 

 

(I)您能解释一下协作图吗?


协作图

协作图展示的信息与顺序图相同,但方式不同。在顺序图中,我们更关注时间和顺序,而在协作图中,我们更侧重于对象之间的交互消息。

图“协作图”显示了协作图的外观。以下是一些您可以从图中轻松提取的要点:
• 对象用矩形表示。
• 消息由箭头和序号表示。例如,在图“协作图”中,我们可以看到“order product”(订购产品)有一个箭头,表明消息从客户对象发送到产品,而“1”表示这是第一条消息。
• 条件语句用方括号“[”表示。
• 我们还可以通过分组序号来表示,例如使用小数。例如,“Pay by master”(用Master卡支付)和“Pay by Visa”(用Visa卡支付)都归入消息序号“3”(“Do payment” - 支付),因此它们分别表示为3、3.1和3.2。

图:- 协作图

您可以使用“for each”关键字来表示for each循环,如下面的图“协作图中的for each”所示。

图:- 协作图中的for each

 

注意:- 尝试为相同的凭证数据录入屏幕绘制协作图。顺序图和协作图也称为交互图。

(I)您能解释一下活动图吗?

活动图

活动图用于捕获系统中复杂的流程。下面的图“活动”显示了一个简单的活动图。您可以从活动图图中轻松注意到的一些要点是:

• 活动的开始由实心圆表示。
• 活动的结束由一个白色圆内的实心圆表示。
• 活动由简单的椭圆形矩形表示。

图:- 活动


活动图中的决策如图“活动图中的决策”所示。图显示了“[”(方括号)中的条件。因此,第一个活动是“Check Age”(检查年龄),如果年龄大于16,我们可以进入“Adult Movie”(成人电影)活动,否则我们需要执行“Kids Movie”(儿童电影)活动。

图:- 活动图中的决策


在项目中,有时我们需要执行两个并行活动。一条实心粗线表示活动开始并行执行的位置,然后另一条实线表示并行活动汇合的位置。例如,在下面的图“并行处理”中,我们可以看到“Make lemon juice”(制作柠檬汁)和“Make Ginger Juice”(制作姜汁)活动是如何并行执行的。


图:- 并行处理

在大型复杂的活动图中,很难确定哪个对象负责哪些活动。这个问题可以通过“泳道”(Swimlanes)来解决。请看下面的图“无泳道”。整个活动图看起来非常复杂,很难确定哪个对象负责哪些活动。

图:- 无泳道


现在看看下面的图“有泳道”。我们将活动划分给相应的对象,如客户、库存、订单处理、支付和发票。这些划分称为“泳道”,因此,如果您觉得活动图很复杂,可以考虑使用“泳道”,它可以使您的活动图更具可读性。

图:- 有泳道

(I)什么是状态图?


状态图

状态图描绘了一个对象在其生命周期中经历的不同状态。状态图描绘了一个对象如何响应事件。我们认为状态图是可选的,如果您的项目中有对象经历很多复杂状态和转换的场景,则应使用状态图。如果您的项目没有此类场景,则顺序图、协作图或活动图足以满足您的需求。因此,所有对象都有状态,当发生某个事件或转换时,对象会从一个状态移动到另一个状态。

考虑一个对象的状态时,有三个重要因素:事件、守卫和动作。让我们先定义这三项:-

动作:- 动作触发对象从一个状态转移到另一个状态。

事件:- 事件触发动作。

守卫:- 守卫是用于评估触发哪个动作的条件。

这三项是状态图的主要组成部分。下面的图“事件和动作类型”显示了它们在状态图中的表示方式。

图:- 事件和动作类型

我们可以用三种方式来表示。

类型 1:- 这种书写方法用于需要使用守卫将事件映射到动作的情况。例如,在上图“事件和动作类型”中,事件是“鼠标单击”,守卫是“双击”,结果动作是“打开文件夹”。

类型 2:- 守卫是可选的。例如,有时我们只有事件和动作,即没有守卫。例如,当发生“开”事件时,动作是“灯泡亮起”。

类型 3:- 这种表示方法显示了动作的无限循环。例如,在状态“Watch will be running”(手表在运行)期间,正如“事件和动作类型”图中所示,它会无限地运行。

现在我们知道了如何编写事件、动作和守卫,让我们看看状态图的样子。下面的图“状态示例”显示了状态的样子。它是一个椭圆形矩形,如下所示。为了显示转换,我们需要从一个状态显示一个箭头到另一个状态,如图“状态示例”所示。

图:- 状态示例


下面的图“示例状态图”显示了一个简单的状态图。从图中可以立即看到的一些要点如下:

• 深黑色箭头表示状态图的开始。
• 带外侧白色圆圈的实心圆表示状态图的结束。
• 圆形矩形表示状态,而箭头表示事件/转换。

图:- 示例状态图


状态如图“状态图基本元素”所示。它是一个简单的圆角矩形。顶部区域给出状态名称。下面的区域是可选的,包含“do/action”。它表示对象在此状态下进行的长时间活动。

(I)您能解释一下UML中的构造型(stereotypes)吗?


构造型(Stereotypes)是定义现有UML模型变体的一种方式。引入这种变体是为了以一致的方式扩展UML。它们显示在双小于号和双大于号之间,带有简单的文本,如下所示。下图左侧显示了没有构造型的类图,而右侧显示了带有构造型的类图。您可以轻松看出带有构造型的类图的可读性。例如,“Customer()”可能被误认为是方法,但通过使用构造型,我们澄清了它是一个构造函数。

图:- 构造型


以下是一些在编写UML时常用的构造型。

<<Application>>:- 用于表示应用程序中的UI系统。
<<Database>>:- 表示应用程序中的数据库。
<<Table>>:- 数据库中的表。
<<Library>>:- 可重用的库或函数。
<<File>>:- 文件夹上的物理文件。
<<Executable>>:- 可执行的软件组件。
<<Web services>>:- 表示Web服务。
<<JDBC>>:- Java数据库连接,用于连接数据库的JAVA API。
<<ODBC>>:- 开放数据库连接,用于连接数据库的Microsoft API。


(I)您能解释一下包图吗?


包(Packages)就像系统中的文件夹,允许您在逻辑上对UML图进行分组。它们使复杂的UML图更具可读性。在实际项目中,它们用于逻辑地分组用例和类。因此,我们可以说有两种类型的包图:一种是类包图,另一种是用例包图。包图描绘了类和用例的概要高级视图。

类包图:- 类包图用于逻辑分组类。您可以认为包在技术上对应于JAVA中的“Package”以及C#和VB.NET中的“Namespaces”。包在大的矩形上用小的矩形表示,如图“包图”所示。需要注意的一点是构造型。我们给图编号是为了更好地理解它。

1 – 我们使用了MVC(模型-视图-控制器)框架。因此,我们使用“<< Framework >>”构造型来表示这个包。请参考前面部分讨论的常用构造型表。

2和3 – “Book tickets”(订票)是第二个包,它继承自MVC模型。构造型是“<<application>>”,这意味着它是一个用户界面。

4 – 一条简单的线表示两个类之间的链接,表明一个类包使用了另一个类包。

5 – 这个包是订票引擎库的集合。

6 – 最后一个包是数据库。

图:- 包图


如前所述,包只不过是逻辑类或任何UML实体的集合。我们展示了上面包图的详细信息。我们应该限制使用包图来显示深入的架构,因为这可能会变得非常复杂。例如,下面的图“详细包图”显示了如果使用包图来显示深入架构,它可能看起来有多复杂。为了避免复杂性,最好只绘制一个整体图,如图“包图”所示。

图:- 详细包图


用例包图:- 就像我们逻辑地对类进行分组一样,我们也可以使用包图来逻辑地对用例进行分组。下图显示了用例包图的外观。

图:- 用例包


(B)您能解释一下组件图吗?


组件图实现了与包图相同的目标。它们显示了软件组件之间的依赖关系。下图“组件图”展示了一个简单的应用程序数据录入的组件图,该应用程序使用Web服务与数据库交互。我们已对步骤进行了编号,以帮助理解组件图的细节。

1 – 显示两个矩形来表示系统的组件。

2 – 使用构造型来表示它代表哪种类型的系统。
3 – 带圆圈的线表示一个接口,外部世界可以通过该接口与组件交互。例如,在图中,我们表示了一个“Customer Web service”(客户Web服务),可以通过XML与之交互。

图:- 组件图

(B)您能解释一下部署图吗?


部署图表示了应用程序中软件和硬件节点的整体静态视图。它们显示了硬件是什么,以及哪些组件安装在哪个硬件上。在部署图中,我们用实心框和简单的下划线文本描述来表示硬件。您可以在单个硬件上拥有多个组件。因此,浏览器是一个应用程序UI,它驻留在工作站计算机上,而数据库和Web服务器驻留在Web服务器硬件上。部署图可以更复杂,包含防火墙、支付网关、PDA设备、VPN等。

图:- 部署图

(I)您能解释一下UML在实际项目中是如何应用的吗?


在实际项目中,我们不会绘制所有图。每个UML图都是有目的的。这完全取决于项目的性质。简而言之,您应该问自己一些问题,例如,这个图重要吗?我的需求是什么?等等。因此,下面是您可以在项目中遵循的一个流程,再次强调,这取决于您想要描绘的情景。

图:- UML在实际项目中的流程

• 第一步是从需求文档中提取用例。
• 一旦提取了用例,我们就需要决定系统中将要流动的消息。这可以通过交互图来完成。如果您需要了解对象的创建生命周期,我们使用顺序图;如果您想专注于消息,我们使用协作图。因此,根据情景,我们需要选择要绘制的图。
• 现在我们清楚了消息,就可以绘制类图来描绘项目的静态部分,即类。
• 如果我们发现任何复杂的类关系,我们就绘制对象图。
• 如果我们需要描绘任何复杂的代码,我们就需要用活动图来表示。
• 最后,为了提供项目的概览,我们可以使用包图、组件图或部署图。如前所述,我们可以结合使用组件图和部署图来提供架构的概览。

注意:- 在面试中,切勿说我们在技术文档中使用了所有UML图。这会给人留下非常不好的印象。如前所述,每个UML图都是根据项目的情景绘制的。

© . All rights reserved.