zoukankan      html  css  js  c++  java
  • 生成代码的代码 之 错误代码类生成器

    有时候在写代码时,会有很多的重复内容出现。在C/C++这样的语言里,可以通过宏定义来简化这些代码。可是在Java这样没有宏定义的语言里,就会有点麻烦。我们可以通过代码生成器来处理,也就是用一段代码来生成这些代码。
    假定我们要写一个类,来封装所有的错误代码和错误消息。也就是要生成类似下面的一个类。其中以静态成员的形式封装所有的错误代码,而以一个Map来封装所有的错误消息。

    package com.abc.example;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class ErrorCode {
    
      public static int ERROR_CODE_1 = 1001;
    
      static Map<Integer, String> errormsg;
      
      static {
        errormsg = new HashMap<Integer, String>();
        errormsg.put(ERROR_CODE_1, "error message 1");
      }
      
      public static String getErrorMessage(int code) {
        return errormsg.get(code);
      }
    }
    

    但是,这里可能会有很多种错误代码,每种错误代码都对应有一个错误消息。所以写这个类会有很多的重复代码。所以我们通过一段代码来生成这个类的代码。而这个类其实整体结构是固定的,只是其中的变量名,错误代码和错误消息是会变化的。所以我们可以利用模板库来生成这段代码。
    这里笔者基于Node.js进行开发,因此选择了基于Node.js的模板库handlebar (https://github.com/wycats/handlebars.js/). 代码如下

    // createerrorcode.js
    var handlebars = require("handlebars");
    var fs = require("fs");
    var errorcodes = require("./errorcodes")
    
    var templatefile = "ErrorCodeTemplate.java";
    
    var source = fs.readFileSync(templatefile, "utf8");
    var template = handlebars.compile(source);
    var result = template(errorcodes);
    
    fs.writeFile(errorcodes.name + ".java", result, function(e){
      if (e) {
        console.log("error: " + e);
      }
    });
    
    
    // errorcodes.js
    var errorcodes = {
      "name": "ErrorCodes", 
      "codes": [
        {"name": "ERROR_NAME", "code": 0, "message": "ok"},
      ]
    };
    
    module.exports = errorcodes;
    

    模板如下

    //ErrorCodeTemplate.java
    package com.example;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class {{name}} {
    
      {{#codes}}
      public static int {{name}} = {{code}};
      {{/codes}}
    
      static Map<Integer, String> errormsg;
      
      static {
        errormsg = new HashMap<Integer, String>();
        {{#codes}}
        errormsg.put({{name}}, "{{message}}");
        {{/codes}}
      }
      
      public static String getErrorMessage(int code) {
        return errormsg.get(code);
      }
    }
    

    最终生成的类代码如下

    package com.example;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class ErrorCodes {
    
      public static int ERROR_NAME = 0;
    
      static Map<Integer, String> errormsg;
      
      static {
        errormsg = new HashMap<Integer, String>();
        errormsg.put(ERROR_NAME, "ok");
      }
      
      public static String getErrorMessage(int code) {
        return errormsg.get(code);
      }
    }
  • 相关阅读:
    SVG PATH d参数的 ace
    如果你想动态创建一个iframe
    canvas构建一个平面直角坐标系
    JavaScript版几种常见排序算法
    【分享】 Stip,让表单验证轻松愉快。
    【分享】javascript合并混淆压缩
    【分享】页面提示插件更新
    nodejs 的 session 简单实现
    页面模块之间的通信依赖解决方案
    在平面旋转一个点
  • 原文地址:https://www.cnblogs.com/l00l/p/4579396.html
Copyright © 2011-2022 走看看