分享

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

 richsky 2012-08-27

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


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


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


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


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




然后在EA中画一个类图



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

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

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

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

就可以打开源代码了:



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



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



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


  1. ///////////////////////////////////////////////////////////  
  2. //  Human.cs  
  3. //  Implementation of the Class Human  
  4. //  Generated by Enterprise Architect  
  5. //  Created on:      23-八月-2012 17:18:28  
  6. //  Original author: Admin  
  7. ///////////////////////////////////////////////////////////  
  8.   
  9.   
  10.   
  11.   
  12. namespace Human {  
  13.     /// <summary>  
  14.     /// <b>学生类</b>  
  15.     /// <b>包括3个字段:name,age,sex</b>  
  16.     /// <b>添加对应的3个属性Name,Age,Sex</b>  
  17.     /// <b>2个方法:</b>  
  18.     /// <b>构造方法和Print方法</b>  
  19.     /// </summary>  
  20.     public class Human {  
  21.   
  22.         /// <summary>  
  23.         /// 年龄  
  24.         /// </summary>  
  25.         private int age;  
  26.         /// <summary>  
  27.         /// 姓名  
  28.         /// </summary>  
  29.         private string name;  
  30.         /// <summary>  
  31.         /// 性别  
  32.         /// </summary>  
  33.         private string sex;  
  34.   
  35.         public Human(){  
  36.   
  37.         }  
  38.   
  39.         ~Human(){  
  40.   
  41.         }  
  42.   
  43.         public virtual void Dispose(){  
  44.   
  45.         }  
  46.   
  47.         /// <summary>  
  48.         /// 构造函数  
  49.         /// </summary>  
  50.         /// <param name="name">姓名</param>  
  51.         /// <param name="age">年龄</param>  
  52.         /// <param name="sex">性别</param>  
  53.         public Human(string name, int age, string sex){  
  54.   
  55.         }  
  56.   
  57.         /// <summary>  
  58.         /// 年龄  
  59.         /// </summary>  
  60.         public int Age{  
  61.             get{  
  62.                 return age;  
  63.             }  
  64.             set{  
  65.                 age = value;  
  66.             }  
  67.         }  
  68.   
  69.         /// <summary>  
  70.         /// 姓名  
  71.         /// </summary>  
  72.         public string Name{  
  73.             get{  
  74.                 return name;  
  75.             }  
  76.             set{  
  77.                 name = value;  
  78.             }  
  79.         }  
  80.   
  81.         /// <summary>  
  82.         /// 输出学生信息  
  83.         /// </summary>  
  84.         public void Print(){  
  85.   
  86.         }  
  87.   
  88.         /// <summary>  
  89.         /// 性别  
  90.         /// </summary>  
  91.         public string Sex{  
  92.             get{  
  93.                 return sex;  
  94.             }  
  95.             set{  
  96.                 sex = value;  
  97.             }  
  98.         }  
  99.   
  100.     }//end Human  
  101.   
  102. }//end namespace Human  




现在代码和图算是彻底可以同步了。当我们在VS中修改代码后,在EA中,选中相应的类,右键选择|“代码同步”,即可把代码中修改的部分,同步到类图中。
比如我们在代码中添加一个address字段和属性,并在构建函数和Print方法中添加内容:
address字段和属性:
  1. /// <summary>  
  2. /// 住址  
  3. /// </summary>  
  4. private string address;  
  5. /// <summary>  
  6. /// 住址  
  7. /// </summary>  
  8. public string Address  
  9. {  
  10.     get  
  11.     {  
  12.         return address;  
  13.     }  
  14.     set  
  15.     {  
  16.         name = value;  
  17.     }  
  18. }  

构建函数和Print方法:
  1. /// <summary>  
  2. /// 构造函数  
  3. /// </summary>  
  4. /// <param name="name">姓名</param>  
  5. /// <param name="age">年龄</param>  
  6. /// <param name="sex">性别</param>  
  7. public Human(string name, int age, string sex){  
  8.           this.name = name;  
  9.           this.age = age;  
  10.           this.sex = sex;  
  11. }  
  12.   
  13.       /// <summary>  
  14.       /// 输出学生信息  
  15.       /// </summary>  
  16.       public void Print()  
  17.       {  
  18.           System.Console.WriteLine("我叫 " + name + "," + sex + ",年方" + age);  
  19.       }  




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

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


