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

领域逻辑

表模块和数据集一起工作->
先查询出一个记录集,再根据数据集生成一个(如合同)对象,然后调用合同对象的方法
这看起来很想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部署所有对象并在其他节点部署他们

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《剪映5.9官方安装包》免费自动生成字幕

(避免失效建议存自己网盘后下载)剪映5.9官方Win.Mac 链接:https://pan.xunlei.com/s/VOHc-Fg2XRlD50MueEaOOeW1A1?pwdawtt# 官方唯一的免费版,Win和Mac都有,此版本官方已下架,觉得有用可转存收藏&#xf…

基于RIP的MGRE VPN综合实验

实验拓扑 实验需求 1、R5为ISP,只能进行IP地址配置,其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证,R5为主认证方; R2与R5之间使用ppp的CHAP认证,R5为主认证方; R3与R5之间使用HDLC封…

006 mybatis关联查询(一对一、一对多)

文章目录 一对一查询SQL语句方法一:resultType方法二:resultMap创建扩展po类Mapper映射文件Mapper接口测试代码小结 一对多查询SQL语句修改po类Mapper映射文件Mapper接口测试代码 注意:因为一个订单信息只会是一个人下的订单,所以…

RKNN_C++版本-YOLOV5

1.背景 为了实现低延时,所以开始看看C版本的rknn的使用,确实有不足的地方,请指正(代码借鉴了rk官方的仓库文件)。 2.基本的操作流程 1.读取模型初始化 // 设置基本信息 // 在postprocess.h文件中定义,详见…

消息队列篇--通信协议篇--网络通信模型(OSI7层参考模型,TCP/IP分层模型)

一、OSI参考模型(Open Systems Interconnection Model) OSI参考模型是一个用于描述和标准化网络通信功能的七层框架。它由国际标准化组织(ISO)提出,旨在为不同的网络设备和协议提供一个通用的语言和结构,以…

【creo】CREO配置快捷键方式和默认单位

了解CREO工作目录设置 设置快捷方式启动目录,就能自动加载其中的配置。 一、通过键盘快捷方式 保存配置 creo_parametric_customization.ui 文件: 二、通过映射键录制 通过这种方式可以监听鼠标的点击事件。使用键盘快捷方式无法找到需要的动作时候可…

多模态论文笔记——TECO

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文TECO(Temporally Consistent Transformer),即时间一致变换器,是一种用于视频生成的创新模型&…

自由学习记录(32)

文件里找到切换颜色空间 fgui中的 颜色空间是一种总体使用前的设定 颜色空间,和半透明混合产生的效果有差异,这种问题一般可以产生联系 动效就是在fgui里可以编辑好,然后在unity中也准备了对应的调用手段,可以详细的使用每一个具…

【教学类-99-01】20250127 蛇年红包(WORD模版)

祈愿在2025蛇年里, 伟大的祖国风调雨顺、国泰民安、每个人齐心协力,共同经历这百年未有之大变局时代(国际政治、AI技术……) 祝福亲友同事孩子们平安健康(安全、安全、安全)、巳巳如意! 背景需…

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸,耻辱,不光彩,名誉扫地”一类的含义,可做名词或动词使用,含义基本一致,只是词性不同。 disgrace n.丢脸;耻辱;不光彩;令人感到羞耻的人(或…

基于RIP的MGRE实验

实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议,搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…

hot100_24. 两两交换链表中的节点

hot100_24. 两两交换链表中的节点 思路1思路2 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入&…

舆情系统的情报搜索功能

引言 随着信息技术的发展和网络媒体的快速发展,舆情监测已成为各行各业不可或缺的工具。舆情系统中的情报搜索功能,作为其核心组成部分,能够帮助用户迅速、全面地捕捉互联网、社交平台、新闻媒体等渠道中的各类信息和舆论动态。情报搜索不仅提…

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…

进程间通信

进程间通信 进程间通信介绍 进程间通信⽬的 数据传输:⼀个进程需要将它的数据发送给另⼀个进程 资源共享:多个进程之间共享同样的资源。 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们&#xff09…

O(1) 时间插入、删除和获取随机元素

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! 为了实现 RandomizedSet 类,并且保证每个函数的平均时间复杂度为0(1) ,我们可以结合使用数组和哈希表。数组用于存储集合中的元素&am…

Nxopen 直齿轮参数化设计

NXUG1953 Visualstudio 2019 参考论文&#xff1a; A Method for Determining the AGMA Tooth Form Factor from Equations for the Generated Tooth Root Fillet //FullGear// Mandatory UF Includes #include <uf.h> #include <uf_object_types.h>// Internal I…

基于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; …

Unreal Engine 5 C++ Advanced Action RPG 十一章笔记

第十一章 In Game Widgets 本章节就是做UI2-Template Button Widget 这章节创建不同的UI 结束UI胜利UI暂停菜单主菜单加载UI新建一个按钮小组件作为模版 3-Pause Menu Template Button 继续做更多模版UI 4-Lose Screen(游戏失败UI) 做失败的UI 之前按钮模版的调度程序就在这起…

若依基本使用及改造记录

若依框架想必大家都了解得不少&#xff0c;不可否认这是一款及其简便易用的框架。 在某种情况下&#xff08;比如私活&#xff09;使用起来可谓是快得一匹。 在这里小兵结合自身实际使用情况&#xff0c;记录一下我对若依框架的使用和改造情况。 一、源码下载 前往码云进行…