固执己见的框架(例如Spring Boot)的危险。 求知代码反转

我们开发人员喜欢抽象。 没有它,我们将无法构建应用程序。 我们的编程学科甚至要求我们对抽象进行编码,并避免将我们的代码耦合到详细的实现。

但是,什么是适合您的应用程序的正确抽象呢?

可悲的是,抽象的选择确实来自我们对框架的选择。 框架基本上是我们为解决问题而扩展的抽象解决方案。

不幸的是,诸如Spring Boot之类的框架对使用的线程模型,需要扩展的接口,可能的适用数据存储库以及关于问题空间的各种其他假设都持谨慎态度。 在编写第一行代码之前,这有很多限制。

我们真正想做的是首先探索问题空间。 这就是测试驱动设计的全部内容。 我们编写测试来定义什么是成功的代码。 然后,我们实现代码以通过那些测试。 在编写测试以掩盖需求的过程中,我们随后为应用程序编制了工作代码。 随着时间的流逝,我们可以获得足够的工作代码以作为应用程序发布。

所以这导致我问,我们什么时候测试框架的选择?

固执己见的框架在开发过程中过早强制抽象

好吧,我想我们会请经验丰富的资深人士来做出此选择。 因此,此选择必须正确。 不会因为以下原因:

  • 我(或我们的公司)只知道此框架,因此我们正在使用它
  • 新闪亮,带有很多流行语,我们必须使用它
  • 我的简历有点旧,让我们尝试一些新的东西
  • 这个便宜一点
  • 建筑相信它在锡上说了什么

无论出于何种原因,测试框架选择的唯一方法是使用它来构建应用程序。 而对于那些喜欢固执己见的框架(例如Spring Boot)的人,请告诉我您首先编写最冒险的方面。 这样,您可以快速发现框架的意见是否与您的问题相符。

令人遗憾的是,即使您使用最危险的方面进行测试,发现框架决策是错误的也会导致大量的代码浪费。 可以说,这浪费了企业很多钱,并可能导致项目失败。

例如,假设我们选择“ Spring Reactive”。 是的,我们可以对各种微服务进行并发异步调用。 我们还可以使用NoSQL数据存储中的最新数据。 这都是一个伟大的决定。 但是,随着时间的流逝,我们意识到我们拥有少量数据,其中数据的完整性非常重要。 我们发现我们想使用关系数据库来解决此问题,然后将JPA合并到该数据库中以便更轻松地进行交互。 但是,我们选择Spring Reactive不允许这样做,因为它要求所有I / O都是异步的(JPA是同步数据库调用)。 好的,是的,我们可以使用Scheduler,但是由于缺少事务,我似乎一直在不断地工作。 数据一致性问题开始加剧,我们错过了最后期限。 现在,我可以扔掉所有的Reactive代码,还是继续努力以希望它们都可以在一起。 我肯定需要调换职位,然后才能开始支持我们。 在下一份工作中,我学习了使用Spring Servlet解决这类问题。

这种情况的另一面也很容易发生。 我们开始是想让Spring Servlet与数据库进行JPA交互。 但是,随着时间的流逝,我们意识到数据库交互主要是只读的。 我们真正想要的是Spring Reactive的异步I / O,以同时从多个微服务和数据存储中收集数据。 不幸的是,由于我们选择了Spring Servlet,因此数据收集太慢了。 我们的工作是使用异步Servlet和生成线程来发出并发请求。 最初可以正常工作,但随着时间的推移,负载会增加。 这大大增加了线程数,导致线程调度不足,导致超时。 如果不对应用程序进行大量重写,我真的无法解决此问题。 在下一份工作中,我学会了使用Spring Reactive解决此类问题。

因此,可以不必去扔掉所有代码就能测试框架吗?

反转框架控制

依赖注入在反转控制方面走了很长一段路。 当我编写Servlet处理方法时,不再需要传入所有依赖对象。 我将通过@Inject定义依赖项,以使框架使它们可用。 随后,该框架不再规定我的实现可以依赖哪些对象。

但是,框架不仅仅是对象,还有很多其他功能。 框架将施加某种线程模型,并要求我扩展某些方法。 尽管依赖注入提供了对对象的引用,但是框架仍然必须调用对象上的方法以执行任何有用的操作。 例如,Spring一直在使方法变得灵活,但仍然通过方法所需的返回类型将您耦合到Reactive或Servlet编码。

由于我需要Spring框架来进行测试的依赖注入,因此在编写第一行代码之前,我就已经耦合到特定的Spring Servlet / Reactive抽象。 如果我弄错了,更改的前期选择可能会非常昂贵!

