企业应用架构模式-事物脚本

概述: 使用过程来组织业务逻辑,每个过程处理来自表现层的单个请求

特点
(1) 以数据为中心(输入->查询->处理->输出),典型的面向过程思想)
(2) 代码简单,易懂
(3) 适合项目不大的开发
(4) 业务逻辑和领域逻辑夹杂在事物脚本中,容易产生冗余数据

组织方式
(1) 一个类处理一类事物脚本,我们非常熟悉的编程方式

 1 public class Gateway{
 2     private  static final String findRecognitionsStatement = "select amount from revenueRecognitions where contract = ? and recognizedOn <= ?"
 3     private  static final String findContractStatement = "select * from contracts c,product p where id = ? and c.product = p.id";
 4     private  static final String insertRecognitionStatement = "insert into revenueRecognitions values(?,?,?)";
 5     private Connection _db;
 6     public ResultSet findRecognitionsFor(long contractId,Date asof) throws SQLException{
 7             PreparedStatement stmt = db.preparedStatement(findRecognitionsStatement);
 8             stmt.setLong(1,contractId);
 9             stmt.setDate(2,asof);
10             return stmt.executeQuery();
11     }
12     public ResultSet findContract(long contractId)throws SQLException{
13             PreparedStatement stmt = db.preparedStatement(findContractStatement);
14             stmt.setLong(1,contractId);
15             return stmt.executeQuery();
16     }
17     public void insertRecognition(long contractId,Money amount,Date asof) throws SQLException{
18         PreparedStatement stmt = _db.preparedStatement(insertRecognitionStatement);
19         stmt.setLong(1,contractId);
20         stmt.setBigDecimal(2,amount.amount());
21         stmt.setDate(3,asof);
22         stmt.executeUpdate();
23     }
24 }
class RecognitionService{
	private Gateway _db;
	public Money recognizedRevenue(long contractNumber,Date asof){
			Money result = Money.dollar(0);
			try{
				ResultSet rs = _db.findRecognitionsFor(contractNumber,asof);
				while(rs.next()){
					 result = result.add(Money.dollars(rs.getBigDecimal("amount")));
				}
				return result;
			}catch(Exception ex){
				throw new RuntimeException(ex);
			}
	 }
	 public void calculateRevenueRecognitions(long contractNumber){
			try{
				ResultSet contracts = _db.findContract(contractNumber);
				contracts.next();
				Money totalRevenue = Money.dollars(contracts.getBigDecimal("revenue"));
				Date recognitionDate = new Date(contracts.getDate("dataSigned"));
				String type = contracts.getString("type");
				if(type.equals("S")){
						Money[] allocation = totalRevenue.allocate(3);
						_db.insertRecognition(contractNumber,allocation[0],recognitionDate);
						_db.insertRecognition(contractNumber,allocation[1],recognitionDate.addDays(60));
						_db.insertRecognition(contract,allocation[2],recognitionDate.addDays(90));
				}else if(type.equals("W")){
						_db.insertRecognition(contractNumber,totalRevenue,recognitionDate);
				}else if(type.equals("D")){
						Money[] allocation = totalRevenue.allocate(3);
						_db.insertRecognition(contractNumber,allocation[0],recognitionDate);
						_db.insertRecognition(contractNumber,allocation[1],recognitionDate.addDays(30));
						_db.insertRecognition(contract,allocation[2],recognitionDate.addDays(60));
				}
			}catch(Exception ex){
				throw new RuntimeException(ex);
			}
	  }
}

(2) 一个类处理一个事物脚本,这种方式可以以命令模式方式组织. Command pattern

