zoukankan      html  css  js  c++  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()[0];
                indent = 0;
                code.AppendLine(String.Empty);
                code.AppendLine("namespace " + model.ProjectName + ".Models");
                code.AppendLine("{");
                indent += 4;
                code.AppendLine(new string(space, indent) + "public class " + model.ModelName);
                code.AppendLine(new string(space, indent) + "{");
                indent += 4;
                code.AppendLine(new string(space, indent) + "#region "model"");
                code.AppendLine(String.Empty);
                indent += 4;
                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 -= 4;
                code.AppendLine(new string(space, indent) + "#endregion");
                indent -= 4;
                code.AppendLine(new string(space, indent) + "}");
                indent -= 4;
                code.AppendLine("}");
    
                codeWriter.WriteLine(UsingSystem);
                if (NeedComponentModel) codeWriter.WriteLine(UsingComponentModel);
                if (NeedDataAnnotations) codeWriter.WriteLine(UsingDataAnnotations);
    
                codeWriter.Write(code);
                codeWriter.Close();
            }
        }
    }

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

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

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

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

    欢迎大家提需求。。。

    更新:

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

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

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

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

  • 相关阅读:
    学生信息录入(学号 姓名 成绩),并按学号查找。
    char、signed char、unsigned char的区别
    C语言-数组
    如何选取网站主要内容(转)
    git pull和git fetch的区别(转)
    yolov3训练
    Docker容器图形界面显示(运行GUI软件)的配置方法
    切换Ubuntu默认python版本的两种方法
    多用户远程linux+内网穿透工具frp使用详解
    pycharm远程调试docker containers
  • 原文地址:https://www.cnblogs.com/TextEditor/p/4159343.html
Copyright © 2011-2022 走看看