zoukankan      html  css  js  c++  java
  • 记录我开发鞋服行业供应链软件的历程<设计业务层>

        有的人说,业务层就是一堆的Manager(或者叫service),为什么还要设计呢?前一句讲的没错,后面这一句就有点欠思考了.我自已总结了一下,如果做一个系统,Manager之间共性的东西还是很多的:
      1):都需要写操作日志
      2):都需要写操作消息,比如保存某个模块的时候,显示“保存成功”的信息给用户.
      3):对于一些简单的模块,简单指的是这个模块只需要对一个表操作(为了方便,称为CRUD模块),比如说ERP信息里的,员工,单位等等。具有通常的功能有:增加,修改,删除,查找,打印等.
      4): 对于一些复杂的模块,复杂指的是主子表结构的模块(为了方便,称为CRUDLine模块),比如说ERP信息里的采购订单,销售订单,销售单等,具有通常的功能有:浏览,增加,修改,删除,增加明细,修改明细,删除明细等.
      5):CRUD模块一般对应Hibernate的一个POJO
      6):CRUDLine模块一般对应Hibernate的两个POJO
      7):都需要传递给表示层,这次操作用哪个页面显示.
      8):都有一个Dao对象.
      9):如果要写浏览功能的伪代码是如下:
      
         //写hql语句 
         String hql=” from Hibernate_POJO ”;
    
         //如果存在过滤条件,加上过滤条件
    
         if(存在:where){
    
               hql=hql+where;
    
         }
         //得到实体的列表
    
         List list=dao.list(hql,pageNumber,limit);
    
         //将实体列表传到页面上显示
    
         request.setAttribute(“datas”,list);
    
    
      10):如果写增加保存功能的伪代码如下:
      
        //new一个pojo对象
    
        Object pojo=new HibernatePojo();
    
        //将页面传回的值绑定到pojo
    
         bindEntity(pojo,form);
    
         //调用dao进行保存
    
         dao.save(pojo);
    
         if(成功){
    
            //写成功的操作日志
    
            writeSuccessLog();
    
            //写成功的提示信息
    
            writeSuccessMessage();
    
         }else{
    
            //写失败的操作日志
    
            writeFailureLog();
    
            //写失败的提示信息
    
            writeFailureMessage();
    
         }
    

         上面只是列举了部分共性的东西,碰到不同系统架构,不同的业务系统,共性的东西不同,共性出现的地点也不同,比如可能会出现在表示层.但只要去总结就可以很容易找的到。找到了共同点,我们就可以好好利用Java反射,再结合Spring,把那些共同点抽象出来,形成系统架构中的业务层。
      【业务层结构】
      BaseEngine->BaseCRUDEngine->CRUDOperatorImpl->CRUDLineOperatorImpl
  • BaseEngine完成的功能有
  •   
     writeSuccessLog:写成功的操作日志
     writeSuccessMessage:写成功的提示信息
     writeFailureLog:写失败的操作日志
     writeFailureMessage:写失败的提示信息
     setDao:设置Dao对象
     forwardJsp:通知表示层返回Jsp
     forwardJson:通知表示层返回Json
     forwardExcel:通知表示层返回Excel
     forwardPdf:通知表示层返回Pdf
    
  • 2:BaseCRUDEngine完成的功能有:
  •   
     getEntityClass:得到实体类(虚函数)
     getTableKeyField: 得到实体类的主键名(虚函数)
     getEntityId:取主键值
     createEntity:生成一个实体对象
     isUniques:判断当前主键对象是否唯一
    
  • 3:CRUDOperatorImpl
  •        
    list:列表功能
    add:进入增加时调用的方法
    addSave:增加保存时调用的方法
    update:修改
    updateSave:修改保存
    view:浏览
    find:查找
    print:打印
    
  • 4:CRUDLineOperatorImpl
  •        
    addLine:增加明细
    addSaveLine:增加保存明细
    updateLine:修改明细
    updateSaveLine:修改保存明细
    deleteLine:删除
    

         从上面可知,我们现在设计的业务层把很多基本的东西抽象出来了,除了让以后的业务层来的更简单外,还可以让每个程序员代码风格一致,阅读代码,维护更方便。如果有特殊的业务逻辑,可以通过重写来达到目的。如果再附上自动代码产生平台,整个系统的开发速度就很快了,而且bug很少.
        附一个简单操作模块的Manager 的代码:
    public class TbsunitManager extends CRUDOperatorImpl
     {
        private static final long serialVersionUID = -1L; 
    
        public TbsunitManager() { 
    
        } 
    
        public Class getEntityClass() {
            return Tbsunit.class;
        } 
    
        public String getTableKeyField() {
            return "tbsunitid";
        } 
    
     }
    
本博客均为原创,转载请注明出处.
查看全文
  • 相关阅读:
    Oracle函数如何把符串装换为小写的格式
    Oralce中的synonym同义词
    JS中getYear()的兼容问题
    How to do SSH Tunneling (Port Forwarding)
    所谓深度链接(Deep linking)
    upload size of asp.net
    发一个自动刷网站PV流量的小工具
    解决Visual Studio 2008 下,打开.dbml(LINQ) 文件时,提示"The operation could not be completed." 的问题。
    在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录
    使用SQL语句获取Sql Server数据库的版本
  • 原文地址:https://www.cnblogs.com/mzhanker/p/2080800.html
  • Copyright © 2011-2022 走看看