`

业务逻辑层之事务脚本与领域模型

阅读更多

在前面的博客中,已了解了前端控制器页面控制器应用控制器这三种表现层模式,如果说它们精心安排了外部世界与系统内部的通信,那么业务逻辑层的工作则是处理应用程序的业务部分。业务逻辑层应当远离那些外部的“噪音”。业务逻辑是整个应用程序的根本目的所在,系统的其它部分都是为这部分服务的。

这里介绍两种经常使用的领域逻辑模式:事务脚本模式和领域模型模式。

 

一、事务脚本

 

1.1 概念

Transaction Script:使用过程来组织业务逻辑,每个过程处理来自表现层的单个请求。貌似有点太抽象了。大多数业务应用都可以被看作是一系列事务,有时候,事务可能就显示下数据库的信息,有时候,也可能涉及许多校验和计算的步骤。事务脚本则将所有这些逻辑组织成单个过程,而且每个事务都有自己的事务脚本,就是都有自己的执行过程,但注意的是事务间的公共子任务可以被分解成多个子程序。

 

1.2 为什么要使用事务脚本

事务脚本模式的好处在于你可以很快就得到想要的结果。每个脚本都能很好地处理输入的数据并操作数据库来保证得到想要的结果。因此它是一个快速而有效的机制,且不需要投入大量时间和精力在复杂的设计上,对于小型且工期较紧的项目再适合不过。

 

1.3 实现事务脚本

具我工作经验观察,许多程序员都浑然不知地在使用这种模式,包括本人以前。

现在假设有发表博客和删除博客的业务,那将这两个业务分别看成两个事务脚本。

<?php
//这里创建一个基类,作数据处理,假设用的是pdo
abstract class Base {
    function __construct() {
        //这里用了到之前博客讲的注册表
        $dsn = \woo\base\ApplicationRegistry::getDSN( );
        if ( is_null( $dsn ) ) {
            throw new \woo\base\AppException( "No DSN" );
        }

        self::$DB = new \PDO( $dsn );
        self::$DB->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    } 

    protected function doStatement() {
        //执行sql
    }
}

class blogManager extends Base {
    static $add_blog =  "INSERT INTO blog ( name ) values( ? )";
    static $del_blog = "DELETE FROM blog WHERE (?)"; 

    //添加博客事务脚本
    function addBlog(...) {
        //处理参数,拼写add_blog格式的sql,调用父类doStatement执行,通知好友,一系列的子程序。。。
    }
    
    //删除博客事务脚本
    function delBlog(...) {
        //处理参数,拼写del_blog格式的sql,调用父类doStatement执行。
    } 
}
?>

 这个例子十分简单,但正因为它的简单,才正好体现了事务脚本的优势之处。如果写一个较为复杂应用程序,这种方式使项目不太容易扩展,因为事务脚本总是不可避免地互相渗入,从而导致代码重复。

 

 

二、领域模型

 

2.1 概念

Domain Model:很难用语言说清楚。简单的说就是领域模型象征着真实世界里项目中的各个参与者。“万物皆对象”的原则在此体现得淋漓尽致。在其他地方对象总是带着种种具体的责任,而在领域模式中,它们常常描述为一组属性及附加的代理。它们是做某些事的某些东西。

 

2.2 为什么要使用领域模型

现实代码中,会有很多事务脚本模式的身影,会发现重复代码是个普遍问题。当不同的事务要执行相同的任务时,重复貌似是最快的解决办法,但这大大增加了代码维护的成本。有时也可以通过重构来解决,但慢慢地复制粘贴可能成了开发中难以避免的一部分。

 

2.3 实现领域模型

为实现对比,引用事务模型的例子,并将领域模型类直接映射到关系数据库的表(这样做会使得开发变得简单)

<?php
//这里创建一个基类,作数据处理,假设用的是pdo
abstract class Base {
    function __construct() {
        //这里用了到之前博客讲的注册表
        $dsn = \woo\base\ApplicationRegistry::getDSN( );
        if ( is_null( $dsn ) ) {
            throw new \woo\base\AppException( "No DSN" );
        }

        self::$DB = new \PDO( $dsn );
        self::$DB->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
    } 

    protected function doStatement() {
        //执行sql
    }
}

class blogModel extends Base{
    function addBlog(...){}
}

//创建一个领域模型的基类
abstract class DomainObject {
    private $id;
    //$id为表数据的主键id
    function __construct( $id=null ) {
        $this->id = $id;
    }

    function getId( ) {
        return $this->id;
    }

    //牢记 万物皆对象
    static function getCollection( $type ) {
        //获取要操作的对象    
    }
}
class Blog extends DomainObject {
    private $name;
    private $feed;

    function __construct( $id=null, $name=null ) {
        $this->name = $name;
        $this->feed = self::getCollection("\\woo\\domain\\Feed");
        parent::__construct( $id );
    }

    function addBlog(...){
        //调用blogModel的方法添加
        //再调用feed发送通知给好友
    }

    function setFeed( FeedCollection $Feed ) {
        $this->feed = $Feed;
    }
}
?>

 

2.4 小结

领域模型设计得简单还是复杂取决于业务逻辑的复杂度。使用领域模型的好处是:当你设计模型时可以专注于系统要解决的问题,而其他的问题(如持久化和表现等)可以由其他层来解决。

在实现项目中,大多数程序员在设计领域模型时还是把一半的注意力都放在数据库上。将领域模型和数据层分离会导致一定的代价,你也可能会将数据库代码直接放入模型中(尽管你可能会使用一个数据入口来处理实际的SQL)。对于相对简单的模型,特别当类与数据表一一对应时,这样方法是完全可行的,可以减少因协调对象和数据库而创建外部系统导致的时候消耗。

2
0
分享到:
评论

相关推荐

    微服务架构从事务脚本到领域模型.docx

    ### 微服务架构从事务脚本...事务脚本模式适合于业务逻辑较为简单的情况,而领域模型模式则更适合于构建复杂、灵活和可维护的微服务系统。在实际项目中,选择合适的设计模式需要根据具体的应用场景和业务需求来决定。

    细说业务逻辑

    领域实体是业务逻辑中最为基础的部分,它们代表了业务领域的核心概念和数据模型。例如,在银行系统中,账户、交易记录、客户信息等都属于领域实体。领域实体不仅包含数据属性,还可能包含与之相关的业务行为和规则。...

    分层架构与业务逻辑实现方式

    在企业级系统中最核心的层是业务层,因为企业级系统主要是与业务打交道,而业务逻辑是每个系统都不尽相同的。那么,做好企业级系统,首先主要分析好业务系统。 业务逻辑每个系统都很可能不一样,没办法通用。那么有...

    细说业务逻辑1

    1. Transaction Script:将每个业务操作视为独立的事务脚本,简单易懂,但随着业务复杂性的增加,代码可能会变得难以管理。 2. Table Module:每个数据库表对应一个模块类,负责该表的所有操作,适合小型项目,但在...

    领域建模技术概述.docx

    事务脚本是一种常见的编程模式,它将业务逻辑直接编写在服务层的类中,如 `MoneyTransferServiceTransactionScriptImpl` 示例所示。在这种实现中,`Account` 类仅仅是一个数据容器,包含属性(如余额)和访问器方法...

    架构师如何应对复杂业务场景?领域建模的实战案例解析1

    1. **领域概念与业务逻辑**: - 领域概念是业务领域的核心元素,比如在银行转账的例子中,"账户"、"转账"和"透支策略"就是关键的领域概念。这些概念应该自然地体现在服务执行的操作中。 - 操作通常涉及领域内的...

    领域驱动设计中的实现方式

    它提供了一层抽象,将底层数据存储的细节与业务逻辑隔离开。 - `ItemDaoHibernateImpl` 是 `ItemDao` 的具体实现,利用 Hibernate 框架进行数据库操作。每个 DAO 方法都会打开和关闭 Session,确保事务的正确管理。...

    DDD领域驱动设计实战落地解惑.pdf

    接口层负责与用户交互,应用层处理业务流程,领域层包含了核心的业务逻辑和领域模型,而基础设施层则提供通用的服务,如数据存储、邮件发送等。这种分层有助于保持代码的清晰和职责分离,使得每个层都能够专注于其...

    DDD领域驱动设计实战落地解惑-SACC2021年中国系统架构师大会.pdf

    我们将探索DDD的适用场景及价值,四层分包架构的实践,DDD事件发布订阅的最佳实践,以及DDD中的事务脚本与面向对象的权衡、基础设施层与ACL(Access Control List,访问控制列表)的落地经验、防止DDD核心模型腐化的...

    20丨领域驱动设计:35岁的程序员应该写什么样的代码?.pdf

    与事务脚本模式形成鲜明对比的是领域模型模式。领域模型模式是一种以领域知识为核心,通过构建一个领域模型来指导软件设计和开发的方式。在该模式下,系统被分为不同的子域,每个子域都有自己的领域模型。开发者通过...

    ASP.NET三层设计模型

    更重要的是,ASP.NET允许将页面展示逻辑与业务逻辑分离,显著提升了Web应用的可维护性。 #### 三、分层设计ASP.NET应用程序 ##### 3.1 分层模型概述 采用分层模型解决软件工程问题是常见的设计思路。在Web开发...

    PHP面向对象之事务脚本模式(详解)

    事务脚本模式是一种在软件开发中常用的设计模式,它...它有助于将数据库逻辑与业务逻辑相分离,提高代码的组织性和可维护性。尽管它有局限性,但在适当的场景中使用事务脚本模式,可以快速开发出稳定和高效的Web应用。

    三层架构源代码

    这种架构将应用程序分为三个主要层次:表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。通过这样的分层,我们可以实现各组件间的解耦,提高代码的可维护性和...

    软件设计书籍.pdf

    领域模型是一种更为高级的设计方法,它强调将业务逻辑与数据结构分离,通过定义丰富的业务对象来表示业务领域内的实体。这些对象不仅包含数据属性,还包含用于执行业务逻辑的方法。这种方法可以更好地模拟现实世界的...

    最简单的三层架构模型

    它将应用程序分为三个主要部分:表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer),以此来实现各层之间的松耦合,提高代码的可维护性和可重用性。 【表现层...

    标准三层架构的完整示例项目源码

    它封装了对数据库的操作,如SQL查询、事务处理等,为业务逻辑层提供数据服务。通常会使用ADO.NET、Entity Framework或其他ORM(对象关系映射)工具来简化数据库操作。 "标准三层架构的完整示例项目源码"提供的 ...

Global site tag (gtag.js) - Google Analytics