面向数据编程 Data-Oriented Programming [1]

article/2025/8/17 20:20:14

RuntimeMapMaker3D-Pro在这里插入图片描述


面向数据的编程原则

0.1 简介

  面向数据的编程是一种编程范式,旨在简化以信息为中心的软件系统的设计和实施。而不是围绕着将数据和代码结合在一起的实体(如实例化的对象)来设计信息系统(例如,从类中实例化的对象) DO鼓励我们将代码与数据分开。此外,DO还提供了关于如何表示和操作数据的指南。
  DO的本质是它把数据当作第一等公民。因此,在面向数据的程序中程序中,我们处理数据的方式与我们在其他程序中处理数字或字符串的方式一样简单。

Tip 在面向数据的编程中,数据是第一等公民。

  通过坚持三个核心原则,将数据作为一等公民对待是可能的。本章从高层次上介绍了面向数据(DO)编程的核心原则。

  面向数据(DO)编程的原则是:

  1. 将代码与数据分开
  2. 用通用数据结构表示数据实体
  3. 数据是不可改变的

  当这三个原则结合在一起时,它们形成了一个有凝聚力的整体,如图所示 0.1所示,这使我们能够将数据作为一等公民来对待。因此,我们改善了我们的开发经验,使我们建立的系统更容易理解。

图0.1 面向数据的编程原则

 

TIP 在面向数据的系统中,代码与数据是分离的,数据由不可变的通用数据结构表示。

  重要的是要明白,DO原则是不分语言的。人们可以遵守它们,也可以将它们打破:

  • 面向对象语言(OO):JAVA,C#,C++…
  • 函数式编程(FP)语言:Clojure, Ocaml, Haskell…
  • 同时支持OO和FP的语言:JavaScript, Python, Ruby…

TIP DO原则是与语言无关的。

警告 对于OO开发者来说,过渡到DO可能需要比FP开发者更多的思想转变。
因为DO从一开始就引导我们摆脱将数据封装在有状态类中的习惯。

  在本章中,我们将简明扼要地说明这些原则是如何应用于或在JavaScript中被打破。我们选择JavaScript有两个原因。

  • JavaScript同时支持FP和OOP
  • JavaScript的语法很容易阅读,即使你不熟悉JavaScript,也有可能在高层次上阅读一段JavaScript代码,就像阅读伪代码一样。

  我们还将简要地提到,当我们坚持每项原则时,我们的项目会获得哪些好处,以及为了享受这些好处而必须付出的代价。
  在这一章中,我们以简单的代码片段为背景说明DO的原则。在全书中,我们将深入探讨如何在生产信息系统的背景下应用DO原则。

0.2 DO原则#1:将代码与数据分开

0.2.1原理简述

  原则#1 是一项设计原则,建议将代码和数据明确分开。

NOTE 原则1:将代码与数据分开,代码驻留在函数中,其行为不依赖于在某种程度上被封装在函数上下文中的数据。

  这条原则看起来像是函数式编程的原则,但事实上,原则1是与语言无关的。

  • 我们可以在FP中打破这一原则,将状态隐藏在一个函数的词法范围内
  • 我们可以在OO中坚持这一原则,将代码聚合为静态类的方法

  另外,原则#1并不涉及到数据的表示方式。这就是原则#2的主题。

0.2.2 原则1的说明

  让我来说明一下,我们如何遵循这个原则,或者在一个处理以下问题的简单程序中打破它:

  1. 具有firstName、lastName和他/她写了多少本书的Author实体
  2. 一段计算作者全名的代码
  3. 一段代码,根据他/她写的书的数量来确定一个作者是否多产。

  正如我们前面所写的,原则#1是与语言无关的:人们可以在FP或OOP语言中坚持它或破坏它。
  让我们开始对原则#1的探索,首先说明我们如何在OOP中破坏了这一原则。

在OOP中破坏了原则#1
  当我们写的代码将数据和代码结合在一个对象中时,我们破坏了OOP中的原则#1,就像清单0.1中那样。

