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.pswp.cn/bicheng/19225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19225.shtml
英文地址,請注明出處:http://en.pswp.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盤無法訪…