右键生成代码后的源码:

  1. ///////////////////////////////////////////////////////////  
  2. //  Human.cs  
  3. //  Implementation of the Class Human  
  4. //  Generated by Enterprise Architect  
  5. //  Created on:      23-八月-2012 17:23:58  
  6. //  Original author: Admin  
  7. ///////////////////////////////////////////////////////////  
  8.   
  9.   
  10.   
  11.   
  12. namespace Human {  
  13.     /// <summary>  
  14.     /// <b>学生类</b>  
  15.     /// <b>包括5个字段:name,age,sex,address,telphone</b>  
  16.     /// <b>添加对应的3个属性Name,Age,Sex,Address,Telphone</b>  
  17.     /// <b>2个方法:</b>  
  18.     /// <b>构造方法和Print方法</b>  
  19.     /// </summary>  
  20.     public class Human {  
  21.   
  22.         /// <summary>  
  23.         /// 年龄  
  24.         /// </summary>  
  25.         private int age;  
  26.   
  27.         /// <summary>  
  28.         /// 姓名  
  29.         /// </summary>  
  30.         private string name;  
  31.   
  32.         /// <summary>  
  33.         /// 性别  
  34.         /// </summary>  
  35.         private string sex;  
  36.   
  37.         /// <summary>  
  38.         /// 住址  
  39.         /// </summary>  
  40.         private string address;  
  41.         /// <summary>  
  42.         /// 电话  
  43.         /// </summary>  
  44.         private int telphone;  
  45.   
  46.         /// <summary>  
  47.         /// 住址  
  48.         /// </summary>  
  49.         public string Address  
  50.         {  
  51.             get  
  52.             {  
  53.                 return address;  
  54.             }  
  55.             set  
  56.             {  
  57.                 name = value;  
  58.             }  
  59.         }  
  60.   
  61.         public Human(){  
  62.   
  63.         }  
  64.   
  65.         ~Human(){  
  66.   
  67.         }  
  68.   
  69.         public virtual void Dispose(){  
  70.   
  71.         }  
  72.   
  73.         /// <summary>  
  74.         /// 构造函数  
  75.         /// </summary>  
  76.         /// <param name="name">姓名</param>  
  77.         /// <param name="age">年龄</param>  
  78.         /// <param name="sex">性别</param>  
  79.         public Human(string name, int age, string sex){  
  80.             this.name = name;  
  81.             this.age = age;  
  82.             this.sex = sex;  
  83.         }  
  84.   
  85.         /// <summary>  
  86.         /// 年龄  
  87.         /// </summary>  
  88.         public int Age{  
  89.             get{  
  90.                 return age;  
  91.             }  
  92.             set{  
  93.                 age = value;  
  94.             }  
  95.         }  
  96.   
  97.         /// <summary>  
  98.         /// 姓名  
  99.         /// </summary>  
  100.         public string Name{  
  101.             get{  
  102.                 return name;  
  103.             }  
  104.             set{  
  105.                 name = value;  
  106.             }  
  107.         }  
  108.   
  109.         /// <summary>  
  110.         /// 输出学生信息  
  111.         /// </summary>  
  112.         public void Print(){  
  113.             System.Console.WriteLine("我叫 "+name+","+sex+",年方"+age);  
  114.         }  
  115.   
  116.         /// <summary>  
  117.         /// 性别  
  118.         /// </summary>  
  119.         public string Sex{  
  120.             get{  
  121.                 return sex;  
  122.             }  
  123.             set{  
  124.                 sex = value;  
  125.             }  
  126.         }  
  127.   
  128.         /// <summary>  
  129.         /// 电话  
  130.         /// </summary>  
  131.         public int Telphone{  
  132.             get{  
  133.                 return telphone;  
  134.             }  
  135.             set{  
  136.                 telphone = value;  
  137.             }  
  138.         }  
  139.   
  140.     }//end Human  
  141.   
  142. }//end namespace Human  




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


演示就到这里。


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


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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多