清单0.1 打破OOP中的第一原则

class Author {constructor(firstName, lastName, books) {this.firstName = firstName;this.lastName = lastName;this.books = books;}fullName() {return this.firstName + " " + this.lastName;}isProlific() {return this.books > 100;}
}var obj = new Author("Isaac", "Asimov", 500); // Isaac Asimov wrote 500 books! 
obj.fullName();

在FP中破坏了原则#1

  我们也可以在没有类的情况下破坏这一原则,以FP的风格,通过编写代码将数据隐藏在函数的词法范围内,如清单0.2所示

清单0.2 在FP中的破坏原则#1

function createAuthorObject(firstName, lastName, books) {return {fullName: function() {return firstName + " " + lastName;},isProlific: function() {return books > 100;}};
}var obj = createAuthorObject("Isaac", "Asimov", 500); // Isaac Asimov wrote 500 books! 
obj.fullName();

在FP中遵守原则#1

  在看到这个原则如何在OOP和FP中被打破之后,让我们看看我们如何能遵守这个原则。
  当我们写代码时,将代码与数据分开,就像清单0.3中那样,我们在FP风格中遵守了这一原则

清单0.3 遵循FP的原则#1

function createAuthorData(firstName, lastName, books) {return {firstName: firstName,lastName: lastName,books: books};
}function fullName(data) {return data.firstName + " " + data.lastName;
}function isProlific(data) {return data.books > 100;
}var data = createAuthorData("Isaac", "Asimov", 500); // Isaac Asimov wrote 500 books! 
fullName(data);

在OOP中遵守原则#1
  我们甚至可以通过编写代码来遵守这一原则,即代码放在静态类中,而数据存储在没有函数的类中,如清单0.4。

清单0.4 在OOP中遵守原则#1

class AuthorData {constructor(firstName, lastName, books) {this.firstName = firstName;this.lastName = lastName;this.books = books;}
}class NameCalculation {static fullName(data) {return data.firstName + " " + data.lastName;}
}class AuthorRating {static isProlific(data) {return data.books > 100;}
}var data = new AuthorData("Isaac", "Asimov", 500); // Isaac Asimov wrote 500 books! 
NameCalculation.fullName(data);

  现在我们已经说明了在OOP和FP中如何遵循或打破原则#1,让我们来探讨原则#1给我们的程序带来什么好处。


http://chatgpt.dhexx.cn/article/BAAiLlAo.shtml

相关文章

ODBC API开发教程

ODBC API开发教程 作者:闻怡洋 未得到作者允许请勿转载 http://wyy.vchelp.net/ 目录 第 1 章 介绍... 2 第 2 章 ODBC API访问数据库... 2 2.1 ODBC简要介绍... 2 2.1.1 在没有ODBC以前... 2 2.1.2 ODBC介绍... 3 2.1.3 ODBC结构…

Microsoft Server 2008 空间存储 应用方法详解

2019独角兽企业重金招聘Python工程师标准>>> 刚接触2008的空间存储,资料比较少,在数据库操作中有很多不懂的地方,包括用法,语法等,经过同事的指点明白了一些,感谢大腿同事~这里只记录数据库操作…

ODBC 数据类型和API(VC)

目录 ODBC 数据类型API 函数 ODBC 数据类型 ODBC SQL 数据类型 展开显示 ODBC SQL 数据类型SQL类型标识SQL 92类型标识类型描述SQL_CHARCHAR(n)定长字符串,其长度为nSQL_VARCHARVARCHAR(n)变长字符串,最大长度为nSQL_LONGVARCHARLONG VARCHAR变长字符串,最大长度取决于数据源S…

Sql的decimal、float、double类型的区别

三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位) d…

【网络编程实践】2.3.4.2 建议关闭 Nagle 算法

Nagle算法主要是避免发送小的数据包,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组。 Nagle算法的目的:避免发送大量的小包,网络上每次只能一个小包存在,在小包被确认之前…

