zl程序教程

您现在的位置是:首页 >  其他

当前栏目

程序=算法+数据,对象在哪儿?

2023-03-20 15:41:38 时间

如果你认可程序=算法+数据,那么会发现,对象好像没有存在的必要。

先来看看算法

按函数式编程的思路,算法就是把输入转换成输出的过程。

比如常见的各种排序算法,不管过程如何,都是把没有顺序的集合转化成有顺序的集合的过程,描述如下:

sort: List -> List

再说数据

对于数据,众说纷纭。最离谱的,是把函数当数据,没有数据组织。

下面的例子以js语言描述了这一思想。

// create_user是一个构造函数,但返回的不是对象,而是函数。
// 两个参数为:(姓名, 年龄)
let user = create_user("张三", 20)
// 通过返回函数的调用,获取属性
// 参数为属性名
let name = user("name")
let age = user("age")

create_user的实现如下:

function create_user(name, age) {
// 返回一个取属性值的函数,而非对象
return function(field_name) {
if (field_name == "name") {
return name
} else if (field_name == "age") {
return age
}
}
}

再一种,是把数据当一个个独立的集合,数据之间没有任何事先声明的关系。

关系数据库是典型的代表。例如,学生表与学生考试表,是两个完全独立的集合,没有具体关系,所谓外键,只是学生考试表的一个字段而已。学生表与学生考试表,数据举例如下:

学生表                        考试表
学号 姓名 学号 课程 成绩
001 张三 001 语文 98
002 李四 001 数学 88
002 语文 78

数据是通过sql语句,临时建立的关系。例如,下面的sql语句,通过笛卡尔乘积、筛选把两个表之间的关系建立了起来。

select * from 学生表,考试表 where 学生表.学号=考试表.学号

第三种,是各种语言都提供的结构体,把数据组织成相互关联的网状结构。

下面的例子用rust语言描述了这个想法。

struct 学生 {
name: String,
考试: Vec<考试>
}
struct 考试 {
}

还有其他一些数据组织形式,不再赘述。

无结构数据

数据除了以上各种组织形式,还有无组织的,非结构数据。比如:

  • 程序源码,程序源码是无组织的数据,这个观点很重要‼️
  • 日志文件,日志文件也是没有被组织的数据。
  • 数据传输,被传输的数据,很多都没有结构。

还有很多。

对于无结构数据,主要观点是:

  • 当流对待!

其次的观点是:

  • 把流转换成有组织的数据!

最典型的例子,把程序源码转换成AST语法树:

编译:string -> Tree

对象是啥

上面的描述过程没有对象存在。真正面向对象与数据无关,对象只接收消息,给出反馈。比如,学生对象:

let x = 一个学生
// set_name是消息名,方法参数是消息参数
x.set_name("张")
// get_name是消息名
x.get_name()

严格来看,对象不存在属性,也没有数据组织,只接收消息,给出反馈。对象自身是有状态的。发同样的消息,给出的反馈可能不同。这样的对象方式,非常难以控制。