1     interface transactionScript{ Object run() }

  

 1 class recognizedRevenueTransationScript implements TransationScript{
 2         private long _contractNumber;
 3         private Date _asof;
 4         public recognizedRevenueTransationScript(long contractNumber,Date asof){
 5                 _contractNumber = contractNumber;
 6                 _asof = asof;
 7         }
 8         public Object run(){
 9             Money result = Money.dollar(0);
10             try{
11                 ResultSet rs = _db.findRecognitionsFor(_contractNumber,_asof);
12                 while(rs.next()){
13                      result = result.add(Money.dollars(rs.getBigDecimal("amount")));
14                 }
15                 return result;
16             }catch(Exception ex){
17                 throw new RuntimeException(ex);
18             }
19         }
20
21 }
 1 class calculateRevenueRecognitionsTransationScript implements TransationScript{
 2         private long _contractNumber;
 3
 4         public calculateRevenueRecognitionsTransationScript(long contractNumber){
 5                 _contractNumber = contractNumber;
 6                 _asof = asof;
 7         }
 8         public Object run(){
 9             try{
10                 ResultSet contracts = _db.findContract(contractNumber);
11                 contracts.next();
12                 Money totalRevenue = Money.dollars(contracts.getBigDecimal("revenue"));
13                 Date recognitionDate = new Date(contracts.getDate("dataSigned"));
14                 String type = contracts.getString("type");
15                 if(type.equals("S")){
16                         Money[] allocation = totalRevenue.allocate(3);
17                         _db.insertRecognition(contractNumber,allocation[0],recognitionDate);
18                         _db.insertRecognition(contractNumber,allocation[1],recognitionDate.addDays(60));
19                         _db.insertRecognition(contract,allocation[2],recognitionDate.addDays(90));
20                 }else if(type.equals("W")){
21                         _db.insertRecognition(contractNumber,totalRevenue,recognitionDate);
22                 }else if(type.equals("D")){
23                         Money[] allocation = totalRevenue.allocate(3);
24                         _db.insertRecognition(contractNumber,allocation[0],recognitionDate);
25                         _db.insertRecognition(contractNumber,allocation[1],recognitionDate.addDays(30));
26                         _db.insertRecognition(contract,allocation[2],recognitionDate.addDays(60));
27                 }
28             }catch(Exception ex){
29                 throw new RuntimeException(ex);
30             }
31             return null;
32         }
33
34 }

现在大多数公司都是用这种方式开发软件,原因有以下几点

(1) 本质业务并不复杂
(2) 学习成本低(以数据为中心的编程方式不用考虑抽象,多态等一些问题)
(3) 这种开发方式已经被大多数公司认定为开发标准
(4) 公司不看重开发过程,只看最终结果

总结 :
    这种开发方式是典型的经典的面向过程开发方式,在业务不复杂的时候可以非常好的解决
 业务问题。
 由于一个功能执行一个脚本,随着业务不断复杂,必定会出现冗余代码. 
 比如转账业务和取钱业务,都会出现相同的查询账户和验证。
 可以通过抽取方法,或提取公共类解决相应的问题,
 可是增加了复杂度,违背了事物脚本简单的初衷。

时间: 2024-10-07 15:53:09

企业应用架构模式-事物脚本的相关文章

《企业应用架构模式》(POEAA)读书笔记