我真正想做的是:

  1. 为我的实现编写测试( 当然,因为我们总是受测试驱动
  2. 写我的实现
  3. 将我的实现连接在一起成为应用程序

好,前两个很简单:

  1. 编写调用传递模拟对象的方法的测试
  2. 编写方法的实现以通过测试

最后变得非常困难。 最后一个变得很困难的原因是没有一致的方法来调用每个方法。 方法具有不同的名称,不同的参数,不同的异常,可能不同的线程要求和不同的返回类型。 我们需要的是使这些方法看起来相同的方法的基础。

(耦合)控制的反转(IoC)通过ManagedFunction在方法上提供了这种外观。 ManagedFunction接口不会指示要使用的线程,需要的参数/返回类型,也不会抛出异常。 所有这些都由所包含的方法实现指定。 耦合是反向的,因此实现可指定所需的条件。

耦合的这种反转使得可以推迟框架决策。 因为我可以用一致的方式调用所有方法,所以我可以继续并开始编写实现。 这些实现可能需要响应式编码来对不同的微服务进行异步调用。 其中一些实现可能需要使用JPA写入关系数据库。 我真的不应该在开始构建系统时就在意。 我正在解决具体问题,以更好地了解实际问题空间。 我知道我的方法可以通过将框架包装在ManagedFunction中来调用。 一旦了解更多信息,我们便可以稍后确定合适的框架。

实际上,这允许实现选择框架要提​​供的适当抽象。 我的实现定义了所需的对象,所需的其他方法以及所需的线程模型。 这些实现有效地定义了从框架中需要什么抽象。

因此,它不再是框架。 允许对您的开发人员代码提出意见。

然后,这可以使您的实现对使用的最合适的框架有意见。 您不再需要基于对问题空间的模糊理解来猜测框架。 您可以看到实现需要什么抽象,并可以更明智地选择框架。

实际上,IoC已将框架的选择推迟到开发过程的后期。 这样,您可以更加自信地做出决定。 这不是敏捷所说的,将承诺推迟到最后一个负责任的时刻。

摘要

总而言之,为什么要被迫对您的应用做出太多的前期决策? 在选择框架时,您正在做出一些重要的选择来解决您的问题空间。 鉴于框架的存在,它们对您的解决方案造成了很多耦合。

相反,为什么我不能立即开始为具体问题编写解决方案并担心以后它们如何融合在一起? 当我对问题空间有更多了解时,这使我可以选择适当的抽象(以及随后的框架)。

当您被告知正确地做出决策时,(耦合)控制的反转使此功能可以将抽象和框架选择推迟到开发过程的后期。

翻译自: https://www.javacodegeeks.com/2019/05/opinionated-frameworks-inverting-opinionated-code.html

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

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

相关文章

ZigBee模块无线通信组网结构技术之Mesh拓扑网状

zigbee模块通信技术Mesh组网络拓扑包括Co-ordinator(zigbee协调器)节点和多个Router(zigbee模块无线路由)节点和Enddevice(zigbee终端)节点。网络拓扑形式与树形拓扑形式大致相同;然而,根据树形结构,网络网络拓扑是一种拓扑形式,具…

非管理型工业交换机和管理型工业交换机的区别和选择

工业交换机专门为满足灵活多变的工业应用需求而设计,提供一种高性价比工业以太网通讯解决方案。而工业交换机也分为非管理型和管理型两种。那么,非管理型工业交换机和管理型工业交换机有什么区别,我们改如何选择呢?下面就来简单介绍下。 一…

[渝粤教育] 中国科学技术大学 化学实验安全知识 参考 资料

教育 -化学实验安全知识-章节资料考试资料-中国科学技术大学【】 课前必测! 1、【单选题】本课程中课堂交流区得分占总得分的( ) A、20% B、30% C、40% D、0 参考资料【 】 2、【单选题】在综合讨论区和老师答疑区发帖时,应注意讨…

亿佰特lora模块在距离测量和定位上的应用

亿佰特lora模块http://www.ebyte.com LoRa技术是Semtech公司采用并且推广的的一种基于扩频技术的超远距离无线传输方案,属于低功耗广域网(Low Power Wide Area Network,LPWAN)通信技术中的一种。LoRa技术不再受限于传输距离和功耗…

E19系列与E10系列lora扩频技术无线模块选型指南

成都亿佰特电子科技有限公司是一家专注于无线数传通信应用的公司,在射频领域有着丰富的经验,也研发出了很多经典的产品,比如典型的E19和E10系列。 1.E19系列介绍 图1 E19系列无线模块 E19系列有433/868/915MHz射频模块,功率有1W…

工业级交换机的功率和管理功能详解

工业级PoE供电交换机的设备在为一些基于IP的终端传输数据信号的同时,还能为此类设备提供灵活,可靠的电力,最大限度地降低成本。那么,你对工业级交换机的功率和管理功能是否有所了解呢?接下来我们就跟随飞畅科技的小编一…

[渝粤教育] 信阳师范学院 视听语言 参考 资料

教育 -视听语言-章节资料考试资料-信阳师范学院【】 第1章 单元作业 第1章 单元测验 1、【多选题】人类语言的呈现形式有: A、视觉形式 B、触觉形式 C、嗅觉形式 D、听觉形式 参考资料【 】 2、【多选题】视听语言的构成要素包括: A、听觉元素 B、视觉元…

CAN总线定义和can总线无线通信特点

什么是CAN总线? CAN是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车车载产业中,出于对车载安全性、舒适性、方便性、低功耗、低成本等等的要求,各种各样的电子控制…

从Java应用程序中消除Null指针异常

这篇文章简要介绍了Java 8的最有用但“毫不费力”的功能。 程序员花了无尽的时间来尝试纠正最常见但最危险的错误之一-空指针异常。 空指针异常可能导致我们的应用程序意外中断,并且很难预先检测到。 在许多情况下,当我们使用外部库和API时&#xff0…

[渝粤教育] 南京交通职业技术学院 计算机基础 参考 资料

教育 -计算机基础-章节资料考试资料-南京交通职业技术学院【】 windows 基本操作单元作业 windows 基本操作单元测验 1、【单选题】在 Windows 界面中,当一个窗口最小化后,其位于( )。 A、菜单栏 B、标题栏 C、任务栏 D、工具栏 参考资料【 】 2、【单选题】Windows中…

工业级以太网交换机的应用领域有哪些?

由于工业环境对工业控制网络的可靠性要求非常高,要求工业以太网有很强的冗余功能,工业控制对通信的实时性要求很高,工业环境十分恶劣,往往要求工业以太网设备长时间运行在有强电磁干扰、剧烈震动、粉尘、超高温、或超低温的环境中…

无线通信模块定点传输-点对点的具体传输应用

近年来,随着射频技术、集成电路、自动控制、无线数据通讯技术的迅速发展,无线传输技术越来越多的被提及,当前的智慧城市、智慧农业、智慧工厂等都需要无线传输技术来支撑。以下主要介绍几种点对点的无线通信具体应用: 一、在油田…

[渝粤教育] 南京信息职业技术学院 模拟电子技术 参考 资料

教育 -模拟电子技术-章节资料考试资料-南京信息职业技术学院【】 随堂小测 1、【单选题】在本征半导体中,本征激发产生的载流子是( ) A、只有自由电子 B、只有空穴 C、正负离子 D、自由电子和空穴 参考资料【 】 2、【单选题】当PN结的P区加电…

基于433M频率无线通信模块在评委台的无线传输应用

1.433M频段特点 在无线电领域中,我们可以把无线电的种类按照频段来划分,如170M,315M,433M和2.4G等,本文主要以433M来介绍。 433MHZ频段的无线传输特点是:433MHZ是我们国家的免申请段发射接收频率&#xff…

工业级以太网交换机跟普通商用网络交换机有啥区别?

最近很多朋友在采购交换机的时候,对于工业级交换机跟商用网络交换机二者之间区分不是很清楚,对于具体采购哪一种类型的交换机拿不定主意,接下来杭州飞畅科技的小编来为您详细分析下二者之间的区别,帮你来快速判断适合哪种类型的交…

[渝粤教育] 南京工业职业技术大学 传感与智能控制技术 参考 资料

教育 -传感与智能控制技术-章节资料考试资料-南京工业职业技术大学【】 随堂测验 1、【单选题】下列说法错误的是 A、传感器是实现自动检测和自动控制的首要环节让物体有了触觉、味觉和嗅觉 B、传感器的功能可替代人类5大感觉器官 C、传感器是获取自然和生产领域中信息的主要途…

使用Prometheus和Grafana监视开放自由

我录制了一个视频,该视频介绍如何通过简单地配置服务器功能,使用Prometheus和Grafana向Open Liberty实例添加监视。 如果我们仅添加监视功能( monitor-1.0 ),则Open Liberty可以发出服务器内部的技术指标。 如果我们进…

无线串口模块通信技术参数快速选型指南

首先我们来说一下什么是无线串口模块?无线模块即是通过无线电信号来传输数据的软硬件模组,串口模块即是使用串口通信协议来传输数据的软硬件模组,那么无线串口模块也就是使用串口协议来进行无线电通信的软硬件模组。就以下文产品为例来介绍如…

[渝粤教育] 南京理工大学泰州科技学院 大学物理(电磁学部分) 参考 资料

教育 -大学物理(电磁学部分)-章节资料考试资料-南京理工大学泰州科技学院【】 电荷 库仑定律 1、【单选题】库仑定律的适用范围是( ) A、真空中两个带电球体间的相互作用 B、真空中任意带电体间的相互作用 C、真空中两个正点电荷间…

工业级以太网交换机与普通商用交换机相比,在性能上有哪些优势?

现如今,随着网络技术的发展,许多需要使用网络的朋友都会用到交换机,可以实现一个网络多台电脑公用。现在常用的交换机主要分为普通商用网络交换机和工业级以太网交换机,顾名思义,工业以太网交换机就是工业用的交换机&a…