domain logic approaches
领域逻辑组织可以分为三种主要的模式:
事务脚本(Transaction Script)、领域模型(Domain Model)和表模块(Table Module)”
1、domain logic approaches
Transaction Script(事务脚本模式),是一种最简单和最容易接受的处理业务的方法。这种模式是采用面向过程的方式来组织业务逻辑。通常情况下,系统的一个流程会被实现为一个方法,然后所有的方法被组织在一起,放在一个类中。
设计思想:取数据-》逻辑-》数据展示。 存数据-》逻辑-》保存数据。
使用过程来组织业务逻辑,每个过程处理来自表现层的单个请求。大多数应用都可以被看作是一系列事务。一个事务可能将某种信息看作是以特定方式组织的,然后另一事务则会改变它。在客户系统和服务器系统这间的每次交互都包含一定数量的逻辑。它可能如显示数据库中的信息那般简单。蛤在其他一些情况下,它可能涉及许多校验和计算的步骤。事务脚本将所有这些逻辑组成成单个过程,在过程中直接调用数据库,或者只通过一个简单的数据库封装器。每个事务都有自己的事务脚本,尽管事务间的公共子任务可以被分解成多个子程序。
事务脚本组织成类的方法
将数个事务脚本放在一个类中,每个类围绕一个主题将相关的事务脚本组织在一起。(最常用)
每一个事务脚本对应一个类,此时需使用命令(Command)模式。使用时机
事务脚本胜在简单。对于只有少量逻辑的应用程序来说,使用这一模式非常自然,无论在性能上还是理解上都不会带来太大开销。
当业务逻辑越来越复杂时,该模式就会越来越难以保持良好的设计。它特有的问题是事务之间的冗余代码。
2、domain model
如果说事务脚本是 面向过程 的,那么领域模型就是 面向对象 的。面向对象的一个很重要的点就是:“把事情交给最适合的类去做”,即:“你得在一个个领域类之间跳转,才能找出他们如何交互”,Martin Flower 说这是面向对象中最难的部分,这具有误导的成份。确切地说,我们作为程序员如果已经掌握了 OOD 和 OOP 中技术手段,那么如何寻找类之间的关系,可能就成了最难的部分。但在实际的情况中,即便我们不是程序员,也总能描述一件事情(即寻求关系),所以,找 对象之间的关系 还真的并不是程序员最关系的部分,从技术层面来讲,寻找类之间的关系因为与具体的编码技巧无关,所以它现在对于程序员的我们来说,应该是最简单的部分,技术手段才是这里面的最难部分。
合并了行为和数据的领域的对象模型。在应用程序中使用领域模型需要建立一个完整的由对象组成的层,来对目标业务领域建模。 你会发现其中有的对象模拟业务活动中的数据,有的对象捕捉业务使用的规则。数据和处理一般整合在一起,从而使得数据和数据之上的操作紧密聚合。
面向对象的领域模型通常看起来与数据库模型类似,但仍有许多不同之处。领域模型混合数据和处理过程,拥有多值和复杂的的关联网,并且使用继承。
领域模型衍生出两种风格。简单领域模型看起来与数据库设计很类似,这种设计中几乎每一个数据库表都与一个领域对象对应。而复杂领域模型则与数据库 设计不同,它使用继承、策略和其他设计模式,是一张由互联的细粒度对象组成的复杂网络,复杂的领域模型更适合于复杂的逻辑,但它于数据库的映射比较 困难。
由于业务行为是经常变化的。因此易于修改、建造和测试对领域层来说十分重要。因而,领域模型与系统中的其他层之间的耦合度应达到最小。许多的分层 模式,它们的主导思想就是领域模型与系统中其他部分间保持尽可能小的依赖
3、table module
表模块(Table Module),它是处理某一数据库(其实只能是关系型数据库)中表与视图所有行的业务逻辑的一个实例。因为表模块其实就一个数据集合(如:ado的RecordSet,ado.net的DataSet中的DataTable或类型化DataSet等之类),它可以看成是一个数据容器,因为他用一个类(如Product)表示数据库中对应表所有数据及行为,我们知道面向对象模型与关系模型存在差异,通常一个类与一个实体在概念上相对应,也就是一个类对应一个表,一个类的实例,即对象对应表中某一行记录。类与表都是抽象的,集合的概念,像关系数据库中表就一个二维(行、列)的集合,而表模块用一个类直接表示表中所有数据及行为,所以这个类可以不需要实例化,它就相当于一个表(如.net 的DataTable),这样所有业务操作都直接用表模块方式进行,从这一概念上来说,它也可以看成是业务逻辑的一种实现方式,其实大家肯定可以得出,这种方式在本质上还是采用事务脚本方式来实现业务逻辑,只是事务脚本方式,经常要求处理一个业务逻辑(如:查找指定ID的Product)就需要用SQL语句从数据库中获取数据,而这种方式先把数据库的所有行加载到表模块(如:DataTable)中,之后处理所有业务都直接与表模块有关(如:查找指定ID的行,CRUD之类的操作),这正是表模块与事务脚本的细微区别之后。
domain logic approaches的更多相关文章
- 观《if (domain logic) then CQRS, or Saga?》所悟
引言 Udi Dahan曾在2017年阿姆斯特丹的DDD欧洲年会上发表过一篇演讲--if (domain logic) then CQRS, or Saga.视频是UP主从Youtube搬运的,我听力 ...
- Domain logic approachs
1.transaction script(事务脚本) 概述: 很多企业应用可以看成一系列的事务,每一个事务可以通过使用一个Transaction Script来处理. 用法: 使用Transactio ...
- Domain Driven Design and Development In Practice--转载
原文地址:http://www.infoq.com/articles/ddd-in-practice Background Domain Driven Design (DDD) is about ma ...
- 翻译:wiki中的business logic词条
Business logic 业务逻辑 From Wikipedia, the free encyclopedia 来自Wikipedia,自由的百科全书 In computer software, ...
- 领域驱动设计(Domain Driven Design)参考架构详解
摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...
- [转载]领域驱动设计(Domain Driven Design)参考架构详解
摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...
- (翻译)领域驱动设计实现-Implementing Domain Driven Design
简介 Implementing Domain Driven Design 领域驱动设计实现 A practical guide for implementing the Domain Driven D ...
- 2 What is the Domain Driven Design? 什么是领域驱动设计
What is the Domain Driven Design? 什么是领域驱动设计 Domain-driven design (DDD) is an approach to software de ...
- DDD:小议 BoundexContext 设计
背景 看了这篇文章:Coding for Domain-Driven Design: Tips for Data-Focused Devs,对 BoundedContext 的设计有了一点新的体会,记 ...
随机推荐
- day03 数据类型与运算符
今日内容: 1.变量及常量的命名规范 2.与用户的交互 3.字符串的格式化输出 4.基本的数据类型 5.运算符 6.注释 今日重点: 1.变量及常量的命名规范 (1)强制规范[如果违反会报错] 1&g ...
- 【Hibernate】could not instantiate class.. from tuple] with root cause
使用hibernate的过程中出现了这个问题,查询语句如下: String hql = "select new GoodsBean(id, name, price, proPic, sale ...
- C++实验一
2-28 #include <iostream> using namespace std; int main() {char x; cout<<"Menu: A(dd ...
- zoj4027 线性dp!好题
非常好的dp,可是我太菜做不出来.. /* 第i个左括号不可能越过第i+1个左括号 如果第i个左括号到位置j,前提是第i+1个左括号就必须到位置j+1即以后 用dp[i][j]表示把第i个左括号转移到 ...
- 开发快捷键(Eclipse,STS)
Eclipse 常用快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为 ...
- python3 字典(dictionary)(一)
一.定义:是另一种可变容器模型,可存储任意类型对象:(也被称为关联数组或哈希表:存储的数据是没有顺序的) 语法为: d = {key1 : value1, key2 : value2 } #----- ...
- 网络层HTPPS和HTTP的概念与区别
HTPPS和HTTP的概念 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP ...
- MySQL学习笔记:timediff、timestampdiff、datediff
一.时间差函数:timestampdiff 语法:timestampdiff(interval, datetime1,datetime2) 结果:返回(时间2-时间1)的时间差,结果单位由interv ...
- Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
Allowed Letters 最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了. 想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉, 然后再枚举64个本 ...
- JavaScript中var、let和const的区别(转载)
一.前言 在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . c ...