`

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

阅读更多

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

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

 

一、事务脚本

 

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

    软件系统面向对象的设计思想可谓历史悠久,20世纪70年代的Smalltalk可以...本文主要介绍了领域驱动设计的基本概念、要素、特点,对比了事务脚本和领域模型的特点,最后介绍了我们在软件开发过程中的领域驱动设计实践。

    Microsoft+.NET企业级应用架构设计

     4.1 业务逻辑层究竟是什么  4.1.1 业务层剖析  4.1.2 业务逻辑层的位置  4.1.3 业务层和其他层  4.1.4 创建业务层的模式  4.2 事务脚本模式  4.2.1 事务脚本模式概述  4.2.2 模式实战  4.3 表模块模式  ...

    Microsoft+.NET企业级应用架构设计 超低积分

     4.1 业务逻辑层究竟是什么  4.1.1 业务层剖析  4.1.2 业务逻辑层的位置  4.1.3 业务层和其他层  4.1.4 创建业务层的模式  4.2 事务脚本模式  4.2.1 事务脚本模式概述  4.2.2 模式实战  4.3 表模块...

    .NET企业级应用架构设计

    第一部分 设计原则 第1章 当代的架构师和架构 ...4.1 业务逻辑层究竟是什么 4.1.1 业务层剖析 4.1.2 业务逻辑层的位置 4.1.3 业务层和其他层 4.1.4 创建业务层的模式 4.2 事务脚本模式 4.2.1 事务脚本模式概述

    PHP数据源架构模式之表入口模式实例分析

    其中领域层的领域逻辑模式有:事务脚本、领域模型以及表模块。 1、事务脚本最容易理解也最易于开发,不过由于易造成代码重复等问题,不利于后期的维护,比较适合开发逻辑较为简单的业务,比如只有几个用于展示企业...

    ASP.NET的网页代码模型及生命周期

    代码隐藏页模型与单文件页模型不同的是,代码隐藏页模型将事物处理代码都存放在cs文件中,当ASP.NET网页运行的时候,ASP.NET类生成时会先处理cs文件中的代码,再处理.aspx页面中的代码。这种过程被成为代码分离。 ...

    数据库课程设计(5).doc

    要 " "求学生提交的报告包含: " "需求说明书 " "概念数据模型(E-R数据模型) " "逻辑数据模型(含关系规范化) " "物理数据模型(含约束、视图、触发器、存储过程、安全设计、恢复方案、事务设计 " "等等)要求:...

    H5智能内核-基于MVC架构的全新Zoomla!逐浪CMS2 x3.8发布

    业务层(模型逻辑) 显示层(视图逻辑) 输入控制(控制器逻辑) Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。 通常模型对象负责在数据库中存取数据。 View(视图)是应用程序中处理数据显示的...

    ASP3《高级编程》(第一部分)

    本书第1~7章介绍了ASP的基础知识、ASP 3.0的变化、ASP的对象模型、使用ASP脚本和外部组件的所要求的基本概念。第8~12章介绍了通用数据的访问和连接问题,包括ADO、UDA和XML。第13~18章介绍了使用ASP建立组件的问题,...

    ASP3《高级编程》(第二部分)

    本书第1~7章介绍了ASP的基础知识、ASP 3.0的变化、ASP的对象模型、使用ASP脚本和外部组件的所要求的基本概念。第8~12章介绍了通用数据的访问和连接问题,包括ADO、UDA和XML。第13~18章介绍了使用ASP建立组件的问题,...

    软件工程知识点

    增量模型结合了瀑布模型与原型进化模型的优点。在整体上按照瀑布模型的流程实施开发,以方便对项目的管理。但在软件的实际创建中,则将软件系统按功能分解为许多增量构件逐个地创建与交付,直到全部构件创建完毕,并...

    Visual C++实践与提高-COM和COM+篇『PDF』

    7.4 位于业务逻辑层的代码组件 7.4.1 ADO对象模型和基本编程模型 7.4.2 在Visual C++中使用ADO 7.4.2.1 使用#import指令 7.4.2.2 利用ClassWizard加载ADO对象类 7.4.2.3 通过COM API使用ADO 7.4.3 创建使用ADO的...

    Grails 中文参考手册

    5.2 在GORM中进行领域建模 5.2.1 GORM中的关联 5.2.1.1 一对一 5.2.1.2 一对多 5.2.1.3 多对多 5.2.2 GORM的组合 5.2.3 GORM的继承 5.2.4 集合、列表和映射 5.3 持久化基础 5.3.1 保存和更新 5.3.2 删除对象 5.3.3 ...

    asp.net知识库

    服务器自定义开发二之客户端脚本回发 Web开发: 使用URL重写WEB主题切换 如何在Asp.Net1.1中实现页面模板(所谓的MasterPage技术) Tool Tip 示例(FILTER版) Tool Tip示例 (htc版) 一个.net发送HTTP数据实体的类 ...

    《软件工程导论》张海潘_第五版_清华_课后答案

    10.1.2 3个子模型与5个层次232 10.2 需求陈述233 10.2.1 书写要点233 10.2.2 例子234 10.3 建立对象模型235 10.3.1 确定类与对象236 10.3.2 确定关联238 10.3.3 划分主题241 10.3.4 确定属性241 10.3.5 识别继承关系...

    蓝焰设计站图文管理系统

    数据层是通过ADO.NET操纵数据为事务逻辑层提供数据服务,如存储数据操作结果、返回数据检索结果等。 1.2 ADO.NET访问数据库的原理 与数据库相连,ADO.NET提供了如下3种方式:通过ODBC相连;通过OLEDB相连;直接与SQL...

    高级软件架构师复习提纲

    隔离了UI与业务逻辑层/对流程中的UI进行了管理/提供了状态保存和传递的机制 17、关于功能规格说明书的说法,正确的是:功能规格说明书描述了要构造的解决方案的功能,包含设计成果/创建功能规格说明书是一个逐步...

Global site tag (gtag.js) - Google Analytics