让工作更轻松——EA类图与代码同步

    进入主题之前,先说一下ea工具:EA——Enterprise Architect,是一种建模工具,想了解请点解 这里 

    随着能力的提升,现在做的项目,都要求先画类图,再敲代码,但是每次画图后,在敲代码起初,还跟图对应着呢,到后来,发现图中有不合适的地方,然后就把图改一下,再敲代码,但是图中错误太多的话,就懒得再去改图了,直接修改代码了。这样时间一长,图就算废弃了。开发完了,态度好一点的人,会用代码去生成一下图去交差,有的干脆不管了,结果给同一项目组其他同事的工作造成了很大的影响。当然我说的这种情况在小公司中存在的比较多。当然我们在自学的时候,也会遇到这种情况。

    如何解决这一问题呢?
    从根本上说,当然是分析到位,画图时考虑周全,程序员要严格的按图跟文档去编码。不能私自更改代码。如需更改,需要将建议提交到项目经理那去审核,由项目经理去修改。当然好多公司或者个人不会按照这些步骤走。毕竟改过来改过去,会浪费很多时间。所以让图和代码同步,即可解决这一问题。

    先说思路吧:我这里用到的是EA和VS2010,用EA画类图,然后生成代码框架。在VS项目中添加生成的代码,然后在VS中修改代码,可以在EA中通过逆向代码工程更新原来的类图。

    简单的演示一下:
    首先创建一个项目,我这里创建的是控制台应用程序:

然后在EA中画一个类图

在右键,选择生成代码:(因为我这个是单个类,所以直接在类上选择生成代码,如果你类图中类比较多,可以在上面那个类似文件夹的图标上,选择生成代码)

选择项目文件夹下,并选对相对应语言。我这里用的是C#。点击生成即可。如图:

这样在项目文件夹下,就看见多了一个Human.cs文件

现在这个图跟代码就已经建立的关系,因为EA中集成了代码编辑器,所以我们可以通过在类上右键,选择查看源代码:

就可以打开源代码了:

然后在vs项目中,添加上刚生成的cs,

这样,在vs项目中,就多了一个Human类:

打开看一下,由图直接生成的代码:

///////////////////////////////////////////////////////////
//  Human.cs
//  Implementation of the Class Human
//  Generated by Enterprise Architect
//  Created on:      23-八月-2012 17:18:28
//  Original author: Admin
///////////////////////////////////////////////////////////

namespace Human {
	/// <summary>
	/// <b>学生类</b>
	/// <b>包括3个字段:name,age,sex</b>
	/// <b>添加对应的3个属性Name,Age,Sex</b>
	/// <b>2个方法:</b>
	/// <b>构造方法和Print方法</b>
	/// </summary>
	public class Human {

		/// <summary>
		/// 年龄
		/// </summary>
		private int age;
		/// <summary>
		/// 姓名
		/// </summary>
		private string name;
		/// <summary>
		/// 性别
		/// </summary>
		private string sex;

		public Human(){

		}

		~Human(){

		}

		public virtual void Dispose(){

		}

		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name">姓名</param>
		/// <param name="age">年龄</param>
		/// <param name="sex">性别</param>
		public Human(string name, int age, string sex){

		}

		/// <summary>
		/// 年龄
		/// </summary>
		public int Age{
			get{
				return age;
			}
			set{
				age = value;
			}
		}

		/// <summary>
		/// 姓名
		/// </summary>
		public string Name{
			get{
				return name;
			}
			set{
				name = value;
			}
		}

		/// <summary>
		/// 输出学生信息
		/// </summary>
		public void Print(){

		}

		/// <summary>
		/// 性别
		/// </summary>
		public string Sex{
			get{
				return sex;
			}
			set{
				sex = value;
			}
		}

	}//end Human

}//end namespace Human

现在代码和图算是彻底可以同步了。当我们在VS中修改代码后,在EA中,选中相应的类,右键选择|“代码同步”,即可把代码中修改的部分,同步到类图中。
比如我们在代码中添加一个address字段和属性,并在构建函数和Print方法中添加内容:
address字段和属性:

        /// <summary>
        /// 住址
        /// </summary>
        private string address;
        /// <summary>
        /// 住址
        /// </summary>
        public string Address
        {
            get
            {
                return address;
            }
            set
            {
                name = value;
            }
        }

构建函数和Print方法:

		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name">姓名</param>
		/// <param name="age">年龄</param>
		/// <param name="sex">性别</param>
		public Human(string name, int age, string sex){
            this.name = name;
            this.age = age;
            this.sex = sex;
		}

        /// <summary>
        /// 输出学生信息
        /// </summary>
        public void Print()
        {
            System.Console.WriteLine("我叫 " + name + "," + sex + ",年方" + age);
        }

然后在EA中,右键Human,选择“代码同步”,点击“是”:

  

  
再看看类的效果:

 

已经成功的更新上去了。
当我们在修改类图后,选择修改后的类,再次生成代码,即可更新原来的代码。
现在我们在Human类中添加一个telphone及对应属性:

右键生成代码后的源码:

///////////////////////////////////////////////////////////
//  Human.cs
//  Implementation of the Class Human
//  Generated by Enterprise Architect
//  Created on:      23-八月-2012 17:23:58
//  Original author: Admin
///////////////////////////////////////////////////////////

namespace Human {
	/// <summary>
	/// <b>学生类</b>
	/// <b>包括5个字段:name,age,sex,address,telphone</b>
	/// <b>添加对应的3个属性Name,Age,Sex,Address,Telphone</b>
	/// <b>2个方法:</b>
	/// <b>构造方法和Print方法</b>
	/// </summary>
	public class Human {

		/// <summary>
		/// 年龄
		/// </summary>
		private int age;

		/// <summary>
		/// 姓名
		/// </summary>
		private string name;

		/// <summary>
		/// 性别
		/// </summary>
		private string sex;

        /// <summary>
        /// 住址
        /// </summary>
        private string address;
		/// <summary>
		/// 电话
		/// </summary>
		private int telphone;

        /// <summary>
        /// 住址
        /// </summary>
        public string Address
        {
            get
            {
                return address;
            }
            set
            {
                name = value;
            }
        }

		public Human(){

		}

		~Human(){

		}

		public virtual void Dispose(){

		}

		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="name">姓名</param>
		/// <param name="age">年龄</param>
		/// <param name="sex">性别</param>
		public Human(string name, int age, string sex){
            this.name = name;
            this.age = age;
            this.sex = sex;
		}

		/// <summary>
		/// 年龄
		/// </summary>
		public int Age{
			get{
				return age;
			}
			set{
				age = value;
			}
		}

		/// <summary>
		/// 姓名
		/// </summary>
		public string Name{
			get{
				return name;
			}
			set{
				name = value;
			}
		}

		/// <summary>
		/// 输出学生信息
		/// </summary>
		public void Print(){
            System.Console.WriteLine("我叫 "+name+","+sex+",年方"+age);
		}

		/// <summary>
		/// 性别
		/// </summary>
		public string Sex{
			get{
				return sex;
			}
			set{
				sex = value;
			}
		}

		/// <summary>
		/// 电话
		/// </summary>
		public int Telphone{
			get{
				return telphone;
			}
			set{
				telphone = value;
			}
		}

	}//end Human

}//end namespace Human

我们发现当初修改的构造函数和Print方法中的源码部分,并没有被删除。这说明,图只对代码进行了更新,而不是覆盖操作。

演示就到这里。

    通过刚才的演示,我们可以清楚的看到图和代码的同步,不再是那么遥不可及。我们不用再为了改代码而改图了。可以节省大量的时间。

   =======================================================================================

   我在演示的时候是一个文件,但是在实际项目中,肯定是用等多个文件。有博友问我怎么办,我就再补充一下吧。

   拿我的一个小项目做实验:包图,类图如下:

  

   生成代码时,如果你第一次生成源代码,那么可以在整个类视图上右键,“代码工程”->“生成源代码”。这样会为所有的图生成。如果你在修改某个包中的类后,用图去更新代码时,你可以右键这个包,选择“代码工程”->“生成源代码”,效果是一样的。下面这幅图是在类视图上面生成代码的截图。

 

   在对话框中的标题中,可以看出“根据包生成源码”。这里面也会带有命名空间。在同步冲突中,选择“同步模型和代码”。然后勾选自动生成文件,并选择你的项目路径(同单个文件操作)。如果你的包图中还有子包,那么你需要勾选“包括所有子包的表”。生成即可。

 

这就是生成的效果了:

 

   而用代码更新类图时,如果你想同步全部类图,那么在类视图上右键,“代码工程”->“导入源文件目录”。如果你只想更新一个包,那么在包上面右键,操作都是一样的。我这里选择的是IDAL包(现在附加的这个项目使用VB.NET做的)。

 

   在“导入源码”对话框中,选择代码所在的根目录(这个在更新某个包的时候一定要看清楚了,否则就会把其他包的类导入到这个包中)。文件类型选正确了。包结构选择“为每个目录生成包”,否则可能会出现你不想看到的效果。同步类型选择“同步已存在的类”。如果你选择的覆盖,那么其他类与被更新的类之间的联系都会被删除,而且在时序图中被更新的类的对象,也会变为空白。所以一定要选择同步。删除,根据实际情况而定吧。如果代码中删除了某些类,那么在更新类图
时,会根据你的选择,做出对应的操作。

 

   好了,对于项目中多个文件的操作,就说这么多。纸上得来终觉浅,绝知此事要躬行,所以还是需要大家实际实验一下才知道。

=======================================================================================

    当然,这个方案,只是一个代码和图脱节的补救措施。最重要的还是在前期尽可能的设计好,在编码时严格按照图和文档进行编码,才不会出现那代码与图的脱节现象。

    回首一望,才发现,其实我们总是在有意无意的遵循着“简单原理”,也正是由于“简单原理”,我们的效率才会不断的提高,我们才会不断的进步。
    

