小研究 - 领域驱动设计DDD在IT企业内部网站开发中的运用(一)

news2024/9/25 7:16:15

在企业内部网站的建设过程中,网站后端最初采用传统的表模式的开发方式。这种方式极易导致站点的核心业务逻辑和业务规则分布在架构的各个层和对象中,这使得系统业务逻辑的复用性不高。为了解决这个问题,作者在后期的开发过程中引入了领域驱动设计的开发方式,把系统的业务逻辑独立建模、充分地复用,并基于这些模型打造易于扩展的开发框架,提高了整个团队开发业务逻辑的效率,最终网站如期上线,稳定运行至今。

目录

1 软件开发的三种模式

1.1 事务脚本

1.2 表模式

1.3 领域驱动设计模式


数字化是每个IT企业系统建设必不可少的一个环节,而企业内部网站往往也是数字化的重要标志和组成部分。企业内部站点建设项目就是在这种场景下诞生的,主要就是为顺利开展研发部门的日常工作,提供所需的管理各项流程制度的功能。

在项目的开始阶段,作者在研发方式上选择了常见的表模式来开发网站后端,在架构上选用了传统的多层架构来组织代码。这种技术选型和搭配常用于开发业务逻辑比较简单的小型项目,整个开发的过程都聚焦在具体的数据库设计和面向流程的开发上,对于团队成员来说简单易于上手。

不过,当网站的功能逐渐增多以后,系统的复杂度迅速攀升,采用这种搭配使得系统的业务逻辑得不到聚焦,最终它们零散地分布在架构的各个层和对象中,业务逻辑的复用性很差。

为了解决这个问题,作者引入了领域驱动设计的开发方式。这种开发方式聚焦于多变的业务逻辑,把它们作为系统开发的核心模型管理起来,这样就使得系统的业务逻辑得到了充分的复用,整个团队开发的效率就得到了显著的提高。

1 软件开发的三种模式

在软件开发中,根据研发过程的不同,一般把开发流程分为事务脚本、表模式和领域驱动设计三种模式。

1.1 事务脚本

1) 模式介绍
时至今日,虽然主流编程语言都是面向对象语言,但是很多团队都是采用面向过程的开发模式,代码中使用的对象并没有实际的意义,纯粹只是代码脚本的载体。

事务脚本(Transaction Script) 就是这样一种简单的开发模式,它完全采用的是面向过程的做法,直接将用户在表现层上所做的操作翻译成代码脚本(比如SQL语句、批处理语句等) 执行的模式。

2) 实现方式
通常,实现事务脚本模式不会进行对象设计,也不会对涉及的组件进行分层,所有从表现层到底层的操作全部放到一起。

典型的例子就比如展示图书列表的页面,开发的时候通常就是在界面上放置一个列表控件,然后该控件直接绑定从数据库中获取图书的SQL语句进行数据填充。增加和修改图书的时候也是类似,直接提供SQL语句操作数据库。

当然,为了使整个程序的结构更加清晰,在使用事务脚本模式时,很多团队也会进行简单的分层,这就是基本的多层架构的由来,也就是把应用分为如图1所示的三层。

在分层架构下,应用把整个业务流程分割并组织在不同的层级中,与用户直接交互的组件放在表现层中,用户在表现层的操作会被翻译成系统的输入数据模型并进入业务逻辑层,业务逻辑层再调用底层的数据访问层的脚本操作数据库、文件系统等数据源,完成业务逻辑。

在这个过程中,系统设计的重点依然是面向过程的,各个层和对象只是过程的载体,具体叫什么其实并没有什么太大的区别。

3) 应用场景
事务脚本是一种常用的开发模式,针对那些交互逻辑简单,业务模式几乎不会改变和发展的简单场景,比如常见的“增删改查型”应用,整个开发过程的效率会非常高。

1.2 表模式

1) 模式介绍
在研发过程中,数据库作为最重要的数据载体,在任何一个项目的开发过程中几乎是必然会出现的。在事务脚本中,与数据库交互基本都是通过在代码中直接使用 SQL 语句来完成的。

在常见的编程语言中,SQL语句都是作为字符串存在的,这就带来一个问题,由于字符串的内容不参与编译,所以如果SQL语句存在语法问题,那就只能到了应用运行时产生错误才会被发现,编译时发现不了,这有时会带来潜在的发布风险。

为了优化操作数据库的体验,提高代码编写的效率,在数据访问层,经过工程师们不断地尝试和努力,就出现了一种全新的数据交互方式,这就是通过编程语言中的实体对象来操作数据库中的数据。

