您的位置:首页 > 编程语言

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

2015-10-22 12:51 435 查看
进入主题之前,先说一下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做的)。

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



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

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

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

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

转自:/article/1414086.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: