当前位置: 首页 > news >正文

《企业应用架构模式》笔记

领域逻辑

表模块和数据集一起工作->
先查询出一个记录集,再根据数据集生成一个(如合同)对象,然后调用合同对象的方法
这看起来很想service查询出一个对象,但调用的是对象的方法,这看起来像是充血模型,如果getter和setter也算,那贫血模型才算,不然我们是调用service的方法。当然,service是把充血模型拆出来了。说到底这个时候查询的方法反而不像是在整个领域模型中了
那如果我们灵活些,把出了查询的mapper以外的部分当作,额,,是不是就是表模块这种组织形式了呢?

表模块是事务脚本和领域模型的一个中间地带。它围绕表而非直接围绕过程来组织领域逻辑,提供了更多的结构,而且更容易发现和移除冗余代码。
同领域模型相比,你无法应用许多在领域模型中可以使用的组织细粒度逻辑结构的技术,例如继承承、策略和其他面向对象的设计模式。
面向对象的好处是将程序结构化吗
表模块最大的优势在于与双层架构的已有代码的衔接。
双层架构、GUI程序通常设计成与sql返回的记录集工作,而表模块也再记录集之上工作。
加了记录集就成三层了。相当于重构了
许多平台都使用这种开发网格,尤其是微软的COM和.NET
在这里插入图片描述
书中并没有讨论什么是领域逻辑的复杂度,,为什么银行业务甚至直接用存储过程就可以?那种是不复杂的业务逻辑吗?企业应用经常修改算是复杂的业务逻辑吗?一个事件牵扯一堆事件,且经常修改算是吗?

数据源层

数据源层的作用是与应用需要的基础设施的不同部分进行通信。
对web开发者而言,在数据层可以编写和数据库通信的相关代码已经是很常见的应用场景了。但这里应当注意到,数据源可以是任何数据来源,比如其他系统(如调用微服务接口)
关系数据库之所以取得成功,最重要的原因之一就是SQL的存在,它是数据库通信标准语言。

从3.1的第二段(解释为什么将sql放在单独的类中)来看,似乎当时后端程序猿和DBA并没有混为一谈,程序员不一定擅长sql,DBA则不接触代码(文中提到他们希望能得到访问数据库的sql,我猜测他们只是负责管理数据库、建立库表之类的?)
不管怎么说,对于现在的开发者而言,单独一层管理sql也是个方便的选择。

行数据入口

查询语句的每一行产生一个实例。用面向对象的方式看待数据
查询出的一行不一定是一个表的吧?也不一定是一个领域

PersonGateway
- lastname : String
- firstname : String
- numberOtDependents : Integer
+insert()
+update()
+delete()
+find(id : String)
+findForCompany(companyID : String)

表数据入口 返回记录集

对数据库中的每个表,仅仅需要一个对象来管理。
记录集是一种通用数据结构?
GUI工具通常使用记录集

PersonGateway
+find(id : String)
+findWithLastName(lastName : String)
+update(id : String, lastName : String, firstName : String, numberOfDependents : Integer)
+insert(lastName : String, firstName : String, numberOfDependants : Integer)
+delete(id : String)

表数据入口与记录集非常匹配,这使得它们成为使用表模块的当然选择。它也是一个组织存储过程的模式。

活动记录?

  • 在一片博客中,称Active Record and Data Mapper 是ORM的两种流行的实现。

领域和数据库表一一对应?这几把讲的都是啥,下面的数据映射器?
从另一个角度来考虑活动记录,就是从行数据入口开始,然后把领域逻辑加入到类中,特别是在从多个事务脚本中发现了重复代码的时候。

Customer
+load(resultSet : ResultSet)
+delete()
+insert()
+update()
+checkCredit()
+sendBills()

数据映射器

一种更好的办法是把领域模型和数据库完金独立,可以让间接层完成领域对象和数据库表之间的映射。这个数据映射器(见图3-4)处理数据库和领域模型之间所有的存取操作,并且允许双方都能独立变化。这是数据库映射架构中最复杂的架构,但它的好处是把两个层完全独立了。

遇事不决加一层是吧.还最复杂的架构,您前面那也配叫数据库映射架构?好吧好吧,就当他们是吧
独立变化?哦哦哦我明白了,内存改完不同步数据库,直到调用方法?看来前面的并没有getter setter这种情况了,前面的都是做某种操作的时候直接update之类来代替getter/setter?

简单的逻辑用活动记录也行,复杂的用数据映射器.其实就是加了一层
即使用数据映射器作为首选持久化机制,还是可以使用数据入口来封装被视为外部接口的表或者服务。

说到最后主要还是领域模型难以持久化。看起来领域和实体实际上不是什么很匹配的概念。可能本来就是一个强调解耦,一个强调关系吧
作者推崇面向对象数据库。然后是数据映射器。我不太理解都买的商业OR工具有什么
还有一种面向对象数据库风格的逻辑层,如JDO

行为问题

工作单元:又加了一层控制何时加载对象
领域模型关联对象:延迟加载避免一次加载一批

3.3 读取数据

查找器方法
设计经验:
读取冗余行也可以,一次读很多行效率大于读很少的几行
join一次读取多个表可能比多次读取表更快?当然MF也说了一次查询最多三到四次join
读到这一段,下面说 设计一个入口获得相联结的表数据,或者通过一个数据映射器用一次调用加载多个领域对象。,可能数据映射器,,额,,还有上面的工作单元中间层,,是指,内存中对象保存的数据类似于缓存层?直接操作对象来改变其对应的数据库数据?这样一来,set方法可能其实就类似update,但是直接set到数据库里;工作单元相当于缓存策略里面的有中间manager管理的;
毕竟这个时候MF提出的领域模型的概念似乎还没有和javabean融合,没有getter一说。

3.4 结构映射模式

对象-关系映射的结构映射模式
表数据入口通常不需要;
行数据入口和活动记录可能会需要一些模式;
数据映射器需要全部模式。

对象和表处理“连接”关系的方法是相反的
这是范畴论的连接吗
一对多关系为例,对象可以保存多个其他对象的引用列表,数据库则是由多的一方保存1的一方的主键。

新出现的名词:外键映射,标识映射,依赖映射。
可能是指关系型数据库吧。因为下面又提到了多对多关系用的关联表映射。
还是没搞懂标识域是什么?一个成员变量,保存外键,而不是用引用?

继承

单表继承
具体表继承
类表继承

单表继承:一个层次中的所有类建立一个表。
说的这么玄乎,结果就是一个大表把所有父类和子类的属性都放上啊。“层次”指的是从父类和它的子类啊,咱对层次的理解是不是有些偏颇?

Player
+ name : String
Footballer
+ club
Cricketer
+ battingAverage : Float
Bowler
+ bowlingAverage : Float

类表继承是类和表之间最简单的关系,但是它需要多个连接(join)操作来载人一个对象,这样通常损失了性能。
具体表继承避免了连接操作,允许从一个表中取得一个对象,但是改变起来比较困难。对超类的任何改变都不得不改变所有的表(还有映射代码)。改变层次结构自身会带来更大的改变。缺乏超类表也能使主键管理十分可怕,引用完整性也有问题,尽管它能减少超类表中的锁争夺。
而在某些数据库中,单表继承最大的弊端是浪费了空间,因为每一行都必须为每种可能的子类保留一些列,这就导致很多空列。然而,许多数据库都能很好地压缩浪费的表空间。单表继承的另一个问题在于它的大小将成为访问的瓶颈。它最大的好处是把所有的内容都放到一起,这样修改起来很容易并目避免了连接操作。
我们可以混合操作,比如一些字段放在大表里,一些作为附加字段。但这样设计十分复杂。
我们的实践中还有一种方法是放数据库的一列json中

映射到数据库

数据库方案是什么?是指“是否已经建立好了表”吗?

也许应该关注下ORM思想的诞生,这一层次
这本书还有个缺点,参考书目在电子版全都没有显示出来,,

web表现层

输入控制器:MVC中的控制器
看来model下面还有数据源层
两种模式:

  • 页面控制器,为每个页面准备一个控制器
  • 为每一种动作准备一个控制器

分布策略

本地的过程调用非常快
本地接口细粒度,方便拓展(有些像贫血模型)
远程接口粗粒度,一次做很多事情,减少调用次数

分布模型:CORBA

因此MF认为不要分布使用对象,而是用集群系统,在一个cpu部署所有对象并在其他节点部署他们

相关文章:

《企业应用架构模式》笔记

领域逻辑 表模块和数据集一起工作-> 先查询出一个记录集,再根据数据集生成一个(如合同)对象,然后调用合同对象的方法。 这看起来很想service查询出一个对象,但调用的是对象的方法,这看起来像是充血模型…...

深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile

深入理解 C 语言函数指针的高级用法 函数指针是 C 语言中极具威力的特性,广泛用于实现回调、动态函数调用以及灵活的程序设计。然而,复杂的函数指针声明常常让即使是有经验的开发者也感到困惑。本文将从函数指针的基本概念出发,逐步解析复杂…...