2) 实现方式
以表模式为例,从具体实践上来说,它们是在事务脚本的基础上,把脚本操作变成了对象的操作。这个过程一般是通过特定的框架来完成的,这种框架一般被称为“对象关系映射(Object Relational Mapping,以下简称ORM) ”。ORM框架把关系数据库中的结构映射成语言中的实体对象,当调用实体的方法的时候,ORM框架就会将对象操作翻译成SQL语句,然后作用于数据库,如图2所示。

3) 应用场景
表模式优化了数据库访问的体验,但是并不涉及任何业务逻辑的处理,所以表模式和事务脚本一样,都非常适合那些业务逻辑简单的场景,对于较为复杂的应用场景则不太合适。

1.3 领域驱动设计模式

1) 模式介绍
事务脚本和表模式两种开发模式,主要采用的是面向过程的编程方法,而且在应用开发的过程中,需求分析和系统设计大都是分离的,这样就把应用开发前期的工作割裂开来,这也就导致了需求分析的结果与系统设计的代码不能完全匹配,以至于软件上线后,客户才发现许多功能不是自己想要的。不同于这两种模式,领域驱动设计(Domain Driven Design,以下简称DDD) 开发模式是纯粹的面向对象的设计过程,它以业务领域为核心,分析领域中的问题,通过设计和建立对应的“领域模型(对象) ”来有效的解决领域中的核心问题。

2) 实现方式
DDD是一种设计思路,为了实现聚焦业务逻辑,构建领域模型的目的,具体实施时一般分为战略设计和战术设计两个阶段。

战略设计阶段主要完成的工作是识别应用的领域,将领域细化得到子域,为每个子域设计限界上下文,并在这个过程中,通过与业务专家的充分讨论,得到描述业务的统一语言。战术设计阶段完的工作是根据限界上下文和统一语言,设计领域层中的领域模型对象,具体包括实体、值对象、领域事件、仓储、聚合和领域服务等(具体概念和细节可以参见文献) 。

DDD的具体实现也存在多种形式,本次网站的实践采用的就是经典的DDD的分层架构,整体架构图如图3所示。

表现层与以往的架构相同,主要是与用户交互的界面元素。

应用服务层是薄薄的一层,主要是把用户的输入转换成系统需要的数据模型和把系统生成的数据模型转化成表现层需要的对象模型,需要注意的是应用服务层主要完成转换和交接工作,调用基础设施完成一些诸如持久化的工作,千万不能实现任何的业务逻辑。

领域层是整个系统的核心层,它包含所有的领域模型。这些领域模型承载和实现了所有的业务逻辑和业务规则,所有的其他层都依赖于领域层,但是领域层不会依赖于任何其他层。基础设施层完成了的一些辅助的功能,比如一些第三方类库、具体的持久化实现如ORM等。

3) 应用场景
DDD开发模式特别适用于那些业务场景比较复杂、业务逻辑变化比较频繁、系统复杂度比较高的场景,典型的就比如中台系统的搭建、微服务的开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/833193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ad+硬件每日学习十个知识点(18)23.7.29 (LDO原理、LDO的补偿引脚)

文章目录 1.LDO名字介绍2.LDO的应用范围3.LDO的原理4.LDO输出端和输入端的差值至少满足多少V?怎么计算的?5.输出的误差和输出电流👆(右下角图像)6.LDO一般会有个引脚是做补偿之用,datasheet会说明一个器件的…

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性: 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大,Kubernetes 可以负…

2023华数杯数学建模竞赛选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;隔热材料的结构优化控制研究 A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。 其中第一问需要建立平纹织物整体热导率与单根纤…

知识区博主转型——兼做知识区和改造区博主!!!!!

想脱单的进来&#xff0c;一起交流如何能脱单&#xff01;&#xff01;&#xff01; 为什么——我太羡慕有对象的人了哭死&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 你是不是很羡慕别人怎么都有女朋友 别人家的女朋友怎么都那么好&#xff…

用户权限管理是保证企业图文档安全最有效的策略

企业拥有大量的图文档数据&#xff0c;涉及多个部门和员工&#xff0c;因此需要建立有效的用户权限管理策略&#xff0c;以保护图文档的安全。智橙平台将在线图文档管理与BOM系统的融合应用为企业提供了强大的权限管理功能&#xff0c;能够确保只有授权用户能够访问和编辑特定的…

【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基础介绍应用场景登场角色 案例实现案例一实现 案例二实现 迭代器模式在JDK源码中的应用总结文章说明 案例引入 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一…

小白如何获取CNVD事件型原创漏洞证明?——记CNVD漏洞挖掘思路

引子: 相信许多人都想要被别人叫做大佬&#xff0c;漏洞挖掘当中肯定也不例外,所以在此之前让我们康康度娘对大佬的定义:形容一个人很巨表示对其顶礼膜拜的态度。在这种情况下&#xff0c; 国家信息安全漏洞共享平台(CNVD) 则为我们提供了一个成为大佬的平台, CNVD作为国内最具…