Nagle算法与TCP_CORK,TCP_NODELAY,TCP_QUICKACK

1. Nagel算法 TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一…

如何关闭和启用Nagle算法

如果各位读者在搜索如何关闭的话,那么我有理由相信各位对想要解决的问题已经算是比较清楚了,废话不多数。 什么是nagle算法,它是干嘛用的,请自行google or 百度 Step1 Open regredit 快捷键:winr 打开&#xff1a…

19- TCP 协议(Nagle)

前面我们所用的 unp/protocol/tools/winclient/echo_cli.cpp 程序的特别之处是它总会发送一个小分组(TCP 段,只有 41 字节)到服务器。这样的小分组在英文中称为 tinygram,在网络状态好的情况下,比如局域网中&#xff0…

TCP Nagle算法详解

转: http://bbs.chinaunix.net/thread-3767363-1-1.html 在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个…

TCP之延时Nagle算法实验详解

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MS…

Nagle Algorithm

转: http://bbs.chinaunix.NET/thread-3767363-1-1.html 在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这…

TCP中的Nagle算法

TCP中的Nagle算法 一. Nagel算法 TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认.为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据.(在一个连接中会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数…

确认应答、Nagle算法和延时确认应答

目录 确认应答 延时确认应答 Nagle算法 确认应答 TCP在传输数据的时候,每次接受方收到来自发送方的数据包后,接受方对都会发送一个确认应答(ACK)报文作为回应,发送方收到来自接受方的确认应答(ACK)报文,就表明发送的数据已经被…

TCP/IP卷一:80---TCP数据流与窗口管理之(延时确认(延迟ACK)、Nagle算法)

一、延迟确认(延迟ACK) 在许多情况下,TCP并不对每个到来的数据包都返回ACK,利用TCP的累积ACK字段(参见TCP报文格式https://blog.csdn.net/qq_41453285/article/details/104016416)就能实现该功能累积确认可…

禁用 Nagle 算法

有没有发现一个很奇怪的组合,即 Nagle 算法和延时 ACK 的组合。这个组合为什么奇怪呢? 我举一个例子你来体会一下。比如,客户端分两次将一个请求发送出去,由于请求的第一部分的报文未被确认,Nagle 算法开始起作用&…

TCP Nagle算法及示例

TCP nagle算法是说,一个TCP连接只允许有一个未被确认的小数据包,如果有小数据包未被确认,其他要发送的小数据包先被缓存起来,等收到确认后, 把这些数据包再一块发送出去。注意算法中说的是小数据包,也就是n…

TCP-IP详解:Nagle算法

参考书籍:TCP/IP详解,卷1:协议 Small Packet Problem 在使用一些协议通讯的时候,比如Telnet,会有一个字节字节的发送的情景,每次发送一个字节的有用数据,就会产生41个字节长的分组&#xff0c…

TCP-Nagle:代码版本重新解释Nagle算法

开年来的第一份工作,就是在最新的内核上打补丁。 可没想到Nagle算法也被我冲进了去年的垃圾桶里。 在网上找了一些资料,理论很快被消化,但看了看内核的实现,久久没能动弹。坐了一天,才摸索出来点什么,觉得…

Nagle算法原理与实现详解

文章目录 背景Nagle算法详解算法实现实现开启与关闭Nagle算法 Nagle算法与延迟ACK参考 背景 TCP的数据流大致可以被分成两类: 交互式数据流 TCP交互数据流指的是:TCP连接中传输的所有数据的总和,包括控制命令(用于管理网络中连接…

TCP详解 (三)Nagle算法和延迟确认

文章目录 延迟确认Nagle算法Nagle算法遇上延迟确认关闭Nagle算法 一些有关TCP通信量的研究如[Caceresetal.1991]发现,如果按照分组数量计算,约有一半的TCP报文段包含成块数据(如 FTP、电子邮件和 Usenet新闻),另一半则…