代码改变世界

用微软.NET架构企业解决方案 学习笔记(二)UML概要

2010-08-06 00:04  Virus-BeautyCode  阅读(3855)  评论(4编辑  收藏  举报

 

UML概要

 

 

 

引言

  设计一个系统,任何科学领域的系统,你首先需要做的是对它进行抽象。抽象模型为系统的视图、结构、行为、参与实体和流程方面具体的实现提供一个代理。在系统的参与人员(包括:开发者,架构师,所有者,用户)之间应该共享一个模型。为了能够提出反馈,提出错误的假设,改进建议,模型应该能够被系统的参与者所理解。尽管共享了一个模型,你还是需要用一种通用的,被广泛接受的的形式和符号来表达模型。例如:模型语言。

  显然,建模语言是基于一系列规则、符号、图表和关键字的图形或者文字语言。语言的元素用来表达模型的结构和行为,给任何熟悉语言的人传达清晰的认识和信息。

  有很多著名的建模语言例子,最流行的一个就是UML(Unified Modeling Language 统一建模语言)。UML是一种通用的图形建模语言,在过去的很多年,已经变成了工业的标准。UML特别适合于建立面向对象的系统。

正文

  1、简介

  建模在任何软件项目中都是一个关键的阶段,对于大型的、企业级的应用更是至关重要。

  在复杂的情况下,模型是一个本质。它可以帮助检查详细设计的正确性和遵守程度,使得软件可以更加容易的构建和维护。一个清晰的、良好的模型同样可以在任何时候帮助开发者找到断点的正确位置,并且修复bug。在软件中,模型应该和站点地图、蓝图同样重要,它是必须的,而不是一个可选的工具。

  2、UML的优缺点

  在现实世界,没有东西比公认的标准更加吸引公众的批评。令每一个人都满意确实很难。UML也不例外。尽管到目前为止它是使用最广的建模语言,但是从根本上来说它是一个臃肿的语言。毫无疑问,1.0需要改进,2.0有了提高。但是一些人还是认为2.0还是很臃肿和复杂,还是很难学习。

  3、在实践中使用UML

  该要的说,使用UML你需要一个方法来收集和分析需求,然后用建模工具转换为模型。通常,建模工具有自己的方法,你只需要找到最适合自己的工具就可以了。类似的工具有很多,包括:微软的Viso,IBM的Rational Rose,Sparx Systems的EA。

  4、UML中的图形

  UML2.0包括13中不同的图形,分为两组:行为和结构。结构图定义类,属性,操作和关系。行为图显示系统中对象的协作关系。

  

目的
活动图Activity 行为 显示一个活动中的操作流程
类图Class 结构 显示类、接口、及他们的关系
Communication 行为 显示对象之间的交互
Component 结构 显示组件和他们之间的依赖关系
Composite Structure 结构 显示类的内部结构
Deployment 结构 显示组件如何映射到硬件资源
Interaction Overview 行为 显示顺序和活动
Object 结构 显示系统在特定时间的状态
Package 结构 显示类如何分布在逻辑的相关组中
序列Sequence 行为 显示对象之间的交互
State machine 行为 显示在事件发生之后,对象的状态如何变化
Timing 行为 显示在特定时期中,对象的行为

Use Case

行为 显示参与者在系统中进行放入操作

 

UML图之间的等级关系

 

     

   4.1用例图Use Case

  用例图提供了一个图形化的用例描述。一个用例图代表一个或者多个参与者和系统之间的相互作用。用例图显示了参与者要做的事情。一个参与者可以是一个人,也可以是和系统进行交互的任何外部系统。参与者不受系统控制,参与者是在系统之外定义的。

  用例图主要包括:系统,参与者,用例,关系。

  

  上图就是一个用例图,有两个参与者和两个用例。两个参与者分别得用户和数据库,两个用例分别是获取订单,获取商品的详细信息。

  4.2类图

  类图在UML使用较为广泛。类图代表系统的静态结构。系统的静态结构由类和他们之间的关系组成。

  类图包括属性,操作,和关系。关系则包括我们常说的1:1,1:n,0:1,0:n,n:n等

  

 

  上图是一张类图,有三个类:Customer用户,Order订单,OrderDetail订单明细。

  Customer上面有三个属性:CustomerID,CustomerName,Address。CustomerID是public,前面的符号是+;CustomerName是protected,前面的符号是#;Address是private,前面的符号是-。

  连接类之间的线代表他们之间的关系,也就是我们常说的1:1,1:n,0:1,0:n,n:n,0:n其中之一,关系还区分从哪个类的角度来看。图中的Customer和Order的关系,从Customer角度来看,一个Customer可以没有Order,也可以由多个Order,所以他们之间就是0:n的关系;从Order角度看,一个Order肯定属于一个Customer,所以他们之间就是1:1的关系。

  一个Order肯定有一个以上的Detail,一个Detai肯定属于一个Order。

  上面的类图是在PowerDesigner中画的,下面是自动生成的c#代码,当然了,肯定是需要调整的。

 

代码
// File:    Customer.cs
// Author:  zy
// Created: 2010年8月6日 6:40:04
// Purpose: Definition of Class Customer

using System;

public class Customer
{
   
private string address;
   
   
protected string customerName;
   
   
public Customer GetCustomerByID()
   {
      
throw new NotImplementedException();
   }
   
   
public int GetCustomerOrders()
   {
      
throw new NotImplementedException();
   }
   
   
public int customerID;
   
   
public System.Collections.Generic.List<Order> order;
   
   
/// <summary>
   
/// Property for collection of Order
   
/// </summary>
   
/// <pdGenerated>Default opposite class collection property</pdGenerated>
   public System.Collections.Generic.List<Order> Order
   {
      
get
      {
         
if (order == null)
            order 
= new System.Collections.Generic.List<Order>();
         
return order;
      }
      
set
      {
         RemoveAllOrder();
         
if (value != null)
         {
            
foreach (Order oOrder in value)
               AddOrder(oOrder);
         }
      }
   }
   
   
/// <summary>
   
/// Add a new Order in the collection
   
/// </summary>
   
/// <pdGenerated>Default Add</pdGenerated>
   public void AddOrder(Order newOrder)
   {
      
if (newOrder == null)
         
return;
      
if (this.order == null)
         
this.order = new System.Collections.Generic.List<Order>();
      
if (!this.order.Contains(newOrder))
         
this.order.Add(newOrder);
   }
   
   
/// <summary>
   
/// Remove an existing Order from the collection
   
/// </summary>
   
/// <pdGenerated>Default Remove</pdGenerated>
   public void RemoveOrder(Order oldOrder)
   {
      
if (oldOrder == null)
         
return;
      
if (this.order != null)
         
if (this.order.Contains(oldOrder))
            
this.order.Remove(oldOrder);
   }
   
   
/// <summary>
   
/// Remove all instances of Order from the collection
   
/// </summary>
   
/// <pdGenerated>Default removeAll</pdGenerated>
   public void RemoveAllOrder()
   {
      
if (order != null)
         order.Clear();
   }

}

 

 

  

代码
// File:    Order.cs
// Author:  zy
// Created: 2010年8月6日 6:43:42
// Purpose: Definition of Class Order

using System;

public class Order
{
   
private string orderSeqNo;
   
private decimal orderAmount;
   
private int customerID;
   
   
public System.Collections.Generic.List<OrderDetail> orderDetail;
   
   
/// <summary>
   
/// Property for collection of OrderDetail
   
/// </summary>
   
/// <pdGenerated>Default opposite class collection property</pdGenerated>
   public System.Collections.Generic.List<OrderDetail> OrderDetail
   {
      
get
      {
         
if (orderDetail == null)
            orderDetail 
= new System.Collections.Generic.List<OrderDetail>();
         
return orderDetail;
      }
      
set
      {
         RemoveAllOrderDetail();
         
if (value != null)
         {
            
foreach (OrderDetail oOrderDetail in value)
               AddOrderDetail(oOrderDetail);
         }
      }
   }
   
   
/// <summary>
   
/// Add a new OrderDetail in the collection
   
/// </summary>
   
/// <pdGenerated>Default Add</pdGenerated>
   public void AddOrderDetail(OrderDetail newOrderDetail)
   {
      
if (newOrderDetail == null)
         
return;
      
if (this.orderDetail == null)
         
this.orderDetail = new System.Collections.Generic.List<OrderDetail>();
      
if (!this.orderDetail.Contains(newOrderDetail))
         
this.orderDetail.Add(newOrderDetail);
   }
   
   
/// <summary>
   
/// Remove an existing OrderDetail from the collection
   
/// </summary>
   
/// <pdGenerated>Default Remove</pdGenerated>
   public void RemoveOrderDetail(OrderDetail oldOrderDetail)
   {
      
if (oldOrderDetail == null)
         
return;
      
if (this.orderDetail != null)
         
if (this.orderDetail.Contains(oldOrderDetail))
            
this.orderDetail.Remove(oldOrderDetail);
   }
   
   
/// <summary>
   
/// Remove all instances of OrderDetail from the collection
   
/// </summary>
   
/// <pdGenerated>Default removeAll</pdGenerated>
   public void RemoveAllOrderDetail()
   {
      
if (orderDetail != null)
         orderDetail.Clear();
   }

}

 

结论

 

 

      UML是一种标准的对象建模语言。它独立于任何编程语言。这是一个关键的特性,既是一个优点,也是一个缺点。说它是一个优点,是因为它使得在使用UML进行建模以及表达业务流程的时候,变成一个非常强大的工具。同时可以用它产生一个通用的模型。缺点就是因为优点产生的,独立性越强,也就越是远离了系统运行的代码。