内外网逻辑隔离物理隔离_隔离域逻辑

内外网逻辑隔离物理隔离

在一个设计模式课程中,我对建模域逻辑进行了有趣的讨论。 具体来说,它是关于隔离域逻辑的 。 一个应用程序通常分为三个部分:

  1. 演示(例如桌面GUI,浏览器,Web服务)
  2. 域逻辑
  3. 基础架构(例如持久性存储,电子邮件)

该类发现有趣的是,依赖性箭头指向域逻辑部分。 他们问:“该图是否故意弄错了? 域逻辑部分不应该依赖于持久性存储吗?” 这是一个很大的问题。 我想在这里分享和发布讨论和解释。

经常被误解

大多数开发人员通常都会想到这种误解。

这种误解在很大程度上是由于操作顺序。 它通常以表示层中的触发器(例如,用户单击按钮或链接)开始,然后在域逻辑层中调用某些内容,然后在基础结构层中调用某些内容(例如,更新数据库表记录)。

尽管这正确的操作顺序,但是域逻辑层的实现方式还是有些微妙的。 这与依赖倒置有关。

依赖倒置原则

域逻辑层可能需要基础结构层提供的某些内容,例如某种从持久性存储中检索的访问形式。 通常的模式是:DAO和存储库。 在这里我不会解释这两种模式。 相反,我要指出的是,接口定义位于域逻辑层中,而其实现则位于另一个单独的层中。

将(DAO和存储库)接口定义放在域逻辑层中意味着它是由域逻辑层定义的。 它决定了需要哪种方法,以及期望哪种返回类型。 这也标志着域逻辑的边界。

接口和实现之间的分离可能是微妙的,但很关键。 仅放置接口定义就可以使域逻辑部分不受基础结构细节的影响,并允许对其进行单元测试而无需实际实现。 在单元测试期间,接口可以具有模拟实现。 这种细微的差异在快速验证(开发团队对业务规则的理解)方面有很大的不同。

这种分离是运行中经典的依赖反转原理 。 域逻辑(高级模块)不应依赖于DAO和存储库实现(低级模块)。 两者都应依赖抽象。 域逻辑定义了抽象,并且基础结构实现依赖于这些抽象。

我见过的大多数新手团队都将DAO和存储库接口以及其特定于基础结构的实现放在一起。 例如,假设我们有一个StudentRepository及其特定于JPA的实现StudentJpaRepository 。 我通常会发现新手团队将它们放在相同的程序包中。 这很好,因为应用程序仍将成功编译。 但是这种分离已经消失了,领域逻辑也不再分离。

现在,我已经解释了域逻辑部分为何以及如何不依赖于基础结构部分,我想谈一谈演示部分如何意外地与域逻辑纠缠在一起。

分开的演讲

我在新手团队中经常看到的另一件事是,他们最终如何将自己的领域逻辑与他们的演示文稿纠缠在一起。 这导致这种讨厌的循环依赖。 这种循环依赖性比物理依赖性更逻辑。 这使得检测和预防变得更加困难。

我不会在这里使用丰富的GUI演示示例,因为Martin Fowler已经在它上面写了一篇很棒的文章 。 相反,我将使用基于Web浏览器的演示作为示例。

大多数基于Web的系统都将使用Web框架进行演示。 这些框架通常实现某种形式的MVC(模型-视图-控制器)。 通常使用的模型直接来自领域逻辑部分。 不幸的是,大多数MVC框架都需要一些有关模型的知识。 在Java世界中,大多数MVC框架都要求模型遵循JavaBean约定。 具体来说,它要求模型具有公共零参数构造函数,getter和setter。 零参数构造函数和设置器用于将参数(从HTTP POST)自动绑定到模型。 吸气剂用于在视图中渲染模型。

由于演示文稿中使用的MVC框架暗含要求,因此开发人员将向其所有域实体添加公共零参数构造函数,getter和setter。 他们会证明这是必需的。 不幸的是,这妨碍了实现域逻辑。 它与演示文稿纠缠在一起。 更糟糕的是,我发现域实体被发出HTML编码的字符串(例如,具有小于和大于符号HTML编码HTML代码)和XML的代码污染了,这仅仅是因为表现形式。

如果可以将您的域实体实现为JavaBean,那么可以直接在演示文稿中使用它。 但是,如果域逻辑变得更加复杂,并且要求域实体失去其JavaBean风格(例如,不再有公共的零参数构造函数,不再有设置器),那么建议域逻辑部分实现域逻辑,并通过创建另一个JavaBean对象来满足表示部分的要求,以满足其MVC需求。

