Java 面向数据编程-DOP

2024-05-26 12:28
文章标签 java 数据 编程 面向 dop

本文主要是介绍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:

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

这篇关于Java 面向数据编程-DOP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004463

相关文章

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra