zoukankan      html  css  js  c++  java
  • 一次开发逻辑规范的总结

    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。

    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}/, "adam@qq.com");

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

    数据缓存

    考虑一下我们要做一个百度图片类似的功能。搜索出来的结果是很多的缩略图,点击其中一个图片,打开一个新的页面对点击的图片进行放大。在点击的时候,需要把图片的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的注释技巧
  • 相关阅读:
    我理解的软件编码规范
    分享:读完这100篇论文,你就能成大数据高手!
    Docker简明教程
    几种源码管理工具的使用
    《构建之法.现代软件工程》教材读后问题
    三层神经网络自编码算法推导和MATLAB实现 (转载)
    aa
    奇异值分解(SVD)原理详解及推导(转载)
    奇异值分解(SVD) --- 几何意义 (转载)
    奇异值分解(SVD)原理详解及推导 (转载)
  • 原文地址:https://www.cnblogs.com/ywjy/p/5230940.html
Copyright © 2011-2022 走看看