我经常使用的一个示例是用于验证用户身份的UserAccount 。 在大多数情况下,当用户希望更改密码时,也需要旧密码。 这有助于防止未经授权的密码更改。 下面的代码清楚地显示了这一点。

public class UserAccount {...public void changePassword(String oldPassword, String newPassword) {…}
}

但这并不遵循JavaBean约定。 而且,如果MVC表示框架无法与changePassword方法配合使用,那么天真的方法将是删除错误的方法并添加setPassword方法(如下所示)。 这削弱了域逻辑的隔离性,并导致团队的其他成员在各处实现它。

public class UserAccount {...public void setPassword(String password) {…}
}

对于开发人员而言,重要的是要了解表示取决于域逻辑。 而并非相反。 如果演示文稿有需求(例如JavaBean约定),则它不应具有域逻辑。 相反,演示文稿应创建具有相应域实体知识的其他类(例如JavaBean)。 但是不幸的是,我仍然看到许多团队仅仅因为表示而迫使他们的域实体看起来像JavaBeans,或者更糟的是,让域实体创建JavaBeans(例如DTO)用于表示目的。

安排提示

这是安排您的应用程序的提示。 将域实体和存储库保存在一个程序包中。 将您的存储库和其他基础结构实现保存在单独的程序包中。 将与演示文稿相关的类放在自己的程序包中。 请注意哪个程序包取决于哪个程序包。 最好将包含域逻辑的包放在所有组件的中心。 其他一切都取决于它。

使用Java时,程序包将如下所示:

  • com.acme.myapp.context1.domain.model
    • 在此处保留您的域实体,值对象和存储库(仅接口定义)
  • com.acme.myapp.context1.infrastructure.persistence.jpa
    • 将基于JPA的存储库和其他与JPA持久性相关的实现放在此处
  • com.acme.myapp.context1.infrastructure.persistence.jdbc
    • 将基于JDBC的存储库和其他与JDBC持久性相关的实现放在此处
  • com.acme.myapp.context1.presentation.web
    • 将您的Web / MVC演示组件放在此处。

请注意,我使用了context1 ,因为在给定的应用程序(或系统)中可能有多个上下文(或子系统)。 我将在以后的文章中讨论有关具有多个上下文和具有多个模型的信息。

目前为止就这样了。 我希望这个简短的解释可以为那些想知道为什么以某种方式排列和拆分代码的人提供一些启示。

感谢Juno Aliento在这个有趣的讨论中为我的课堂提供了帮助。

节日快乐!

翻译自: https://www.javacodegeeks.com/2017/01/isolating-domain-logic.html

内外网逻辑隔离物理隔离

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

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

相关文章

360安全浏览器兼容模式怎么设置_测试新手一定要知道:最实用的Web兼容性测试经验都在这...

在日常工作中,我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试,目的在于保证待测试项目在不同的操作系统平台上正常运行。主要包括待测试项目能在同一操作系统平台的不同版本上正常运行;待测试项目能与相关的其他软件或系统的“和平…

HTML 中的节点、元素、标签、标记的区别

文章目录一、HTML 节点(一)节点的类型二、HTML 标签三、HTML 元素(一)HTML 元素属性(二)HTML 元素的嵌套一、HTML 节点 节点(node)是构成我们网页的最基本的组成部分,网…

cpu占用100_Java项目服务器cpu占用100%解决办法

1、使用命令top查看cpu进程,发现tomcat占用cpu使用率过高可以看到服务器负载很高,tomcat CPU使用已达到接近300%,内存20%。2、把进程的栈dump到文件里,以便后面的分析jstack 22764 > cpu0827.log 3、看看这个进程里面哪些线程在占用cputop…

apm java_非Java专家的APM:什么泄漏?

apm java通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用! 内存,内存,内存... 内存是Java的关键部分,尤其是内存管理。 作为开发人员,内存管理不是您想…

360安全卫士电脑版_教你降服“流氓头子”正确打开360安全卫士的姿势,还你电脑流畅体验...

最近老哥家的电脑经常出问题原因是熊孩子玩儿完电脑,最后总是一堆莫名其妙的流氓软件占据桌面的半壁江山然后恢复电脑流畅运行的任务,就交到我这个“懂电脑”的人手里。如此反复两次,脾气再好的人,也想拉着熊孩子打一顿。但是活儿…

信封问题_装饰信封

信封问题有时 很多时候,我需要一个类实现通过使其他类的实例的接口。 听起来很奇怪? 让我给你看一个例子。 在Takes框架中有许多此类,它们的名称都都类似于*Wrap 。 不幸的是,这是一个方便的设计概念,在Java中看起来很…

etf基金代码大全_银行ETF最新规模首超28亿元再创历史新高,近4个月资金净流入超12亿元...