【JavaSE】图书管理系统

前言:为了巩固之前学习的java知识点,我们用之前学习的java知识点(方法,数组,类和对象,封装,继承,多态,抽象类,接口)来实现一个简单的图书管理系统…...

【C++数论】880. 索引处的解码字符串|2010

本文涉及知识点 数论:质数、最大公约数、菲蜀定理 LeetCode880. 索引处的解码字符串 给定一个编码字符串 s 。请你找出 解码字符串 并将其写入磁带。解码时,从编码字符串中 每次读取一个字符 ,并采取以下步骤: 如果所读的字符是…...

C++/stack_queue

目录 1.stack 1.1stack的介绍 1.2stack的使用 练习题: 1.3stack的模拟实现 2.queue的介绍和使用 2.1queue的介绍 2.2queue的使用 2.3queue的模拟实现 3.priority_queue的介绍和使用 3.1priority_queue的介绍 3.2priority_queue的使用 欢迎 1.stack 1.1stack…...

浅谈APP之历史股票通过echarts绘图

浅谈APP之历史股票通过echarts绘图 需求描述 今天我们需要做一个简单的历史股票收盘价格通过echarts进行绘图,效果如下: 业务实现 代码框架 代码框架如下: . 依赖包下载 我们通过网站下载自己需要的涉及的图标,勾选之后进…...

Ubuntu 20.04 x64下 编译安装ffmpeg

试验的ffmpeg版本 4.1.3 本文使用的config命令 ./configure --prefixhost --enable-shared --disable-static --disable-doc --enable-postproc --enable-gpl --enable-swscale --enable-nonfree --enable-libfdk-aac --enable-decoderh264 --enable-libx265 --enable-libx…...

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…...

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…...

三星手机人脸识别解锁需要点击一下电源键,能够不用点击直接解锁吗

三星手机的人脸识别解锁功能默认需要滑动或点击屏幕来解锁。这是为了增强安全性,防止误解锁的情况。如果希望在检测到人脸后直接进入主界面,可以通过以下设置调整: 打开设置: 进入三星手机的【设置】应用。 进入生物识别和安全&a…...

Frida使用指南(三)- Frida-Native-Hook

1.Process、Module、Memory基础 1.Process Process 对象代表当前被Hook的进程,能获取进程的信息,枚举模块,枚举范围等 2.Module Module 对象代表一个加载到进程的模块(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件), 能查询模块的信息,如模块的基址、名…...

网络安全 | F5-Attack Signatures-Set详解

关注:CodingTechWork 创建和分配攻击签名集 可以通过两种方式创建攻击签名集:使用过滤器或手动选择要包含的签名。  基于过滤器的签名集仅基于在签名过滤器中定义的标准。基于过滤器的签名集的优点在于,可以专注于定义用户感兴趣的攻击签名…...

004 mybatis基础应用之全局配置文件

文章目录 配置内容properties标签typeAlias标签mappers标签 配置内容 SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler…...

【岛屿个数——BFS / DFS,“外海”】

题目 推荐阅读 AcWing 4959. 岛屿个数&#xff08;两种解法&#xff0c;通俗解释&#xff09; - AcWing 1.岛屿个数 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second int dx4[4] {-1, 0, 1, 0}, dy4[4] …...

MySQL常用数据类型和表的操作

文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数&#xff0c;取值范围为1~64,若…...

2025_1_27 C语言内存,递归,汉诺塔问题

1.c程序在内存中的布局 代码段&#xff08;Code Segment&#xff09; 位置&#xff1a;通常位于内存的最低地址。 用途&#xff1a;存储程序的可执行指令。 特点&#xff1a;只读&#xff0c;防止程序运行时被修改。数据段&#xff08;Data Segment&#xff09; 位置&#xf…...

开源音乐管理软件Melody

本文软件由网友 heqiusheng 推荐。不过好像已经是一年前了 &#x1f602; 简介 什么是 Melody &#xff1f; Melody 是你的音乐精灵&#xff0c;旨在帮助你更好地管理音乐。目前的主要能力是帮助你将喜欢的歌曲或者音频上传到音乐平台的云盘。 主要功能包括&#xff1a; 歌曲…...

Nginx开发01:基础配置

一、下载和启动 1.下载、使用命令行启动&#xff1a;Web开发&#xff1a;web服务器-Nginx的基础介绍&#xff08;含AI文稿&#xff09;_nginx作为web服务器,可以承担哪些基本任务-CSDN博客 注意&#xff1a;我配置的端口是81 2.测试连接是否正常 访问Welcome to nginx! 如果…...

