Java面向数据编程1.1版本

近年来,Java 获得了许多新的语言特性:类型模式、switch改进、记录record和记录records模式、密封sealed 类型和一些其他模式。

有时,整体的效果远大于各部分之和,如果正确组合,这些特性可以对我们的日常编码产生重大影响。

过去:面向对象编程
面向对象编程(简称 OOP)可以归结为一句话。它表示一切都可以或(在 OOP 中)应该被建模为状态和行为的组合。实现它的最直接方法是创建将可变状态与操作它们的方法相结合的类。

在 Java 中,OOP这种方法无处不在

因此,我们经常以类似的方式设计自己的系统也就不足为奇了:

在网店中,物品可以用 Item 接口来建模:

  • 该接口由图书(有 ISBN)、家具(有尺寸)和 ElectronicItem(有连接和电池电量的附加信息)等具体类来实现。

  • 该接口有添加到购物车、购买、发货或重新订购等方法。

通过实现新的类,可以很容易地将新的物品类型添加到系统中。

但是......事情往往没那么简单:
虽然将所有这些方法都集中在 Item 上似乎是合理的,因为它们都与购买流程交互,但增加了 predictLowStock(与基于机器学习的预购系统交互)、registerForRecommendations(另一个 ML 系统,这次是物品建议)和 reportPurchase(登记潜在危险物品的购买),让我们怀疑所有这些操作是否真的属于同一个接口。

banq注:这是不同上下文场景的方式,放在Item一个类或接口中肯定不对,如同学生借书,将借书这个动作建模在学生这个类或接口一样,借书时一种具体场景。因此,这里指责面向对象缺点不是OOP本身问题,而是很多人没有意识到场景、上下文BC、界限上下文这个概念的存在,如同在 scope 、 生命周期等都属于上下文概念。

同样有问题的是:

  • 书籍只能显示目录

  • 而 3D 公寓规划器只能处理家具--Item 现在是否应该获得 tableOfContent 和 addToVirtualApartment 方法?

  • 或者,我们可以引入标志或进行 instanceof 检查,

但这并不能解决一段时间后出现的另一个问题:

  • 所有这些子系统都共享 item 实例,

  • 在改变其状态时会反复踩到对方的脚趾,从而导致一些令人不快的 bug。

banq注:这是语言中共享可变状态的问题,而在Rust中避免可变共享状态作为语言的默认已经成功:Rust为何无法成为超级语言? 

不知何故,我们感觉美丽的设计被丑陋的现实打碎了。其中一个关键因素是,OOP 最擅长为不断发展的流程建模,如发货时间、库存管理或推荐系统,但却不太适合为这些流程所运行的事物建模,如上述项目。那么,我们能做些什么呢?

面向数据编程(Data-Oriented Programming:DOP)

  • 面向对象将世界视为一个由相互作用的对象组成的网络,每个对象都具有内部的、通常可变的状态(可能类似于自然生态系统),
  • 而面向数据编程(简称 DOP)将其视为一个系统链,每个系统都具有潜在的变化状态,这些系统对不可变数据进行操作(类似于生产线)。

对不可变数据进行操作?这听起来像函数式编程(简称 FP),事实上 DOP 与它有很多共同之处。但 DOP 还包含可以以面向对象的方式建模的潜在可变系统。

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

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

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

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

在接下来的几周内,我们将分别就这四个原则发表一篇文章,并以第六篇文章结束本系列,该文章将面向数据编程置于面向对象和函数式编程的环境中,并就何时何地使用它提供一些指导。

文章系列

  • Java 中的面向数据编程 - 版本 1.1(本文)
  • 不可变且透明地建模数据 - DOP v1.1(即将推出)
  • 对数据、整个数据以及仅对数据进行建模 - DOP v1.1(即将推出)
  • 使非法状态无法表示 - DOP v1.1(即将推出)
  • 将操作与数据分离 - DOP v1.1(即将推出)
  • 完成 DOP v1.1(即将推出)

原文点击标题:

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

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

相关文章

Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数

1、进程控制几个过程 创建进程--》执行进程---》终止进程 2、进程标识 (1)专用进程:ID为0的进程是调度进程,常常被称为交换进程,也称为系统进程; ID为1通常是init进程,在自举结束时由内核调用…

链动3+1模式:深度解析与优势探讨

在数字化营销领域,链动模式因其强大的裂变能力和高效的引流机制而备受瞩目。其中,链动21模式一度是商家们的首选,但随着时间的推移,其存在的问题也逐渐显现:预留小号和较低的复购率成为制约其进一步发展的瓶颈。为了解…

map优化多个if

