原来在上一家公司,整整一年都在做工具,提高生产性,那个项目特别巨大,所以总共为老东家节约了500K左右的美金。

(除了表扬之外,我个人什么好处都没有,领导们都升官发财了,郁闷)

到了新公司,也准备开发一些提高生产性的工具。最近在看NET MVC和Spring MVC的资料。所以想开发一个Model代码生成工具。

公司不能上Git,代码也刚开始写,所以暂时不拿出来了。逻辑很简单,博客园高手如云,看一下就知道我怎么写的了。

功能现在还很简单,以后完善。

软件的界面大概是这个样子的,验证这块只是开了个头罢了。

由于公司未来不知道做NET还是JAVA(或许都做),所以,这里NET和JAVA都对应了.

自动生成的代码也很简单,以后会扩展的。

C#的

  1. using System;
  2. using System.ComponentModel;
  3. using System.ComponentModel.DataAnnotations;
  4.  
  5. namespace model.Models
  6. {
  7. public class AccountModel
  8. {
  9. #region "model"
  10.  
  11. [DisplayName("用户名")]
  12. [Required(ErrorMessage = "项目名称不能缺少")]
  13. public string username { get; set; }
  14.  
  15. [DisplayName("密码")]
  16. [Required(ErrorMessage = "项目名称不能缺少")]
  17. public string password { get; set; }
  18.  
  19. #endregion
  20. }
  21. }

JAVA的

  1. package model;
  2.  
  3. public class AccountModel {
  4.  
  5. //用户名
  6. private String username ;
  7. public void setusername(String username){
  8. this.username = username;
  9. }
  10. public String getusername(){
  11. return this.username;
  12. }
  13.  
  14. //密码
  15. private String password ;
  16. public void setpassword(String password){
  17. this.password = password;
  18. }
  19. public String getpassword(){
  20. return this.password;
  21. }
  22.  
  23. }

注意点:

关于MetaData,Java和C#有一些区别,例如 C# 字符 string ,Java 字符 String

这里有懂Java的人吗,Java有自动属性吗,set,get一大堆,看着不爽阿。好像Spring框架一定要这么写。。。

代码生成也很简单,就是字符串的操作,StringBuilder里面不停的AppendLine

  1. using System;
  2. using System.IO;
  3. using System.Text;
  4.  
  5. namespace DevKit.MVCTool
  6. {
  7. public static partial class ModelCodeGenerator
  8. {
  9. /// <summary>
  10. /// 缩进
  11. /// </summary>
  12. private static int indent;
  13. private static string UsingSystem = "using System;";
  14. private static bool NeedComponentModel = false;
  15. private static string UsingComponentModel = "using System.ComponentModel;";
  16. private static bool NeedDataAnnotations = false;
  17. private static string UsingDataAnnotations = "using System.ComponentModel.DataAnnotations;";
  18.  
  19. /// <summary>
  20. /// 生成ModelCode
  21. /// </summary>
  22. /// <param name="filename"></param>
  23. /// <param name="model"></param>
  24. internal static void GenerateCSharp(string filename, ModelInfo model)
  25. {
  26. StreamWriter codeWriter = new StreamWriter(filename, false);
  27. StringBuilder code = new StringBuilder();
  28. //缩进用空格
  29. char space = " ".ToCharArray()[];
  30. indent = ;
  31. code.AppendLine(String.Empty);
  32. code.AppendLine("namespace " + model.ProjectName + ".Models");
  33. code.AppendLine("{");
  34. indent += ;
  35. code.AppendLine(new string(space, indent) + "public class " + model.ModelName);
  36. code.AppendLine(new string(space, indent) + "{");
  37. indent += ;
  38. code.AppendLine(new string(space, indent) + "#region \"model\"");
  39. code.AppendLine(String.Empty);
  40. indent += ;
  41. foreach (var item in model.Items)
  42. {
  43. if (!string.IsNullOrEmpty(item.DisplayName))
  44. {
  45. //DisplayNameAsComment
  46. if (item.DisplayNameAsComment)
  47. {
  48. code.AppendLine(new string(space, indent) + "/// <summary>");
  49. code.AppendLine(new string(space, indent) + "/// " + item.DisplayName);
  50. code.AppendLine(new string(space, indent) + "/// </summary>");
  51. }
  52. //DisplayName
  53. code.AppendLine(new string(space, indent) + "[DisplayName(\"" + item.DisplayName + "\")]");
  54. NeedComponentModel = true;
  55. }
  56. if (item.Required)
  57. {
  58. //Required Without Error Message
  59. if (!String.IsNullOrEmpty(item.ErrorMsgForRequired))
  60. {
  61. code.AppendLine(new string(space, indent) + "[Required(ErrorMessage = \"" + item.ErrorMsgForRequired + "\")]");
  62. }
  63. else
  64. {
  65. code.AppendLine(new string(space, indent) + "[Required]");
  66. }
  67. NeedDataAnnotations = true;
  68. }
  69. code.AppendLine(new string(space, indent) + "public @type @name { get; set; }"
  70. .Replace("@type", Common.DotNet.MetaData[item.DataType])
  71. .Replace("@name", item.Name)
  72. );
  73. code.AppendLine(String.Empty);
  74. }
  75. indent -= ;
  76. code.AppendLine(new string(space, indent) + "#endregion");
  77. indent -= ;
  78. code.AppendLine(new string(space, indent) + "}");
  79. indent -= ;
  80. code.AppendLine("}");
  81.  
  82. codeWriter.WriteLine(UsingSystem);
  83. if (NeedComponentModel) codeWriter.WriteLine(UsingComponentModel);
  84. if (NeedDataAnnotations) codeWriter.WriteLine(UsingDataAnnotations);
  85.  
  86. codeWriter.Write(code);
  87. codeWriter.Close();
  88. }
  89. }
  90. }