【TCP 协议】确认应答机制 超时重传 三次握手 四次挥手

TCP报文首部 确认应答机制 TCP 是可靠的&#xff0c;指的是它能够确保数据从源端准确无误地传输到目的端。 当客户端和服务器通信时&#xff0c;客户端向服务器发送报文&#xff0c;那么&#xff0c;客户端怎么知道服务器已经收到报文了呢&#xff1f; 服务器收到客户端发的报…...

jenkins-k8s pod方式动态生成slave节点

一. 简述&#xff1a; 使用 Jenkins 和 Kubernetes (k8s) 动态生成 Slave 节点是一种高效且灵活的方式来管理 CI/CD 流水线。通过这种方式&#xff0c;Jenkins 可以根据需要在 Kubernetes 集群中创建和销毁 Pod 来执行任务&#xff0c;从而充分利用集群资源并实现更好的隔离性…...

基于vue和elementui的简易课表

本文参考基于vue和elementui的课程表_vue实现类似课程表的周会议列表-CSDN博客&#xff0c;原程序在vue3.5.13版本下不能运行&#xff0c;修改两处&#xff1a; 1&#xff09;slot-cope改为v-slot 2&#xff09;return background-color:rgb(24 144 255 / 80%);color: #fff; …...

可用的IPv6公共DNS(2025年1月更新)

境内IPv6 DNS&#xff1a; 1. 腾讯DNS&#xff1a;2402:4e00:: 2. 阿里DNS&#xff1a;2400:3200::1、2400:3200:baba::1 3. ISP&#xff08;电信服务运营商&#xff09;的IPv6 DNS&#xff0c;请以各ISP实际下发的为准&#xff0c;或拨打10000、10010、10086等号码询问人工…...

c高级复习

c高级复习...

电子信息工程专业主要研究哪一方面东西?

序言&#xff1a; 如今科技发展那叫一个迅猛&#xff0c;电子信息专业可是站在这股浪潮的 C 位&#xff0c;狠狠推动着社会向前跑。这专业就像一座神奇桥梁&#xff0c;把虚拟数字和现实生活紧紧相连&#xff0c;把那些信号变成咱们看到的画面、听到的声音。你看&#xff0c;从…...

RU 19.26安装(手工安装各个补丁)

使用手工方式打RU19.26 参考文档&#xff1a; Supplemental Readme - Grid Infrastructure Release Update 12.2.0.1.x / 18c /19c (Doc ID 2246888.1) 操作步骤&#xff1a; 1 Stop the CRS managed resources running from DB homes. 2 Run the pre root script. 3 Patch GI…...

深入理解Pytest中的Setup和Teardown

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 对于简单程序而言&#xff0c;使用 Pytest 运行测试直截了当。然而&#xff0c;当你…...

如何利用AI工具来进行数据分析

利用AI工具进行数据分析可以显著提高效率和准确性&#xff0c;以下是详细步骤和方法&#xff1a; 1. 明确分析目标 在开始数据分析之前&#xff0c;首先需要明确分析的目标和问题。这包括确定需要解决的问题、期望的见解或结果&#xff0c;以及选择合适的AI工具和方法。 2. …...

具身智能体俯视全局的导航策略!TopV-Nav: 解锁多模态语言模型在零样本目标导航中的顶视空间推理潜力

作者&#xff1a;Linqing Zhong, Chen Gao, Zihan Ding, Yue Liao, Si Liu 单位&#xff1a;北京航空航天大学&#xff0c;新加坡国立大学&#xff0c;香港中文大学多模态实验室 论文标题&#xff1a;TopV-Nav: Unlocking the Top-View Spatial Reasoning Potential of MLLM …...

npm:升级自身时报错:EBADENGINE

具体报错信息如下&#xff1a; 1.原因分析 npm和当前的node版本不兼容。 // 当前实际版本: Actual: {"npm":"10.2.4","node":"v20.11.0"}可以通过官网文档查看与自己 node 版本 兼容的是哪一版本的npm&#xff0c;相对应进行更新即可…...

微信小程序实现自定义日历功能

文章目录 1. 创建日历组件实现步骤&#xff1a;2. 代码实现过程3. 实现效果图4. 关于作者其它项目视频教程介绍 1. 创建日历组件实现步骤&#xff1a; 创建日历组件&#xff1a;首先&#xff0c;你需要创建一个日历组件&#xff0c;包含显示日期的逻辑。样式设计&#xff1a;为…...