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 的设计有了一点新的体会,记 ...
随机推荐
- # 20175333曹雅坤《Java程序设计》第1周学习总结
教材学习内容总结 1.学习第一章PPT,安装JRE,JDK并配置path环境参数 2.在windows上使用dos命令运行教材第一章代码Hello.java和People.java 3.下载使用git ...
- 使用SSH的scp命令行传输文件到远程服务器
使用方式如下: 1.上传本地文件到服务器 scp /path/filename username@servername:/path/例如scp /var/www/test.php root@192.1 ...
- 第二周 数据分析之展示 Matplotlib库入门
Matplotlib库介绍:优秀的数据可视化第三方库 使用:Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发,matplotlib.pyplot是绘制各类可视化图形的命令子库 ...
- css-块级格式上下文
定义: 块级格式上下文(Block Formatting Context)是CSS中一个相对冷门的概念,今天被问到才引起注意,下文简单介绍下它的用法,学习资料多来源于网络,实际开发中遇到再继续更博 ...
- innodb文件损坏处理
innodb文件损坏报错如下: 2018-09-03T09:52:43.486363Z 0 [ERROR] InnoDB: Space id and page no stored in the pag ...
- Elasticsearch 安装和配置
1. 下载并解压 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.0.tar.gz ...
- linux磁盘阵列 逻辑卷管理器
Difficult doesn't mean impossible.It simply meansthat you have to work hard.困难并不代表不可能,它仅仅意味着你必须努力奋斗. ...
- Java中多线程服务中遇到的Redis并发问题?
背景: 一个中小型H5游戏 核心错误信息: (1): java.lang.ClassCastException: [B cannot be cast to java.lang.Long at redi ...
- 金蝶K/3 同步用核算项目配置
- mysql case when * else end
分条件计算总数 SELECT -- SUM( END) as am, -- SUM( END) as om , -- SUM( END) as aom , -- SUM( then AmoutPric ...