2019年即将收官,A股大盘在12月份总体有了明显的回暖,拥有低估值优势的银行板块随之明显反弹。受此利好行情催化,资金持续涌入银行ETF,其基金份额、基金规模双双连创历史新高。据上交所12月26日公布的最新数据,银行ETF&…

java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用

首先,对于具有一定C语言基础的同学来说,利用半年的时间来学习Java会有一个比较系统的学习过程,通常也能够达到实习程序员,或者是助理程序员的水平,然后在技术团队中实践一段时间之后,从事专业开发岗位应该是…

二维动画作品_「咻动画」二维动画制作中角色造型的设计要点

关于二维动画可能就算不是动画行业的小伙伴们都多多少少都有所了解,近年来其在宣传片制作上面越来越受用。不少企业抛开传统保守的宣传片表现形式转而尝试动画制作宣传片,我们都知道在动画制作从脚本策划到输出成片这个过程中是一个很复杂的制作流程&…

c# redis 如何设置过期时间_Redis 过期时间与内存管理

http://www.redis.cn/commands/expire.htmlhttp://www.redis.cn/topics/lru-cache.html内存管理 当 Redis 作为缓存使用时(此时缓存仅作为热点数据提高服务的访问性能),需要考虑内存的限制,以及如何随着业务的增长,仅保…

大端字节序码流中取出2字节_产生字节码

大端字节序码流中取出2字节在这篇文章中,我们将看到如何为我们的语言生成字节码。 到目前为止,我们已经看到了如何构建一种语言来表达我们想要的东西,如何验证该语言,如何为该语言构建编辑器,但实际上我们还不能运行代…

python写520_用Python做一个520表白神器,值得收藏

本文最后给出了打包好的软件,无需安装Python环境和各种依赖,直接下载软件,解压后,双击exe文件即可使用。先来看一下具体的效果。运行程序。用Python做一个520表白神器,值得收藏点击「选择图片」 选择JPG/JPGE/PNG三种中…

为什么java抗并发_用最通熟易懂的话说明,为什么要使用java并发编程

老早之前的计算机只有一个处理器,而 一个处理器在同一时刻只能处理一条指令 ,换句话说,我们的代码需要一行一行的按顺序被计算机执行,计算机只能把一个程序完整的执行完,然后再执行第二个程序。所以计算机专业的同学们…

不同坐标系下角速度_最伟大的数学发明,坐标系的诞生,是人类史上的方向盘...

【想要了解更多精彩文章、视频,欢迎关注创鹏科学堂】人生最大的意义,莫过于过得更方便;数学最大的意义,莫过于帮助人类过得更方便。几千年来,自从数学出现之后,它就一直以人类生活为导向,以宇宙…

php中的ol标签,html5中ol标签的用法详解

这篇文章主要介绍了详解HTML5中ol标签的用法,是HTML5入门学习中的基础知识,需要的朋友可以参考下定义和用法标签定义有序列表。HTML 4.01 与 HTML 5 之间的差异在 HTML 4.01 中,不赞成使用 "start" 属性,在 HTML 5 中是允许的。在 HTML 4.01 中…

portlet_平台策略:从Portlet到OpenSocial小工具再到渐进式Web应用程序:最新技术

portlet介绍 由于世界仍在Java的掌控之中,因此我们经常定义所谓的基于组件的平台 。 我在2000年拥有OpenUSS(开放大学支持系统)的经验。 当时我有一个想法,就是开发一个可以使用组件体系结构和J2EE技术​​( OpenUSS C…

keil5函数 默认返回值_C++ 函数的定义

“ C对于函数的基本用法”01—函数的定义//函数声明:[返回值类型] [函数名称] (参数列表)int Function(int a, int b);//函数定义int Function(int a, int b){ //函数体 return a b;}02—函数的默认参数定义函数时可以在参数列表中为形参指定默认值int Function2…

已经创建了AWS EC2实例,Linux系统默认没有root用户,那么如何创建root用户并更改为root用户登录呢?

文章目录1. 如何创建ROOT及设置密码2.更改登陆方式,采用ROOT用户登陆a. 编辑EC2实例的ssh登录方式b. 再编辑authorized_keys文件,将ssh-rsa 前面的文字全部删除,确保ssh-rsa没有任何文字,包括空格。3. 重新登陆对于刚创建AWS EC2实…

输入一个正整数求所有素数因子_一起来聊聊素数的两个性质

素数(prime number),又称质数,有无限个。定义:在大于1的自然数中,除了1和它本身以外不再有其他因数。来介绍两个简单的性质:质数的个数是无穷的。欧几里得的《几何原本》曾有一经典证明,用的是反证法。当然…