转载请说明出处http://blog.csdn.net/xiaoxian8023/article/details/7901206

时间: 2025-01-21 00:26:42

让工作更轻松——EA类图与代码同步的相关文章

Win7 Clear功能让眼睛工作更轻松

随着生活水平的提高,现在我们家中一般不止有一台显示设备可以连接到计算机,生活中我们也时常将电脑连接到不同的显示设备上,比如现在流行的把液晶电视与主机相连在客厅畅享大片以及阅读小说,但由于显示设备的不同,并不是所有显示设备都采用标准分辨率,这就导致了实际显示效果千差万别,尤其是对于文字,虚化的边缘简直是不可忍受的.而Windows7中的Clear技术就可以很好的解决这一问题,从此看电子书更加舒心啦. 首先我们在Win7桌面空白处单击鼠标右键,此时弹出右键菜单,在弹出的菜单中选择"个性化"

不做IT民工 网站优化善于结合工具更轻松

每当听到别人问起网站优化是做什么的?轻不轻松?有没有前途之类的问题时,笔者也不知道怎么去回答,如果从站长的角度去答的话,网站优化就是IT民工,IT民工肯定不会轻松的,前途也是有的,但是更多的则是给互联网制造垃圾,推广广告满天飞.很多人看到网站优化不就是发发外链.更新内容就能赚钱了.其实这只是外行人的看法而已,在站长界里,网站优化其实跟IT民工一样,每天早起晚睡的就为了发外链,有的甚至是每天对着电脑工作个十几小时的站长大有人在.是不是天天呆在电脑前时间越长,网站优化才会有效果,排名才会好呢?笔者告

Rational Rose正逆向工程(类图转Java代码,Java代码转类图)

 一,正向工程     1.设置默认语言为Java,Tools->Options->Notation->default:选择Java.         2.设置环境变量ClassPath,Tools->Java/j2ee->Project   Specification->ClassPath:具体路径设置为正向工程生成java文件要保存的目录,一般为项目的src目录.         3.打开设计好的类图,选中要生成的Java文件的类,然后通过Tools->J

使用CSS3中新的伪类更轻松地定位页面元素

在 Web http://www.aliyun.com/zixun/aggregation/17799.html">开发过程中,开发人员经常会通过使用 CSS 来实现页面所需的样式效果.例如:利用服务器端代码或 JavaScript 脚本生成条纹样式的表格,或为了要为多个页面元素中的一部分添加样式,不得不使用大量带有额外 class 属性的标签. 这些情况在 CSS3 出现后变得非常简单!CSS3 定义了一系列非常神奇的页面元素选择器,通过它们,这个过程将变得简单而迅速.元素选择器是一种模

UML类图中几种关系的总结,EA图中会用到

九种关系总结,EA图中会用到: 关联关系(Association):双向关联,单向关联,自关联.多重性关联Multiplicity. 聚合(Aggregation):整体与部分的关系,整体对象销毁时成员对象不销毁,一般是构造函数或Set方法传入成员对象. 组合(Composition):整体与部分的关系,整体对象销毁时成员对象一并销毁,一般在构造函数中创建成员对象. 依赖关系(Dependency):Driver类依赖Car类的move方法,Driver--->Car 泛化关系(Generali

看懂UML类图和时序图(转)

这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码对应起来: 有了这些知识,看后面章节的设计模式结构图就没有什么问题了: 本章所有图形使用Enterprise Architect 9.2来画,所有示例详见根目录下的design_patterns.EAP 从一个示例开始 请看以下这个类图,类之间的关系是我们需要关注的: _images/uml_cla

如何将应用程序更轻松地迁移到WebSphere Application Server

Donald Vines & Andy Hoyt: Application Migration 工具如何将应用程序更轻松地迁移到 WebSphere Application Server 使应用程序分析和迁移更轻松 IBM WebSphere Application Server Migration Toolkit 的 Application Migration 工具能帮助您轻松地将应用程序从一个源应用服务器迁移到 WebSphere Application Server V7.0 上.源应用服

妙用Win7按时自动执行任务让你更轻松

如果你在xp系统的时候就会使用系统的任务计划功能,那么你到了win7系统你就会感觉到,win7系统对应的功能强大了很多,也人性化了很多. 1 win7任务计划功能比xp系统强大的地方 win7系统对任务计划程序界面功能更为完善,设有任务摘要.任务状态.操作功能菜单等,并可以执行连接另一台计算机.创建任务.导入任务等功能. 2 使用方法很简单,有每天定时开启功能如图: 3 要启动的程序也没什么现在,可以是脚本.软件之类的. 4 其他相关的功能非常多,也非常齐全,在这边就不解释了,基本上自己用下都能

[UML]UML系列——类图class的关联关系(聚合、组合)

关联的概念       关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用. 程序演示:关联关系(code/assocation)       假设:一个公司只有三名员工:一个员工要么没有工作,要么只能在一个公司工作.(代码简化了,主要说明关联关系)       Person类: 1 class person 2 { 3 public string name; 4 public person(string eName) 5 { 6