原代码如下,多个按钮的点击操作,其中val是操作的按钮的标志 const operationConst {INSTALLAPP: installApp,STOPAPP: stopApp,HOME: home,CLEAR: clear...... } function moreOperation(val, list) {selectedList list && list.length 0 ?…

最新!2023年台湾10米DEM地形瓦片数据

上次更新谷歌倾斜摄影转换生成OSGB瓦片V1.1版本,使用该版本生产了台北、台中、桃园三个地方的倾斜摄影OSGB数据,在OSGB可视化软件中进行展示,可视化效果和加载效率俱佳。已经很久没更新地形瓦片数据,主要是热点地区的原始数据没有…

使用 AlarmManager 结合广播接收器来实现定时检查

使用 AlarmManager 结合广播接收器来实现定时检查。这种方式在特定时间点触发广播,然后在广播接收器中检查时间。这样可以避免持续的轮询检查减少对系统资源的消耗。 以下是一个示例代码: 创建一个 BroadcastReceiver 用于接收 AlarmManager 的广播。在…

算法的时间复杂度(详解)

前言: 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果 一、算法效率 1.1 如何衡量一个算法的好坏 如何衡…

3.Linux系统环境搭建

一、虚拟化机:指的是通过虚拟化技术将一台计算机分为多台逻辑计算机。注:虚拟机共用CPU和内存资源。 二、虚拟机用途: 1.搭建学习环境:例如在同一间实验室里,物理机Windows系统,虚拟机可以用Linux系统。 …

汇舟问卷:国外问卷调一天900

大家好,我是汇舟问卷,专注于国外问卷调查互联网项目。夏天已经来临,您是否在三伏天顶着大太阳上班,汗水浸湿了衣襟,却依然要面对繁琐的工作和无尽的压力? 在这个炎热的季节里,我们都渴望找到一…

什么是React?

01 Why React? What is React? I think the one-line description of React on its home page (https://react.dev/) is concise and accurate: “A JavaScript library for building user interfaces.” 我认为React主页(https://react.dev/)上的一行描述既简洁又准确: …

ch3运输层--计算机网络期末复习(持续更新中)

运输层位于网络层之上 运输层协议提供的某些服务受到网络层协议的限制。比如,时限和带宽保证。 运输层也提供自己的特殊服务。比如,可靠数据传输服务,安全性服务。 网络层:两个主机之间的逻辑通信 运输层:两个进程之间的逻辑通信 网络地址:主机的标识(IP地址) 传输地址: …

vmware中Ubuntu虚拟机和本地电脑Win10互相ping通

初始状态 使用vmware17版本安装的Ubuntu的20版本,安装之后什么配置都要不懂,然后进行下述配置。 初始的时候是NAT,没动的. 设置 点击右键编辑“属性” 常规选择“启用”: 高级选择全部: 打开网络配置,右键属…

玄机平台应急响应—Linux入侵排查

1、前言 这篇文章主要说一下linux的入侵排查,也就是说当你的服务器已经被入侵的时候,该如何去排查使其恢复正常。下面是排查的步骤,但是实际情况往往更为复杂,需要进一步来分析,而不是无脑的按照步骤来敲就完事了。 …

HAL库使用FreeRTOS实时操作系统时配置时基源(TimeBase Source)

需要另外的定时器,用systic的时候生成项目会有警告 https://blog.51cto.com/u_16213579/10967728

同比和环比

1、概述 同比和环比是两种常见的数据分析方法,用于衡量数据在不同时间段的变化情况。通过同比和环比的计算,可以更清晰地了解数据在不同时间段的增长或下降情况,从而为决策提供依据。 2、同比 同比(Year-on-Year, YoY&#xff09…

05-28 周二 TTFT, ITL, TGS 计算过程以及LLama2推理代码调试过程

05-28 周二 LLama2推理代码调试过程 时间版本修改人描述2024年5月28日15:03:49V0.1宋全恒新建文档 简介 本文主要用于求解大模型推理过程中的几个指标: 主要是TTFT,ITL, TGS 代码片段 import osdata_dir "/workspace/models/" m…

获取 Excel 单元格的条件格式是否成立及其改变后的属性(如背景颜色)

获取 Excel 单元格的条件格式是否成立及其改变后的属性(如背景颜色),直接通过 VSTO API 是有挑战的,因为条件格式的实际应用效果在 Excel 的内部逻辑中,并不直接暴露给外部 API。尽管如此,可以通过一些工作…

unity中的常用属性修饰符

unity中的常用属性修饰符 一、前言二、常用修饰符三、结语 一、前言 在做unity开发编辑脚本的时候经常会用到属性修饰符,使开发调试更加便捷。初学者见过最多的莫过于[Header("标题文本")]了吧,除此之外其实还有很多,这篇文章列举说…

MFC工控项目实例一主菜单制作

1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称:密封压力试验机 主菜单名称: 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…

sdbusplus:通过文件描述符传递数据

有的时候需要传递大量的数据,如果将数据通过dbus传递,会消耗大量的带宽。可以通过传递一个文件描述符替代传递数据: 以下的service通过文件描述符接收数据: //fd_service.cpp #include <sdbusplus/asio/connection.hpp> #include <sdbusplus/asio/object_server…

U盘无法打开?数据恢复与预防措施全解析

在日常生活和工作中&#xff0c;U盘已成为我们存储和传输数据的重要工具。然而&#xff0c;有时我们会遇到U盘无法打开的情况&#xff0c;这无疑给我们带来了诸多不便。本文将深入探讨U盘打不开的现象、原因及解决方案&#xff0c;并分享如何预防此类问题的发生。 一、U盘无法访…