这种工具,小项目里面其实真心没有什么作用,大项目,需要很严格的编码规范,然后项目非常多的,价值就体现出来了。

所有代码编码规则可以统一了,做设计的人,直接用工具作设计即可,然后支持从Excel导入导出,又是一个提高生产性的措施。

设计人员完成这样的表格,然后,工具直接读取Excel文件,生成代码,这个是我的目标.

关注点分离,让设计模型规则的人,做设计,开发者关注BL的开发.

欢迎大家提需求。。。

更新:

我还希望能做这样一个路由配置功能,这些功能,其实更对的想给设计人员使用,或者能够将大家的时间从记忆代码写法中解放出来.

我喜欢可视化的东西,目标是做一个设计书到代码的自动工具.当然,我承认,不可能做到完全不靠手工编码,但是希望这个比例能够减少很多.

人,应该去做更加需要思考的工作.

关注点分离,让设计路由的人,统筹管理路由规则.

提高生产性工具 - Model代码生成器(NET / JAVA) (一)的更多相关文章

  1. 提高生产性工具 - Model代码生成器(二)

    首先,我想阐述一下我开发这个工具的一个观点. 如果大家做过对日软件的话,很多时候,日方是进行设计的,数据模型是什么样子的,各个字段的类型,需要做什么验证,验证规则,错误信息,都是日方制定的. 外包就是 ...

  2. 提高生产性工具(五) - 数据的过滤器和图形化(适用于 MVC5 + MongoDB)

    在下面流水账似的文章之前,先将一些感悟说一下. 1.如果一个系统对于某个功能在至少三个地方使用的话,必须将其抽象提炼出来,而且时间点最好是大规模测试之前. 2.提炼出来的功能,如果品质做得好,整个系统 ...

  3. 提高生产性工具(四) - XML数据库的尝试

    首先祝大家新年快乐.身体健康,平安就是福气. 对于一般的个人迷你项目,数据量不大的时候,完全没有必要使用数据库,管理数据使用XML就可以了. 自己尝试写了一个XML数据库,插入1w条小记录,大概3M大 ...

  4. Redis操作Set工具类封装,Java Redis Set命令封装

    Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...

  5. Redis操作List工具类封装,Java Redis List命令封装

    Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...

  6. 分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解

    [博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]http ...

  7. Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文

    Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文 ...

  8. 五、jdk工具之jmap(java memory map)、 mat之四--结合mat对内存泄露的分析、jhat之二--结合jmap生成的dump结果在浏览器上展示

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  9. 蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)

    蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法) 首先这不是一个多难的题,但是网上的我没怎么找到有Java的代码,基本全都是c语言的,小编是个小白,如果有不对的地方请联系小编 问题描述 ...

随机推荐

  1. C++虚函数表

    大家知道虚函数是通过一张虚函数表来实现的.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,其内容真是反应实际的函数.这样,在有虚函数的类的实例中,这个表分配在了这个实例的内存中 ...

  2. MyBatis入门学习(一)

    一.MyBatis入门简要介绍(百科) MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyB ...

  3. 大叔也说Xamarin~Android篇~环境部署与破解

    回到目录 现在移动开发很HOT,以至于很多人都转向了它,大叔也不例外,这次有机制接触一下xamarin这个东西,其实之前也用于xamarin,只是用来写网页程序,没有接触到移动开发,对于xamarin ...

  4. Atitit 函数式编程与命令式编程的区别attilax总结  qbf

    Atitit 函数式编程与命令式编程的区别attilax总结  qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...

  5. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  6. Java连接MongoDB进行增删改查

    1.导入必须的包: 详情看项目:http://pan.baidu.com/s/1cvDAOY 2.通过Myeclipse创建WEB项目 3. 3.bean:创建实体类 package com.bean ...

  7. javascript技术大全

    这更像是一篇为自己而写的文章,没有过多的解释,sorray. 关于:return function fn(num){ var a = num; if(a>1){ a = num + 1; ret ...

  8. Unity 碰撞检测中碰撞器与触发器的区别

    要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动.碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对 ...

  9. 移动web开发之移动端真机测试

    × 目录 [1]特性 [2]安装 [3]设置[4]移动端 前面的话 chrome的开发者工具可以很好地做好模拟工作,但毕竟模拟和实际还是有差别的.所以,真机测试是一定要做的,如何高效地进行真机测试呢. ...

  10. 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案

      作者:陈希章 时间:2014-7-3 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模 ...