原文地址:<企业应用架构模式>(POEAA)读书笔记作者:邹齐龙(技术-5013 什么是架构 Rolph Johnson认为:架构是一种主观上的东西,是专家级的项目开发人员对系统设计的一些可共享的理解 架构中包括一些决定,开发者希望这些决定能尽早作出,因为在开发者看来它们是难以改变的. 如果你发现某些决定不像你想象中的那么难以改变,那么它就不再与架构相关 理解: B/S (SmartClient.C/S) 架构, DotNet 架构, J2EE架构 企业应用的特点 涉及到持久化数据 很多人同时

企业应用架构模式pdf

下载地址:网盘下载 内容简介  · · · · · · <企业应用架构模式>作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的.关于解决方案的.不可或缺的手册.<企业应用架构模式>获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖.<企业应用架构模式>分为两大部分.第一部分是关于如何开发企业应用的简单介绍.第二部分是<企业应用架构模式>的主体,是关

企业应用架构模式 pdf下载

从大学到现在,这本书也许我反反复复地读了不下十遍,可是这次终于有了勇气把他标注为看过,因为直到今天我才自信自己真的理解了里面所讲的架构模式. 对于现在的互联网时代,所有的开发思想都是强调简洁,强调"敏捷",甚至曾经流行一时的OOD竟然有被嫌弃的趋势 需要学习的朋友可以通过网盘免费下载pdf版 (先点击普通下载-----再选择普通用户就能免费下载了)http://putpan.com/fs/fyibfens4hu6b61d5/ <企业应用架构模式>作者是当今面向对象软件开发的

《企业应用架构模式》读后感

1.企业应用架构模式 架构 架构的定义:最高层次的系统分解.系统中不容易改变的部分. 架构中最有价值的部分是:分层设计. 企业应用的特点 一般都涉及持久化数据 一般都涉及大量数据 一般还涉及很多人同时访问系统 还涉及大量操作数据的用户界面屏幕 通常还与企业周围的其他企业应用集成 还存在数据的概念不一致性 复杂的业务”无逻辑“ 系统庞大,须具有”分而治之“的思想 企业应用的种类(抽象.提炼) 处理大量数据的系统 用户界面高要求的系统 数据管理系统 关于性能的考虑 响应时间 响应性:进度条 等待时间

《企业应用架构模式中文版》学习笔记(转)

本书先介绍了一些企业应用开发的基础知识,比如分层架构.WEB表现.业务逻辑.数据库映射.并发.会话.分布策略等等.通过使用场景.解决方案.UML等手段详细介绍了设计模式(包括一些常用的设计模式GOF23和本书上新创的设计模式).了解书中这些模式是干什么的.它们解决什么问题.它们是如何解决问题的.这样,如果你碰到类似的问题,就可以从书中找到相应的模式.可以为你节约成本.缩短项目周期时间.避免风险,以确保项目能够完美的完成. 一.三个基本层次:表现层.领域层.数据源层 层次 职责 表现层 提供服务,

《企业应用架构模式》 - 书摘精要

(译者序) "每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动." ---- Christopher Alexander 招式套路可以千变万化,扎实深厚的"内功"却是始终如一: (前言) 关于软件架构的通用性的书籍,我推荐[POSA] -- "面向模式的软件体系结构": 迭代开发的核心在于只要软件对用户有用,就应当交付,即使这个软件当时并没有完成: (引言) 大多数重

系统架构师-基础到企业应用架构-企业应用架构

一.上篇回顾 我们先来回顾下上篇讲解的内容,我们前面的几节分别讲述了,业务逻辑层.数据访问层.服务层.表现层,我们了解了这些分层的职责和分层之间的大概的关联 关系,本篇可能主要是简单的介绍下企业应用的几类模式,结合这几个分层直接的交互来完成系统功能的构建.我们还是先对我们学习的四个分层的职责和功能做个大 概的回顾,我们先来看看下图来回顾下我们讲述的内容. 我想通过上图,大家能回忆起我们讲述的相关内容,然后整理好自己的思路,我们本文将会针对这几个分层进行相应的模式的讲解,并且会结合实例来说明企业应

企业应用架构学习笔记

最近因为要学习领域驱动设计,在看到<领域驱动设计:软件核心复杂性应对之道>时,里面很多地方都提到了<企业应用架构模式>,企业应用架构这本书是由非常著名的Martin Fowler 写的,Martin Fowler 除了总结过企业架构的设计模式之外,还写了非常多的其它软件工程相关的文章,比如曾总结过IOC,写过分析模式,写过代码重构模式,具体可参看他的个人网站http://www.martinfowler.com/articles/injection.html,等我英文阅读能力提高了

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验. 1.说一说Servlet生命周期(非常重要) Servlet生命周期包括三部分: 初始化:Web容器加载servlet,调用init()方法 只执行一次 处理请求:当请求到达时,运行其service()方法.service()自动调用与请求相对应的doXXX