领域逻辑组织可以分为三种主要的模式:
事务脚本(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的更多相关文章

  1. 观《if (domain logic) then CQRS, or Saga?》所悟

    引言 Udi Dahan曾在2017年阿姆斯特丹的DDD欧洲年会上发表过一篇演讲--if (domain logic) then CQRS, or Saga.视频是UP主从Youtube搬运的,我听力 ...

  2. Domain logic approachs

    1.transaction script(事务脚本) 概述: 很多企业应用可以看成一系列的事务,每一个事务可以通过使用一个Transaction Script来处理. 用法: 使用Transactio ...

  3. Domain Driven Design and Development In Practice--转载

    原文地址:http://www.infoq.com/articles/ddd-in-practice Background Domain Driven Design (DDD) is about ma ...

  4. 翻译:wiki中的business logic词条

    Business logic 业务逻辑 From Wikipedia, the free encyclopedia 来自Wikipedia,自由的百科全书 In computer software, ...

  5. 领域驱动设计(Domain Driven Design)参考架构详解

    摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...

  6. [转载]领域驱动设计(Domain Driven Design)参考架构详解

    摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...

  7. (翻译)领域驱动设计实现-Implementing Domain Driven Design

    简介 Implementing Domain Driven Design 领域驱动设计实现 A practical guide for implementing the Domain Driven D ...

  8. 2 What is the Domain Driven Design? 什么是领域驱动设计

    What is the Domain Driven Design? 什么是领域驱动设计 Domain-driven design (DDD) is an approach to software de ...

  9. DDD:小议 BoundexContext 设计

    背景 看了这篇文章:Coding for Domain-Driven Design: Tips for Data-Focused Devs,对 BoundedContext 的设计有了一点新的体会,记 ...

随机推荐

  1. linux服务器安装Mysql后,只能看到information_schema/test这两个库,无法修改密码

    参考链接:https://www.cnblogs.com/ThinkVenus/p/7670722.html 问题背景:登录mysql失败,密码错误,由此想到需要更改密码 然而,进入数据库后,只能看到 ...

  2. ansible 使用记录

    copy: ansible server -m copy -a 'src=/etc/ansible/port/iptables dest=/etc/sysconfig/iptables owner=r ...

  3. Linux Django项目部署

    步骤 .数据库的处理 1.1 上传bbs.sql 1.2 在mysql中创建bbs库,并导入数据库SQL脚本 mysql> create database bbs charset utf8mb4 ...

  4. windows端口并结束其进程

  5. 微信小程序换皮肤,动态切换菜单栏和导航栏的样式,动态修改TabBar和NavigationBar

    在做微信小程序换皮肤的时候,需要动态修改菜单栏(TabBar)和导航栏(NavigationBar) 但是在小程序中它们的样式是写在app.json里面,而且app.json是静态编译,运行时哪怕你修 ...

  6. beta冲刺3/7

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(3/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

  7. Ubuntu中eclipse端口被占

    我的eclipse有时候会闪退,然后再次打开运行HTML程序的时候会提示端口被占,即使之前改过端口也会提示,然后我就在网上搜索解决办法,目前亲测有效的是 输入以下命令: lsof -i:8888 // ...

  8. Kali Linux常用服务配置教程DHCP服务原理

    Kali Linux常用服务配置教程DHCP服务原理 动态主机配置协议(Dynamic Host Configuration Protocol,简称DHCP)是一个局域网的网络协议,基于UDP协议工作 ...

  9. vw实现移动端自适应页面

    一.设备支持情况 测试网站:https://caniuse.com/#search=vw css3test:https://airen.github.io/css3test/,https://gith ...

  10. bzoj3124: [Sdoi2013]直径 树形dp two points

    题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...