Java 面向数据编程-DOP

近年来,Java 获得了许多新的语言特性,这些特性可以独立使用,并且每个特性都很有用:类型模式(type patterns)、开关改进(switch improvements)、记录和记录模式( records and record patterns)、密封类型(sealed types)和一些其他模式。但有时,整体的效果远大于各部分之和,如果正确组合,这些特性可以对我们的日常编码产生重大影响。

1.面向对象编程(OOP)

Everything is an object.

面向对象编程(简称 OOP)可以归结为一句话。它表示一切都可以或(在 OOP 中)应该被建模为状态和行为的组合。实现它的最直接方法是创建将可变状态与操作它们的方法相结合的类。这些类通常封装它们的状态,并且经常从表示同一类型中不同类的共同特征的接口继承它们的方法的契约。

在 Java 中,这种方法无处不在,也许没有比集合 API 更明显的了。从Iterable到Collection和List,从Queue到Set以及最近的SequencedCollection和SequencedSet,接口定义契约,而具体类(如ArrayList或LinkedList、HashSet或PriorityQueue或TreeSet或ArrayDeque)则以各种方式实现它们,始终确保它们的可变状态保持隐藏,以便外部人员无法破坏它。

因此,我们经常以类似的方式设计自己的系统也就不足为奇了。在网络商店中,商品可能由接口建模Item,该接口由具体类实现,例如Book(带有 ISBN)、Furniture(带有尺寸)和ElectronicItem(带有有关连接和电池电量的附加信息)。该接口具有诸如添加至购物车、购买、运输或订单之类的方法,并且可以通过实现新类轻松地将新商品类型添加到系统中。

但是……事情往往没那么简单。虽然将所有Item的这些方法都收集起来似乎是合理的,因为它们都与购买过程交互,但添加预测低库存(与基于机器学习的预订系统交互)、注册推荐商品(另一个 ML 系统,这次用于商品建议)和购买预警(注册购买潜在危险商品)让我们怀疑所有这些操作是否真的属于同一界面。目录只能显示书籍,而 3D 公寓规划器只能处理家具,这也是有问题的 -Item现在应该获得方法tableOfContent和addToVirtualApartment,其中每个方法仅在三种Item实现中的一种中包含有意义的行为,而其他两种则抛出异常或什么都不做?或者,我们可以引入标志或进行instanceof检查,但这并不能解决一段时间后出现的另一个问题:所有这些子系统都共享项目实例,并在更改其状态时反复影响彼此,这会导致一些令人不快的错误。

不知何故,我们美丽的设计似乎被残酷的现实粉碎了。一个关键的因素是,OOP 最擅长模拟不断发展的流程,如运输时间、库存管理或推荐系统,但不太适合模拟这些流程所操作的东西——比如上面的项目。那么,我们能做什么呢?

2.面向数据编程(DOP)

面向对象将世界视为一个由相互作用的对象组成的网络,每个对象都具有内部的、通常可变的状态(可能类似于自然生态系统),而面向数据编程(简称 DOP)将其视为一个系统链,每个系统都具有潜在的变化状态,这些系统对不可变数据进行操作(类似于生产线)。对不可变数据进行操作?这听起来像函数式编程(简称 FP),事实上 DOP 与它有很多共同之处。但 DOP 还包含可以以面向对象的方式建模潜在可变的系统。

面向数据编程基于许多原则,但其确切表述尚未最终确定。Oracle Java 语言架构师 Brian Goetz 于 2022 年 6 月在其开创性文章《Java 中的面向数据编程》中写道(此处略作重新排序):

  • 数据是不可变的。
  • 对数据、整个数据以及仅对数据进行建模。
  • 使非法状态无法代表。
  • 在边界处验证。

这就是 1.0 版。在各种项目(主要是演示和业余项目,但其中一个也在生产中)中使用 DOP 大约 18 个月后,Nicolai Parlog也提出了第一个修订版本 1.1:

  • 以不可变且透明的方式建模数据。
  • 对数据、整个数据以及仅对数据进行建模。
  • 使非法状态无法代表。
  • 将操作与数据分离。

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

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

相关文章

纯正英语新闻 5.26

brutal:残暴的 apartheid:隔离 discrimination:歧视 segregation:隔离 humiliation:屈辱 unfolding:展开 shuffle forward:向前推进 justice:正义 endure:经久不…

分享几张漂亮的linux kde主题

分享几张漂亮的linux kde主题:在系统设置的全局主题内下载。

开源大模型与闭源大模型

概述 开源大模型和闭源大模型是两种常见的大模型类型,它们在以下方面存在差异: 开放性: 开源大模型:代码和模型结构是公开可用的,任何人都可以访问、修改和使用。闭源大模型:模型的代码和结构是私有的&…

求斐波那契数列第n项的值

本期介绍🍖 主要介绍:什么是斐波那契数列,递归实现求斐波那契数列第n项值,递归法为什么不适合求斐波那契数,用迭代法实现求斐波那契数列的值👀。 文章目录 1. 斐波那契数列是什么?2. 题目2. 递归…

iOS17闪退问题 *** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloa

ios升级17以后运行闪退。报错日志为*** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410 根据相关断点跟踪,具体报错位置 查看相关api发现iOS17api已经被替代。 替代方式为将UIGraphicsBegin…

9.Docker网络

文章目录 1、Docker网络简介2、常用基本命令3、网络模式对比举例3.1、bridge模式3.2、host模式3.3、none模式3.4、container模式3.5、自定义网络 1、Docker网络简介 作用: 容器间的互联和通信以及端口映射容器IP变动时候可以通过服务名直接进行网络通信而不受到影…

# 文件或目录损坏且无法读取 的解决方案

文件或目录损坏且无法读取 的解决方案 一、问题描述: windows 系统下,当对某一个文件或文件夹操作时,出现【文件或目录损坏且无法读取】,这时不管对其进行修改、删除、更改属性等操作,都不能正常进行,在 …

从0开始学统计-t检验

1.什么是t检验? t检验是一种用于比较两个样本均值之间差异是否显著的统计方法。它通常用于以下几种情况: (1)单样本 t 检验:用于检验一个样本的平均值是否与一个已知的总体平均值(或者一个假设的总体平均…

手把手教你如何使用BurpSuite

Burp Suite是什么? 概述 Burp Suite是由PortSwigger公司开发的一款综合性Web应用安全测试工具。它是安全研究人员和渗透测试人员的标准工具,用于识别和利用Web应用程序中的漏洞。Burp Suite提供了一系列强大的功能,帮助用户对Web应用进行全…

手写Zookeeper分布式锁

zookeeper版本&#xff1a;zookeeper-3.4.13&#xff0c;该版本原生api不支持递归创建节点 依赖 <dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.13</version> </depende…

深入理解Nginx try_files:用途、使用场景、注意事项和示例

Nginx 是高性能的 HTTP 和反向代理服务器&#xff0c;而 try_files 是其功能强大的模块之一。try_files 指令用于定义一组文件或 URI&#xff0c;Nginx 将依次检查这些文件或 URI&#xff0c;直到找到一个存在并可访问的文件或 URI。本文将深度解析 try_files 的用途、使用场景…

11.jenkins调整上线的脚本实现tag方式上线

jenkins调整上线的脚本实现tag方式上线 多次打标签重新提交到gitlab远程仓库-基于multi-line string parameter 修改脚本html_deploy_tar.sh #!/usr/bin/bashDate$(date %F-%H-%M) web_server"192.168.111.22 192.168.111.23" Name${Date}-${git_version} code_t…

网络模型-路由策略

一、路由策略 路由策略(Routing Policy)作用于路由&#xff0c;主要实现了路由过滤和路由属性设置等功能&#xff0c;它通过改变路由属性(包括可达性)来改变网络流量所经过的路径。目的:设备在发布、接收和引入路由信息时&#xff0c;根据实际组网需要实施一些策略&#xff0c…

Spring Boot 3.3新特性发布

Spring Boot 3.3 现已正式发布&#xff01;此版本包含大量更新&#xff0c;包括多项新功能。我们决定进行一些挑选&#xff0c;并查看最重要的变化&#xff0c;其中包括对类数据共享 (CDS) 的支持&#xff0c;以加快应用程序启动速度。 1.新的服务连接 Spring Boot 中改进或添…

MathType安装以及要点和难点

MathType是一款专业的数学公式编辑器,主要用于在文档中输入复杂的数学、物理公式和符号。以下是关于MathType的一些主要特点和功能: 1.定义设置:在MathType的“样式-定义”中,可以对数学、文本、函数、变量等不同类型进行定义。定义好之后,后续在公式编辑的时候,可以根据…

笔记89:LeetCode_135_分发糖果

前言&#xff1a; 注&#xff1a;代码随想录中没有很清楚的提起想出方法的思路&#xff0c;只是给出了解决这个问题的大致思路和代码&#xff1b;下面我将介绍一下我的思考过程&#xff0c;并贴出实现代码&#xff1b; a a a a 思考过程&#xff1a; 思路1&#xff1a;为了…

【实际项目精选源码】ehr人力资源管理系统实现案例(java,vue)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理运…

Gateway配置教程

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;它基于 Spring 5.0、Spring Boot 2.x 和 Project Reactor 等技术开发的网关&#xff0c;旨在提供一种简单、有效、统一的 API 路由管理方式。以下是 Spring Cloud Gateway 的基本配置步骤&#xff1a; 1. 添加…

Spring Boot 如何使用 AOP 防止重复提交

在 Spring Boot 中&#xff0c;可以使用 AOP&#xff08;面向切面编程&#xff09;来防止重复提交。通过 AOP&#xff0c;可以在方法调用前后添加额外的逻辑&#xff0c;而不需要修改方法本身的代码。下面是一个基于 AOP 的解决方案&#xff1a; 使用 AOP 防止重复提交 步骤&…

docker-compose Install homer

homer前言 一个非常简单的静态主页,为您的服务器保持您的服务在手,从一个简单的yaml配置文件。 前提要求 安装 docker docker-compose 参考创建一键安装homer 脚本 homer安装位置/homerhomer 脚本位置/homer/assetshomer logo 图标/home/assets/iconshomer 端口80homer 颜色…