程序=算法+數據,對象在哪兒?
如果你認可程序=算法+數據,那么會發現,對象好像沒有存在的必要。
先來看看算法
按函數式編程的思路,算法就是把輸入轉換成輸出的過程。
比如常見的各種排序算法,不管過程如何,都是把沒有順序的集合轉化成有順序的集合的過程,描述如下:
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()
嚴格來看,對象不存在屬性,也沒有數據組織,只接收消息,給出反饋。對象自身是有狀態的。發同樣的消息,給出的反饋可能不同。這樣的對象方式,非常難以控制。