PoEAA笔记-7.通盘考虑

news/2024/4/24 13:10:52/文章来源:https://blog.csdn.net/ariestse9/article/details/136518471

本文源自《PoEAA》,如预知详细内容请阅读原书

通盘考虑

        好的决策不是一成不变的。架构重构很难,人们也经常忽视它的代价,但是并非不可能。我给的建议就是:即使你对极限编程不感兴趣,你还是应该认真考虑三方面的技术实践:持续集成、测试驱动开发和重构。这些技术虽然不是万能的灵丹妙药,但他们能够帮助你在需要的时候更容易地改变你的系统。除非你比迄今为止我见过的人更能干或更走运。

8.1 从领域层开始

        这个过程可以从决定领域逻辑方法开始。主要的可选模式是事务脚本、表模块以及领域模型。
        这三种模式中最简单的事事务脚本模式。它比较符合大多数人仍然习惯的过程模型。它将每种系统事务的逻辑很好地封装在功能完善的脚本中,而且比较适合于在关系数据库之上的构建。它的主要问题是对复杂业务逻辑的支持不够,尤其不善于处理重复代码。如果你所面临的是一个简单的企业目录应用或只有简单定价结构的购物车应用等,事务脚本就足够了。但是如果业务逻辑更复杂,开发困难就会呈指数增加。
        这三种模式中最复杂的事领域模型模式。但是,如果应用比较简单,用事务脚本就足以应付,为什么还要费时劳神地用这个模式?而且,就我本人的经验而言,如果面临的问题真的非常复杂,那么处理领域模型之外,没有其他模型能做的更好。如果你已经习惯使用领域模型,那么对于简单的问题,也很容易解决。
        当然,领域模型也有其缺点。最大的缺点就是难以学会如何使用领域模型。领域模型的第二个缺点就是它于数据库的连接。
        表模块事这两个极端之间一个比较好的折中。在处理领域逻辑上,它比事务脚本强。虽然它在处理复杂领域逻辑上不如领域模型,但这对于关系数据库和其他一些东西而言,它还是游刃有余的。
        从这里我们不难看出,工具也会影响到应用到架构,有时可以根据架构来选取工具,而且,从理论上说你应该那么做。在实践中,我们必须让架构和工具相匹配。在这三种模式中工具对表模块的作用最大,好的工具支持将能使你如虎添翼。对于.Net环境来说,表模块就非常合适。

8.2 深入到数据源层

8.2.1事务脚本的数据源

        最简单的事务脚本包含其自身的数据库逻辑,但是,即使在最简单的情况下,我也会尽量避免这样做。分离数据库,使得领域逻辑和数据源逻辑这两部分的界限划分变得有意义,因此,即使是在最简单的应用里,我也会这样分离。此时,可供选择的数据库模式包括行数据入口和表数据入口。
        这两者中选择哪一个,很大程度上取决于实现平台的方便以及系统未来的发展方向。在行数据入口中,每个记录都通过显示的接口读入到一个对象中。在表数据入口中,程序员可以少写一写代码,因为他不需要写那么多存取器代码就可以读取数据,但是编程接口确实相对隐式的,这些接口依靠对记录集的访问(类似于映射)。
        最关键的决策取决于所用开发平台的其余方面。如果所用的平台包含很多支持记录集的工具,特别是UI工具和事务性的断接记录集,则选择的天平就会偏向表数据入口。
        也可以考虑工作单元,但一般来说,在脚本中跟踪变化的部分很容易。在这里,无需关心大多数并发问题,因为脚本基本上对应一个系统事务。因此,可以将整个脚本封装在单个事务中,异常一般发生在一个请求将数据读取出来编辑、而下一个请求试图对变化进行保存的情况下。这种情况下,一般使用乐观离线锁。它不但容易实现,而且可以满足用户的需求,并避免了由于挂起会话所导致的大面积加锁情况,

8.2.2表模块的数据源

        选择表模块最主要的原因是有一个好的记录集框架。此时,就需要一个与记录集配合良好的数据库映射模式,这就是表数据入口,这两个模式配合得天衣无缝。
        使用了这个模式后,在数据源层几乎不需要再加什么其他功能。比较理想的情况下,记录集中都内置了某种形式的并发控制机制,这使得它成为工作单元,从而进一步降低了开销。

8.2.3领域模型的数据源

        如果领域模型相当简单,例如只有十几个与数据库相关的类,则活动记录就可以了。如果希望耦合更松一些,则可以用表数据入口或行数据入口。做不做这种分离都不会带来太大的工作量。
        随着复杂度的进一步增加,可以考虑使用数据映射器,这种方法将确保领域模型尽可能与其他各层相互独立。但是数据映射器也是实现起来最复杂的一种模式。除非你的开发队伍非常强劲,或者能够找到一些简化映射的方法,否则我强烈建议你使用一种映射工具。

