有很多推動 object-oriented 編程的人,如果語言參雜了不是 object 的東西,就會感到渾身不對勁,有人稱他們為「OO 的基本教義派」。
這些人是有他的道理的,因為若不完全 OO,程式邏輯被強迫分成兩半, 一些程式碼使用 OO的方式思考,一些程式碼需要使用資料的方式來思考。而且有些東西不是 object ,需要付出應付非 object 的心力,造成程式複雜性較高。
對於 OO 基本教義派,以上的情況,會讓他們感到不夠乾淨、不夠完整,好像整個思考架構有了缺陷一般。
對於 OO 基本教義派,以上的情況,會讓他們感到不夠乾淨、不夠完整,好像整個思考架構有了缺陷一般。
這種純淨的堅持,導致一些純淨 OO 語言產生,如 Smalltalk 就是這種純淨的OO語言,所有看到的東西,都是 object,沒有例外。
所有東西都是 object,有邏輯一致性的優點,但卻產生效能 (Performance) 的缺點。
原本電腦對於一般的資料運算,本來就有它的格式,所有的數值運算鎮 正執行時,都是使用電腦本身既有的資料格式。
電腦原來支援的資料格式有整數、浮點數、布林等。對於這些原本的資料格式,若把它包裝成object,在執行這些資料的運算時,勢必增加資料與物件轉換額外,最後的結果就是拖慢整體運算的時間。
為要加快這種常見型態的運算速度,有一些 OO 語言選擇直接支援這些常見的資料型態,因此除支援 object外,還支援數值與布林等資料型態。這種 OO 語言就被稱為混合型的 OO 語言,Java 就是這種混合型的 OO 語言。
在Java中,這種原始電腦格式的型態稱為原生型態(Primitive Type)。
電腦原來支援的資料格式有整數、浮點數、布林等。對於這些原本的資料格式,若把它包裝成object,在執行這些資料的運算時,勢必增加資料與物件轉換額外,最後的結果就是拖慢整體運算的時間。
為要加快這種常見型態的運算速度,有一些 OO 語言選擇直接支援這些常見的資料型態,因此除支援 object外,還支援數值與布林等資料型態。這種 OO 語言就被稱為混合型的 OO 語言,Java 就是這種混合型的 OO 語言。
在Java中,這種原始電腦格式的型態稱為原生型態(Primitive Type)。
對於混合型的 OO 語言,有許多 OO 基本教義派沒辦法接受,認為這種語言簡直就是破壞 OO 的完美,也因此產生 Pure OO 與 Non-Pure OO 多年的爭論。
你有沒有感覺到一件事,就是純 OO 派的這種論述,與之前純函數式語言的論述有點相同。
函數式語言的基本教義派是什麼東西都要是函數與值,所有的東西都要沒有副作用(確保每次函數執行都會得到同一個值),若是參雜了一些命令式的東西,有人也會渾身不舒服,覺得思考架構產生缺陷。
為甚相同的感覺重複出現呢?難道這就是純潔的追求嗎?還是只是文人相輕呢?
為甚相同的感覺重複出現呢?難道這就是純潔的追求嗎?還是只是文人相輕呢?
純 Object Oriented 與不純 Object Oriented 是 OO 語言延續多年的一個大論戰,各有支持者。
那 Scala 的設計者怎麼說呢?我想,你應該知道標準答案吧!為了要支援各種應用(還是,更正確的說,要吸引各種應用的使用者),所以 Scala 兩種都支援!
那 Scala 的設計者怎麼說呢?我想,你應該知道標準答案吧!為了要支援各種應用(還是,更正確的說,要吸引各種應用的使用者),所以 Scala 兩種都支援!
「別傻了,這種問題哪裡可以兩種都支援?!」
嗯,確實是兩種都支援,只是取巧了點,也讓 compiler 辛苦了點。
怎麼說呢,在 Scala 語言中, 支援的是純 OO,所以每個東西都是 object(純 OO 的支持者,到此,可以放心了),但對於有原生型態的資料類別,會採取特別的方式。
在 compile 階段,若看到原生型態的資料類別,會直接生成 primitive 資料,而不是擴展成object,這就是它支援 pure-OO 但有混合型 OO 效能的方式。
怎麼說呢,在 Scala 語言中, 支援的是純 OO,所以每個東西都是 object(純 OO 的支持者,到此,可以放心了),但對於有原生型態的資料類別,會採取特別的方式。
在 compile 階段,若看到原生型態的資料類別,會直接生成 primitive 資料,而不是擴展成object,這就是它支援 pure-OO 但有混合型 OO 效能的方式。
你有沒有發覺,Scala的手法很一致,在爭論的兩造,都是以支援嚴格的為主,但容納另一方的優點。
Static typed 與 dynamic typed 是這樣處理,pure-OO 與 Non pure-OO 也是這樣處理。這樣,它可以爭取到兩方的支持者。
Static typed 與 dynamic typed 是這樣處理,pure-OO 與 Non pure-OO 也是這樣處理。這樣,它可以爭取到兩方的支持者。
沒有留言:
張貼留言