面向数据编程 Data-Oriented Programming [1]
面向数据的编程原则
0.1 简介
面向数据的编程是一种编程范式,旨在简化以信息为中心的软件系统的设计和实施。而不是围绕着将数据和代码结合在一起的实体(如实例化的对象)来设计信息系统(例如,从类中实例化的对象) DO鼓励我们将代码与数据分开。此外,DO还提供了关于如何表示和操作数据的指南。
DO的本质是它把数据当作第一等公民。因此,在面向数据的程序中程序中,我们处理数据的方式与我们在其他程序中处理数字或字符串的方式一样简单。
Tip 在面向数据的编程中,数据是第一等公民。
通过坚持三个核心原则,将数据作为一等公民对待是可能的。本章从高层次上介绍了面向数据(DO)编程的核心原则。
面向数据(DO)编程的原则是:
- 将代码与数据分开
- 用通用数据结构表示数据实体
- 数据是不可改变的
当这三个原则结合在一起时,它们形成了一个有凝聚力的整体,如图所示 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的说明
让我来说明一下,我们如何遵循这个原则,或者在一个处理以下问题的简单程序中打破它:
- 具有firstName、lastName和他/她写了多少本书的Author实体
- 一段计算作者全名的代码
- 一段代码,根据他/她写的书的数量来确定一个作者是否多产。
正如我们前面所写的,原则#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给我们的程序带来什么好处。
面向数据编程 Data-Oriented Programming [1]相关推荐
- 面向数据编程 Data-Oriented Programming [11]
通过将代码与数据分离来降低系统复杂性 2.1简介 正如我们在第0章中提到的,面向数据编程(DO)的最大洞察力在于,我们可以通过将代码与数据分开来降低系统的复杂性.事实上,当代码与数据分离时,我们的 ...
- 面向数据编程的编程语言_面向数据科学家的10个很棒的编程项目
面向数据编程的编程语言 Practice is an essential part of learning. But in my experience learning programming, fi ...
- Python编程基础:第三十九节 面向对象编程Object Oriented Programming
第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...
- 游戏设计模式——面向数据编程思想
前言:随着软件需求的日益复杂发展,远古时期面的向过程编程思想才渐渐萌生了面向对象编程思想. 当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象,热衷于研究如何更加优雅地抽象出对象. 然 ...
- js面向数据编程(DOP)一点分享(转载)
js面向数据编程(DOP)一点分享 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...
- Java 中的面向数据编程
近年来, Amber项目为 Java 带来了许多新特性-- 局部变量类型推断. 文本块. 记录类. 封印类. 模式匹配 等等.虽然这些特性都是独立的,但也可以组合在一起使用.具体地说,记录类.封印类和 ...
- 面向数据编程,摆脱语言束缚
很多时候我们编程过多的考虑了编程语言的条条框框,编程语言提倡用什么.不提倡用什么等等.后来我发现,这样编程很累,而且容易受语言所限,扰乱总体设计. 那么,什么样的编程模型才是比较简洁又实用的呢? 想来 ...
- python, 面向对象编程Object Oriented Programming(OOP)
把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数 ...
- BioPython ② | 面向对象编程Object Oriented Programming
BioPython ② | Python面向对象编程 题目要求 定义分子类(Molecule)作为基类,包含集合elements和weight作为其属性,用初始化函数,将elements初始化为空集, ...
最新文章
- 剑指offer:面试题35. 复杂链表的复制
- C# 小数位数保留的方法集锦
- java多个数求和_Java:多个数求和
- jvm虚拟机组成部分讲解、jvm虚拟机参数使用讲解并发编程框架篇
- c语言输入的成绩由高到低该怎么,输入成绩,按照平均分从高到低输出
- 【牛客 - 283H】图论一顿套模板(思维转化,Dijkstra)
- 调用oracle常用方法,区分Oracle和SQL Server常用函数调用方法
- python判断性别程序_python 实现性别识别
- 直击平昌!2天40位大咖的平昌区块链论坛精华都在这了!
- 666的vue.mixin
- WINCE 中常见的问题收集
- qt视频教程qt入门教程嵌入式linux应用开发qt编程开发,QT项目实战教程-Qt应用项目实例开发视频教程...
- A星(A*、A Star)路径规划算法详解(附MATLAB代码)
- cs224n课后作业
- 计算机网络规划与设计
- flutter-学习之发布安卓包APK
- 鸿蒙(HarmonyOS)支持低代码开发,无需HTML知识,就可以设计复杂界面
- kera中各种accuracy的介绍
- Echars地图加散点图配置
- HTML、CSS的思维导图
热门文章
- 计算机信息处理技师选拔考试试题,江苏省机关事业单位工人技师部分工种选拔考试试卷...
- 综合评价算法的对比分析
- 用计算机技术辅助语文教学,计算机技术在语文教学中的应用初探
- Love Letter(海角七号)
- vi 和 vim 文本编辑器
- 基于Html+Css+javascript家乡风景乡村网页制作(旅游主题)无锡旅游8页含有轮播图
- 第七头驴的故事--成功的故事不见得还会再现
- 解决win10系统下QQ截图及QQ五笔截图屏幕自动放大
- 《少年的你》票房被刷爆?让我用python分析一波它好看在哪里!
- pm4py、graphviz绘图中文乱码问题