一次开发逻辑规范的总结

Java话题

在Java中构建消息内容

String template = "尊敬的%s民警,您在%s案件中所呈请的%s一书,已经被%s审批。请知悉。";
String message = String.format(template, "三元里", "天河商场盗窃案", "《呈请立案报告书》", "三元里所长");

 

拒绝硬编码

字典项的特殊处理

处理方法:创建枚举类,列出需要特殊处理的字典项。
比如对于:只有已立案、已破案、已结案才允许录入破结案信息,编写枚举类:
package cn.sinobest.jzpt.zdycj.dict;
public enum AJZT {
    /***
     * 已立案.<br>
     */
    YLA("02", "已立案"),
    /**
     * 已破案.<br>
     */
    YPA("03", "已破案"),
    /**
     * 已结案.<br>
     */
    YJA("04", "已结案");
    
    /**
     * 案件状态的kind.<br>
     */
    public static final String KIND = "56";
    
    private String code;
    
    private String detail;
    private AJZT(String code, String detail) {
        this.code = code;
        this.detail = detail;
    }
    public String getCode() {
        return code;
    }
    public String getDetail() {
        return detail;
    }
    
}
说明:
  1. 将字典的kind作为枚举类的静态常量是一个好习惯。
  2. 只需要列出需要特殊处理的字典项,实际上案件状态的字典项不止上面的三个。
问题:对于此类枚举应该制定一份位置的相关规范,以防重复定义。
 
实际业务代码中的使用:
 1 String ajstate = ajjqService.getAjstateByAjId(aj_sysid);
 2 boolean validState = AJZT.YLA.getCode().equals(ajstate)
 3         || AJZT.YPA.getCode().equals(ajstate)
 4         || AJZT.YJA.getCode().equals(ajstate);
 5 if (!validState) {
 6     String ajstateCN = ajstate == null ? "" : dictService.getDetail(AJZT.KIND, ajstate);
 7     
 8     String message = "只有已立案、已破案、已结案才允许录入破结案信息,当前的案件状态是:${ajstateCN}!";
 9     message = message.replaceFirst("\\$\\{ajstateCN\\}", ajstateCN);
10     
11     tab.setInvalidMessage( message );
12     return tab;
13 }

说明:

  1. 关键的代码(line 2-4)使用了枚举,这个地方不要用硬编码。
  2. 第line 8-9行,构建消息的方式也是基于模板的思想,但是已经被更好的方式所取代(参考前文)。

调试输出

使用日志控件(“log4j”+“commons-logging”),而不要用System.out.println。
参考: https://github.com/xmov/base-frame/wiki/日志组件

JS话题

在JS中构建HTML

var template = 
"<div name='demo'>\
    <input name='name'>{name}</input>\
    <input name='email'>{email}</input>\
</div>";
var instance = template.replace(/\{name\}/, "Adam")
                       .replace(/\{email\}/, "[email protected]");

说明:这里使用了正则表达式。

数据缓存

考虑一下我们要做一个百度图片类似的功能。搜索出来的结果是很多的缩略图,点击其中一个图片,打开一个新的页面对点击的图片进行放大。在点击的时候,需要把图片的id信息作为请求参数,发给服务器,关键就是我们如何从点击的图片获取这个图片的id。
  1. 我们可以给img元素添加额外的属性
    这些属性可能不是html的标准属性:比如我们可以增加systemid属性来缓存图片数据的id;或者有违w3c标准对其的定义:比如使用class来记录systemid。
  2. 在img的相对位置,添加一个隐藏的dom元素
    比如,我们在一个img元素之后,紧跟一个隐藏的input;class="systemid",value值为图片的id。
    这是我之前一直使用的方式:如果需要缓存多个数据项,可以定义一个隐藏的div,在div内定义多个input来缓存数据。
  3. 使用jquery的data方法
    $("#img01").data("systemid", "PCS4401000000002016022917470001"); // 缓存systemid数据到指定的dom
    $("#img01").data("systemid") // 从指定的dom获取systemid缓存数据
    $("#img01").removeData("systemid"); // 移除缓存数据

    如果缓存的数据项,不需要作为表单元素提交到服务端,那么我推荐这个方案。

JSP话题

去JSP脚本

使用EL代替表达式

引入外部资源

默认的写法:
<script src="<%=request.getContextPath()%>/library/js/framework/JavaScriptLibrary.js"></script>

推荐的写法:

<script src="${pageContext.request.contextPath}/library/js/framework/JavaScriptLibrary.js"></script>

传递字符串类型

后台Controller封装数据:
model.addAttribute("kzyw_sysid",sYSTEMID);

前台JSP提取数据:

<script type="text/javascript">
    var kzyw_sysid = "${kzyw_sysid}";
</script>

说明:

  1. 字符串类型,需要加引号。
  2. 如果直接显示在页面,而不是存储在js变量,不用加引号。

传递复杂结构类型

复杂结构类型,在js中以json格式存储。
后台Controller封装数据:
    @RequestMapping("/showStructure")
    public String showStructure(Model model){
        List<Map<String,String>> list= v_ZDYCJ_CONF_YWBService.getStructure();
        org.json.JSONArray treeData= new org.json.JSONArray(list);
        model.addAttribute("treeData", treeData);
        return STRUCTURE_VIEW;
    }

说明:以上是集合封装,如果是bean封装,或者集合、bean混合封装,应该也是可以的(没有测试,或者没有记录,不打包票)。

前台JSP提取数据:
<script type="text/javascript">
    var treeData = ${treeData};
</script>

说明:提取出来的treeData是JSON格式,不需要加引号。

URL链接参数,控制内容显示

<div style="display:${empty param.hideTitle ? 'auto' : 'none'};">标题</div>

说明:如果有hideTitle请求参数,就不显示;否则显示。

使用标签库代替脚本

JSTL是JSP的标准标签库,目前还没来得及研究。

PLSQ话题

程序注释

注释的demo:

create or replace procedure asj_ws_generateWordMarkForHYZ
/*
   名字解析:案事件-文书相关-为换押证生成文书字号。
   这个过程是对ASJ_GENHYZWORD的一次重构。
  */
(in_writid      in varchar2, -- 文书实例编号
 in_increment   in integer, -- 增量,在一书多人时需要同时为多个文书生成序列号
 out_wordofwrit out varchar2, -- 文书字
 out_markofwrit out integer -- 文书号
 ) is

说明:

  1. 在程序名和程序参数之间添加对程序的功能性说明。
  2. 在每一项参数后,对参数进行注释。
  3. 使用is,不要使用as
对这个问题的记录,可以参考 PLSQL的注释技巧。

 

你可能感兴趣的:(一次开发逻辑规范的总结)