【javaSE】 实现图书管理系统

目录 整体思路 Book包 Book类 BookList类 user包 User类 NormalUser类 AdminUser管理员类 testmain包 opera包 IOPeration接口 普通用户 ExitOperation类 FindOperation类 BrrowOperation类 ReturnOperation类 管理员 AddOperation类 DelOperation类 ShowOp…

小白科普-通信网中核心网、城域网、接入网

通信网络的一个整体结构&#xff0c;大致包括&#xff1a;骨干网、核心网、城域网、接入网&#xff0c;其中接入网又分为无线接入和有线接入&#xff0c;以及承载网。 听起来很复杂&#xff0c;我们再分解来看看。 从最靠近用户端开始的是接入网。接入网&#xff0c;简单点来…

迁移学习(新人必看)

先说一下深度学习常见的问题&#xff1a; 1.数据集不够&#xff0c;通常用数据增强解决。 2.参数难以确定&#xff0c;训练时间长&#xff0c;这就需要用迁移学习来解决 什么叫迁移学习呢&#xff1a;比方说有一个对100w的自行车数据集&#xff0c;并用VGG模型训练好的网络&…

【前端】网页

1 网页的相关概念 1.1什么是网页 网站 &#xff1a;是网页的集合 网页 &#xff1a;通常是HTML格式的文件&#xff0c;通过浏览器来阅读 网页是构成网站的基本要素&#xff0c;它通常由图片、链接、文字、声音、视频等元素组成。通常我们看到的网页&#xff0c;常见以.htm或…

【人工智能】PyTorch安装

文章目录 前言一、环境版本二、开始安装CPU版本安装&#xff08;GPU版本在下面-可以直接跳过&#xff09;GPU版本安装CUDA 下载安装cudnn 下载安装 总结 前言 PyTorch是一种开源深度学习框架&#xff0c;它由Facebook AI Research&#xff08;FAIR&#xff09;团队开发并维护。…

计划管理与项目管理:有何区别?

简而言之&#xff0c;是的。尽管它们经常互换使用并对全局产生影响&#xff0c;但它们是完全不同的。 在本文中&#xff0c;我们将了解计划和项目管理之间的差异&#xff0c;提供每个示例&#xff0c;并向您展示如何使计划和项目管理工作更有效地实现您的业务目标。 计划管理与…

2023华数杯数学建模C题思路分析 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…

Spring事务传播机制、实现方式、失效场景即原理

贴一篇源码分析的好文章&#xff1a;https://blog.csdn.net/qq_30905661/article/details/114400417 本质&#xff1a; 一个事务对应一个数据库连接。 通过 this 来调用某个带有 Transactional 注解的方法时&#xff0c;这个注解是失效的&#xff0c;可以看做这个方法&#x…

Windows下安装Zookeeper(图文记录详细步骤,手把手包安装成功)

Windows下安装Zookeeper 一、下载Zookeeper安装包1.1、官网下载Zookeeper1.2、网盘下载Zookeeper 二、解压Zookeeper安装包到指定目录三、Zookeeper安装目录下创建文件夹四、进入config目录五、复制zoo_sample.cfg文件&#xff0c;改名为zoo.cfg六、修改配置文件 zoo.cfg七、添…

Nodejs的fs模块的基础应用

fs模块是Node.js中内置的用于文件系统操作的模块&#xff0c;它提供了各种方法和函数&#xff0c;用于处理文件和目录。 目录 1.写入文件 2.讲讲同步和异步 3.追加写入 4.读取文件 5.文件重命名及文件移动 6.文件删除 7.文件夹的操作 1.写入文件 普通的写入方法&#x…

智能制造企业如何建立大客户管理模型?

01、大客户管理依然是智能制造企业经营的黄金定律 《连线》杂志创始人凯文凯利&#xff08;Kevin Kelly&#xff09;在《技术元素》一书中写道&#xff1a;“数量不是目的&#xff0c;质量才是根本&#xff0c;重视1%的超级用户才是提高效率的关键。” 根据“二八定律”&…

Arduino驱动MQ4模拟甲烷气体传感器(气体传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 MQ4气体传感器,可以很灵敏的检测到空气中的甲烷、天然气等气体,但是对乙醇和烟雾的灵敏度很低。与Arduino结合使用,可以制作火灾甲烷、天然气泄露报警等相关的作品。 1、传感器特性 MQ4对不同种类、不同浓度的气体有不同的…

SystemVerilog数组参数传递及引用方法总结

一、将常数数组传递给task/function 如下面的程序&#xff0c;将一个常数数组传递给function module my_array_test();function array_test(int array[4]);foreach(array[i]) begin$display("array[%0d] %0d", i, array[i]);endendfunctioninitial beginarray_tes…