提高生产性工具 - Model代码生成器(NET / JAVA) (一)
原来在上一家公司,整整一年都在做工具,提高生产性,那个项目特别巨大,所以总共为老东家节约了500K左右的美金。
(除了表扬之外,我个人什么好处都没有,领导们都升官发财了,郁闷)
到了新公司,也准备开发一些提高生产性的工具。最近在看NET MVC和Spring MVC的资料。所以想开发一个Model代码生成工具。
公司不能上Git,代码也刚开始写,所以暂时不拿出来了。逻辑很简单,博客园高手如云,看一下就知道我怎么写的了。
功能现在还很简单,以后完善。
软件的界面大概是这个样子的,验证这块只是开了个头罢了。
由于公司未来不知道做NET还是JAVA(或许都做),所以,这里NET和JAVA都对应了.
自动生成的代码也很简单,以后会扩展的。
C#的
- using System;
- using System.ComponentModel;
- using System.ComponentModel.DataAnnotations;
- namespace model.Models
- {
- public class AccountModel
- {
- #region "model"
- [DisplayName("用户名")]
- [Required(ErrorMessage = "项目名称不能缺少")]
- public string username { get; set; }
- [DisplayName("密码")]
- [Required(ErrorMessage = "项目名称不能缺少")]
- public string password { get; set; }
- #endregion
- }
- }
JAVA的
- package model;
- public class AccountModel {
- //用户名
- private String username ;
- public void setusername(String username){
- this.username = username;
- }
- public String getusername(){
- return this.username;
- }
- //密码
- private String password ;
- public void setpassword(String password){
- this.password = password;
- }
- public String getpassword(){
- return this.password;
- }
- }
注意点:
关于MetaData,Java和C#有一些区别,例如 C# 字符 string ,Java 字符 String
这里有懂Java的人吗,Java有自动属性吗,set,get一大堆,看着不爽阿。好像Spring框架一定要这么写。。。
代码生成也很简单,就是字符串的操作,StringBuilder里面不停的AppendLine
- using System;
- using System.IO;
- using System.Text;
- namespace DevKit.MVCTool
- {
- public static partial class ModelCodeGenerator
- {
- /// <summary>
- /// 缩进
- /// </summary>
- private static int indent;
- private static string UsingSystem = "using System;";
- private static bool NeedComponentModel = false;
- private static string UsingComponentModel = "using System.ComponentModel;";
- private static bool NeedDataAnnotations = false;
- private static string UsingDataAnnotations = "using System.ComponentModel.DataAnnotations;";
- /// <summary>
- /// 生成ModelCode
- /// </summary>
- /// <param name="filename"></param>
- /// <param name="model"></param>
- internal static void GenerateCSharp(string filename, ModelInfo model)
- {
- StreamWriter codeWriter = new StreamWriter(filename, false);
- StringBuilder code = new StringBuilder();
- //缩进用空格
- char space = " ".ToCharArray()[];
- indent = ;
- code.AppendLine(String.Empty);
- code.AppendLine("namespace " + model.ProjectName + ".Models");
- code.AppendLine("{");
- indent += ;
- code.AppendLine(new string(space, indent) + "public class " + model.ModelName);
- code.AppendLine(new string(space, indent) + "{");
- indent += ;
- code.AppendLine(new string(space, indent) + "#region \"model\"");
- code.AppendLine(String.Empty);
- indent += ;
- foreach (var item in model.Items)
- {
- if (!string.IsNullOrEmpty(item.DisplayName))
- {
- //DisplayNameAsComment
- if (item.DisplayNameAsComment)
- {
- code.AppendLine(new string(space, indent) + "/// <summary>");
- code.AppendLine(new string(space, indent) + "/// " + item.DisplayName);
- code.AppendLine(new string(space, indent) + "/// </summary>");
- }
- //DisplayName
- code.AppendLine(new string(space, indent) + "[DisplayName(\"" + item.DisplayName + "\")]");
- NeedComponentModel = true;
- }
- if (item.Required)
- {
- //Required Without Error Message
- if (!String.IsNullOrEmpty(item.ErrorMsgForRequired))
- {
- code.AppendLine(new string(space, indent) + "[Required(ErrorMessage = \"" + item.ErrorMsgForRequired + "\")]");
- }
- else
- {
- code.AppendLine(new string(space, indent) + "[Required]");
- }
- NeedDataAnnotations = true;
- }
- code.AppendLine(new string(space, indent) + "public @type @name { get; set; }"
- .Replace("@type", Common.DotNet.MetaData[item.DataType])
- .Replace("@name", item.Name)
- );
- code.AppendLine(String.Empty);
- }
- indent -= ;
- code.AppendLine(new string(space, indent) + "#endregion");
- indent -= ;
- code.AppendLine(new string(space, indent) + "}");
- indent -= ;
- code.AppendLine("}");
- codeWriter.WriteLine(UsingSystem);
- if (NeedComponentModel) codeWriter.WriteLine(UsingComponentModel);
- if (NeedDataAnnotations) codeWriter.WriteLine(UsingDataAnnotations);
- codeWriter.Write(code);
- codeWriter.Close();
- }
- }
- }
这种工具,小项目里面其实真心没有什么作用,大项目,需要很严格的编码规范,然后项目非常多的,价值就体现出来了。
所有代码编码规则可以统一了,做设计的人,直接用工具作设计即可,然后支持从Excel导入导出,又是一个提高生产性的措施。
设计人员完成这样的表格,然后,工具直接读取Excel文件,生成代码,这个是我的目标.
关注点分离,让设计模型规则的人,做设计,开发者关注BL的开发.
欢迎大家提需求。。。
更新:
我还希望能做这样一个路由配置功能,这些功能,其实更对的想给设计人员使用,或者能够将大家的时间从记忆代码写法中解放出来.
我喜欢可视化的东西,目标是做一个设计书到代码的自动工具.当然,我承认,不可能做到完全不靠手工编码,但是希望这个比例能够减少很多.
人,应该去做更加需要思考的工作.
关注点分离,让设计路由的人,统筹管理路由规则.
提高生产性工具 - Model代码生成器(NET / JAVA) (一)的更多相关文章
- 提高生产性工具 - Model代码生成器(二)
首先,我想阐述一下我开发这个工具的一个观点. 如果大家做过对日软件的话,很多时候,日方是进行设计的,数据模型是什么样子的,各个字段的类型,需要做什么验证,验证规则,错误信息,都是日方制定的. 外包就是 ...
- 提高生产性工具(五) - 数据的过滤器和图形化(适用于 MVC5 + MongoDB)
在下面流水账似的文章之前,先将一些感悟说一下. 1.如果一个系统对于某个功能在至少三个地方使用的话,必须将其抽象提炼出来,而且时间点最好是大规模测试之前. 2.提炼出来的功能,如果品质做得好,整个系统 ...
- 提高生产性工具(四) - XML数据库的尝试
首先祝大家新年快乐.身体健康,平安就是福气. 对于一般的个人迷你项目,数据量不大的时候,完全没有必要使用数据库,管理数据使用XML就可以了. 自己尝试写了一个XML数据库,插入1w条小记录,大概3M大 ...
- Redis操作Set工具类封装,Java Redis Set命令封装
Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...
- Redis操作List工具类封装,Java Redis List命令封装
Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...
- 分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解
[博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]http ...
- Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文
Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统,基于Google Dapper论文 ...
- 五、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 ...
- 蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)
蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法) 首先这不是一个多难的题,但是网上的我没怎么找到有Java的代码,基本全都是c语言的,小编是个小白,如果有不对的地方请联系小编 问题描述 ...
随机推荐
- C++虚函数表
大家知道虚函数是通过一张虚函数表来实现的.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,其内容真是反应实际的函数.这样,在有虚函数的类的实例中,这个表分配在了这个实例的内存中 ...
- MyBatis入门学习(一)
一.MyBatis入门简要介绍(百科) MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyB ...
- 大叔也说Xamarin~Android篇~环境部署与破解
回到目录 现在移动开发很HOT,以至于很多人都转向了它,大叔也不例外,这次有机制接触一下xamarin这个东西,其实之前也用于xamarin,只是用来写网页程序,没有接触到移动开发,对于xamarin ...
- Atitit 函数式编程与命令式编程的区别attilax总结 qbf
Atitit 函数式编程与命令式编程的区别attilax总结 qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...
- Atitit RSA非对称加密原理与解决方案
Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制 3 1.4. 基于rsa的授权验证机器码 4 1.5. ...
- Java连接MongoDB进行增删改查
1.导入必须的包: 详情看项目:http://pan.baidu.com/s/1cvDAOY 2.通过Myeclipse创建WEB项目 3. 3.bean:创建实体类 package com.bean ...
- javascript技术大全
这更像是一篇为自己而写的文章,没有过多的解释,sorray. 关于:return function fn(num){ var a = num; if(a>1){ a = num + 1; ret ...
- Unity 碰撞检测中碰撞器与触发器的区别
要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动.碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对 ...
- 移动web开发之移动端真机测试
× 目录 [1]特性 [2]安装 [3]设置[4]移动端 前面的话 chrome的开发者工具可以很好地做好模拟工作,但毕竟模拟和实际还是有差别的.所以,真机测试是一定要做的,如何高效地进行真机测试呢. ...
- 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
作者:陈希章 时间:2014-7-3 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模 ...