8.3 表现层

        表现层再很多方面都独立于其下层的选择。
        如果你走HTML路线,就必须决定如何组织你的应用。我建议使用模型-视图-控制器作为设计基础。
        如果你使用的是Visual Studio,最简单的方法是用页面控制器和模版视图。如果你使用的是Java,还可以考虑一些Web框架,比较流行的如Struts,它会帮助你运用前端控制器和模版视图。
        如果选择范围比较宽裕,且你的站点更多的是面向文档,那么推荐使用页面控制器,特别是当既有静态页面又有动态页面的时候。如果站点的导航机制和UI更为复杂,则可以考虑使用前端控制器。
        关于视图主要有两种选择:模版视图和转换视图。这主要取决于开发组编程时使用的是服务器页面还是XSLT。如果你开发的是一个有多种表现形式的站点,请考虑使用两步视图。

8.4 一些关于具体技术的建议

8.4.1 Java和J2EE

        无论在什么情况下使用实体Beans,都应该尽量避免给它们一个远程接口。我一直不知道首先给实体Beans定义一个远程接口的原因何在。实体Beans一般都用在领域模型或行数据入口中。无论哪种情况,它们所需要的都是细粒度的接口。但是远程接口一般都是粗粒度的,因此尽量使你的Beans本地化。

8.4.3 存储过程

        正是由于模块化和可移植性的原因,很多人在开发业务逻辑时都尽量避免使用存储过程。我比较赞同这一观点——除非有很强的性能要求。
        使用存储过程的一般方法是在表数据入口方式下控制数据库访问。

8.5 其他分层方式

Brown分层模型

BrownFowler
表现层表现层
控制层/中介层表现层(应用控制器)
领域层领域层
数据映射层数据源层(数据映射器)
数据源层数据源层

Core J2EE分层模型

Core J2EEFowler
客户层运行于客户端的表现层(例如,胖客户系统)
表现层运行于服务器端的表现层(例如,HTTP处理程序、服务器页面)
业务层领域层
集成层数据源层
资源层需要与数据源层通信的外部资源

Microsoft DNA分层模型

Microsoft DNAFowler
表现层表现层
业务层领域层
数据访问层数据源层

Marinescu分层模型

MarinescuFowler
表现层表现层
应用层表现层(应用控制器)
服务层领域层(服务层)
领域层领域层(领域模型)
持久层数据源层

Nilsson分层模型

NilssonFowler
顾客层表现层
顾客帮助层表现层(应用控制层)
应用层领域层(服务层)
领域层领域层(领域模型)
持久访问层数据源层
公共存储过程层数据源层(可能包含一些领域层)
私有存储过程层数据源层(可能包含一些领域层)

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

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

相关文章

[数据结构初阶]队列

鼠鼠我呀,今天写一个基于C语言关于队列的博客,如果有兴趣的读者老爷可以抽空看看,很希望的到各位老爷观点和点评捏! 在此今日,也祝各位小姐姐女生节快乐啊,愿笑容依旧灿烂如初阳,勇气与童真永不…

三范式与ER模型

三范式 概念: 三范式(3NF)是关系型数据库设计理论的基础,它确保数据的结构化和减少数据的冗余性。三范式由数学家E.F. Codd在1970年提出,作为关系理论的一部分。三范式包括: 第一范式(1NF&am…

Java引用传递及基本应用

在 Java 中,传递参数的方式主要有两种:值传递(传递的是对象的引用值)和引用传递。本教程将重点介绍 Java 中的引用传递以及其基本应用。 1. 引用传递概念 在 Java 中,所有的方法参数都是通过值传递的。对于对象类型的…

信号处理--卷积残差网络实现单通道脑电的睡眠分期监测

目录 背景 亮点 环境配置 数据 方法 结果 代码获取 参考文献 背景 人类大约花三分之一的时间睡觉,这使得监视睡眠成为幸福感的组成部分。 在本文中,提出了用于端到端睡眠阶段的34层深残留的Convnet架构 亮点 使用深度1D CNN残差架构&#xff0…

dolphinscheduler试用(一)(边用边修bug。。。。create tenant error)

(作者:陈玓玏) 前提:部署好了dolphinscheduler,部署篇见https://blog.csdn.net/weixin_39750084/article/details/136306890?spm1001.2014.3001.5501 官方文档见:https://dolphinscheduler.apache.org/…

python 蓝桥杯填空题

文章目录 字母数判断列名(进制问题)特殊日期大乘积星期几 字母数 由于是填空题,那么寻找的话,就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可 判断列名(进制问题) 这道题目,我们可…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。 注意:图中可能 存在负权回路…

滞销番茄变废为宝,成功打造市场份额第一番茄品牌|日本极致产品力

可果美是日本市场领先的番茄品牌,然而在可果美发展初期,番茄只是供应链中的滞销产品。可果美通过极致产品力的打造,将番茄“变废为宝”,打败亨氏、味好美成为可果美的招牌。可果美是如何做到的呢? 番茄是可果美供应链的滞销品 在…

2024年最新阿里云服务器地域选择方法,以及可用区说明

阿里云服务器地域和可用区怎么选择?地域是指云服务器所在物理数据中心的位置,地域选择就近选择,访客距离地域所在城市越近网络延迟越低,速度就越快;可用区是指同一个地域下,网络和电力相互独立的区域&#…

ps aux | grep xxxx和ps ef | grep xxxx这两个命令有什么区别

命令实例 ps aux | grep nexus和ps ef | grep nexus ps aux | grep nexus 和 ps ef | grep nexus 这两个命令都用于在 Unix 或 Linux 系统中查找与 nexus 相关的进程,但它们在展示进程信息时有细微的区别。 ps aux | grep nexus: ps aux 是一种显示系统上所有运行进…

项目经理如何应对多系统对接的项目?

对于项目经理来说,处理系统对接(API对接)的需求是一项既复杂又关键的任务。这项任务涉及到确保不同的系统能够高效、安全地共享数据,从而实现流畅的业务流程和提高整体的系统性能。下面是一个详细的指南,旨在帮助产品经…

【机器人最短路径规划问题(栅格地图)】基于模拟退火算法求解

代码获取方式:QQ:491052175 或者 私聊博主获取 基于模拟退火算法求解机器人最短路径规划问题(栅格地图)的仿真结果 仿真结果: 初始解的路径规划图 收敛曲线: 模拟退火算法求解的路径规划图 结论&#xff…

钉钉h5应用 环境报错Error: Do not support the current environment:notInDingTalk

钉钉h5应用 环境报错 Error: Do not support the current environment:notInDingTalk problem Error: Do not support the current environment:notInDingTalk reason 前端页面运行在普通浏览器 solution 需要将h5页面在后台发布后,在钉…

Ethersacn的交易数据是什么样的(2)

分析 Raw Transanction RLP(Recursive Length Prefix)是一种以太坊中用于序列化数据的编码方式。它被用于将各种数据结构转换为二进制格式,以便在以太坊中传输和存储。RLP 是一种递归的编码方式,允许对复杂的数据结构进行编码。所…

一款非常适合老中医用的《书剑中医电子处方软件简明版》

上了年纪的老中医,虽然经验丰富,但是电脑的基础都比较差,而开处方的软件通常又设计的太复杂,想用电脑开处方就非常困难,所以只好坚持手写开处方。最近,小编找到了一款非常简单的《书剑中医电子处方软件简明…

EdgeX Foundry - 导出数据到 HTTP 服务

文章目录 一、概述1.安装说明2.HTTP 服务 二、安装部署1.docker-comepse2.修改配置3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.测试 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs/edgex/device/export-ht…

20240304-使用VS2022编译blender3.6.2源代码

20240304-使用VS2022编译blender3.6.2源代码 一、软件环境 Win10 x64 22h2 JuneVS2022 v17.9.0CMake v3.24.4SVN v1.14.3GIT v2.29.2标签:win10 22h2 vs2022 blender 63335分栏:C 二、硬件环境 Win10 x64的PC台式机 三、获取源码 方法一 网盘下载…

Java并发编程-实现多线程的四种方式

创建线程的四种方式 创建线程的四种方式包括使用继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future 接口以及利用线程池。每种方式都有其特定的优势和适用场景。通过继承 Thread 类或实现 Runnable 接口,可以定义线程要执行的任务,并通过调用…

VUE前端问题

一、图表内容不显示 watch: {chartData3: {handler() {this.init();},},timeData3: {handler() {this.init();},},}, 添加上面代码可以动态监控数据,实现图表的展示。 二、背景图片报错显示不出来 解决方法: background: url(~/assets/login/e.png) …

go语言基础 -- 文件操作

基础的文件操作方法 go里面的文件操作封装在os包里面的File结构体中,要用的时候最好去查下官方文档,这里介绍下基本的文件操作。 打开关闭文件 import("os" ) func main() {// Open返回*File指针,后续的操作都通过*File对象操作…